Cuaderno de GNUtas

Superíndices y subíndices reales y falsos en LuaTeX

Las propiedades OpenType etiquetadas como SUPS y SUBS permiten a las fuentes representar los superíndices y los subíndices reales, respectivamente, mediante glifos diseñados a tal efecto, sin necesidad de delegar en las triquiñuelas de escalado y posición del software editor de turno. La ventaja tipográfica es evidente, por la legibilidad y consistencia que ganará el texto si se emplean letras dibujadas ad hoc y no las recicladas o sintetizadas. Siempre que se pueda, por tanto, recomiendo usar esta opción.

contraste_superindices.png

Figura 1: Superíndices reales (arriba) y sintetizados (abajo) en la fuente Linux Libertine

En LuaLaTeX y en XeLaTeX, el imprescindible paquete fontspec permite aplicar ambas propiedades mediante las opciones VerticalPosition=Superior y VerticalPosition=Inferior. Por formato directo podemos hacer, por ejemplo, esto cada vez que necesitemos colocar un superíndice:

... palabreja{\addfontfeature{VerticalPosition=Superior}34}

o, mejor, definir un comando para usar a costa del habitual \textsuperscript{}:

\def\misup#1{{\addfontfeature{VerticalPosition=Superior}#1}}

...

palabreja\misup{34}

Inevitablemente, se producirían unas cuantas inconsistencias: sin ir más lejos con las marcas de notas al pie, que seguirían siendo glifos escalados. Habría que tomarse la molestia de redefinirlas. Por suerte, contamos con otro paquete indispensable, realscripts, que nos dispensa de todo eso. Si cargamos este paquete en nuestro preámbulo después de fontspec, se ocupará de aplicar la propiedad OpenType necesaria allí donde haya un superíndice o un subíndice. Además ofrece un par de opciones a los comandos nativos de LaTeX \textsuperscript y \textsubscript. Las versiones con un asterisco (\textsuperscript* y \textsubscript*) producirán los «antiguos» glifos escalados; las que no llevan asterisco nos darán los glifos OpenType.

Sin embargo, conviene andarse con ojo en un detalle. La variedad de superíndices y subíndices auténticos que ofrecen las fuentes puede ser muy diversa, y son más bien pocas las que están dotadas de un juego completo de caracteres alfanuméricos básico. No digamos ya si precisamos para esas posiciones signos de naturaleza más exótica. De ello se desprende una obligación (acaso un deber) para todo compositor tipográfico que se precie: conocer a fondo la fuente con que se va a componer, sus virtudes, sus defectos y sus limitaciones. Por ejemplo, la fuente Old Standard (que yo uso bastante) sólo dispone de caracteres numéricos para superíndices y subíndices, de forma que si escribimos algo como

... palabreja\textsuperscript{abcd1234}

nos toparemos con esto tras compilar:

palabreja.png

Figura 2: La fuente Old Standard sólo dispone de caracteres numéricos para los superíndices OpenType

Así que tendríamos que ir alternando entre las versiones con o sin asterisco de los comandos de turno, lo cual —admitámoslo— es una lata. Pero si estamos en el maravilloso LuaTeX podemos salir del paso fácilmente con un poco de código Lua que nos haga el apaño.

Empecemos ensayando una sencilla función para ejecutar en el pre-procesado, y que actúe sólo sobre caracteres alfabéticos en el contexto necesario (téngase en cuenta que el ejemplo que sigue es para los superíndices):

\usepackage{realscripts}
 \usepackage{luacode}

 %% Código Lua
 \begin{luacode}
  function cambiar_superindice ( super )
  super = string.gsub ( super, "\\textsuperscript{%a+}",   "\\textsuperscript*{%0}" )
    return super
  end
 \end{luacode}

Es decir, cuando el comando \textsuperscript encierra uno o más caracteres alfabéticos (clase %a), se le añadirá el asterisco para que se genere el superíndice a la manera «antigua», escalada. Sólo queda definir un comando para LaTeX que active la función Lua de manera global en todo el documento:

\newcommand\superalfabet{\directlua{luatexbase.add_to_callback
     ( "process_input_buffer" , cambiar_superindice , "cambiar_superindice" )}}

Ahora bien, encontraremos que esto nos trae un par de inconvenientes. A saber:

  1. Sólo nos serviría en caso de que nuestro texto contenga superíndices con caracteres numéricos y alfabéticos claramente separados. Si ambos se mezclasen impredeciblemente en un sólo superíndice, entonces la función Lua que hemos definido arriba no sería la idónea.
  2. Y, lo más importante, está el inconveniente esencialmente tipográfico, ya que perderemos consistencia cuando aprezcan superíndices reales y falsos desperdigados aquí y allá en nuestro documento. Probablemente sea necesario hacer algunos ajustes de escalado y posición (según la fuente) para intentar igualar el aspecto lo más posible. Y aun así, quedará por valorar si nos compensa un apaño de este tipo.

Por último, ¿qué ocurriría si nuestros superíndices cobijan arbitrariamente tanto letras como números? Pues habría que dar algo más de vueltas, pero la solución se presume igualmente sencilla en LuaTeX. O, al menos, el remiendo.

En primer lugar, definiríamos un comando para escalar y posicionar los caracteres alfabéticos, en lugar de usar \textsuperscript (los valores de escalado y posición intentan adaptarse a Old Standard. Para este ejemplo al vuelo usamos puntos, una medida absoluta. Para trabajar a varios cuerpos de letra sería más conveniente usar una medida relativa, como em o, mejor, ex):

 \def\alfasup#1{%
{\addfontfeature{Scale=0.65}
   \raisebox{2.7pt}{#1}}}

A continuación, una función en Lua que encierra uno o más caracteres alfabéticos en el comando anterior:

\begin{luacode}

   function letrasup ( letra )
   letra = string.gsub ( letra, "%a+", "\\alfasup{%0}" )
   tex.print(letra)
   end

 \end{luacode}

Defino, entonces, un comando LaTeX cuyo argumento es la aplicación de la función Lua:

\newcommand{\letrasup}[1]{{\directlua{letrasup([[#1]])}}}

Para terminar, redefinimos \textsuperscript añadiendo el comando previo, de manera que cualquier carácter alfabético dentro del argumento de \textsuperscript se convierta en un superíndice «falso», aunque razonablemente normalizado con los verdaderos. A juzgar por el resultado (fig. 3), y aunque los valores de escalado y posición siempre se puedan ajustar y limar un poco más, quedaría por ver de nuevo si la argucia nos compensa. Es decir, si preferimos el mal menor o el mal mayor (ergo, usar superíndices únicamente falsos en esta fuente), pero coherentemente unificado.

super_falsos_verdaderos.png

Figura 3: Nuestros superíndices impostores y a continuación los verdaderos en la fuente Old Standard

Publicado: 01/08/2019

Última actualización: 01/08/2019


Índice general

Acerca de...

Esta obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial 4.0 Internacional.

© Juan Manuel Macías
Creado con esmero en
GNU Emacs