La lunotipia. Tipografía digital, TeX y cafeína

Representar gráficamente la línea base, la altura «x» y la altura de las mayúsculas con LuaTeX

Puede haber ocasiones en que necesitemos representar gráficamente ciertas rejillas de escritura en nuestro texto, como por ejemplo el trazo de las líneas base. En el ecosistema TEX hay muchas y variadas formas de lograr esto, si bien he encontrado una especialmente sencilla para LuaTEX mediante una simple función en Lua anclada al callback que recoge los procesos destinados a actuar justo después del corte de líneas (post_line_break_filter). En el ejemplo que vamos a ver no sólo dibujaremos la línea base sino también la línea de la altura «x» de la fuente actual y la línea de la altura de las mayúsculas, cada una en un color. Y, posteriormente, definiremos un entorno que tenga como argumentos obligatorios el cuerpo de letra e interlineado y como argumento opcional la familia de la fuente a representar. Vamos a necesitar tikz y xcolor, así como fontspec para la definición de fuentes y xparse para facilitar nustra definición del entorno, de modo que procedemos a cargarlos sin demora:

\usepackage{tikz,xcolor}
\usepackage{xparse}
\usepackage{fontspec}

A continuación definiremos un par de comandos, por comodidad, para la altura «x» y para la altura de la mayúsculas. Este último, tal vez y dependiendo de la fuente, haya que redefinirlo al vuelo. La altura «x», naturalmente, siempre será el valor de 1ex:

\newcommand{\alturax}{1ex}
\newcommand{\alturamay}{1.6ex}

Y nos queda por definir una caja, donde encerrar el contenido gráfico:

\newbox\rejillas

Le toca el turno a nuestra función en Lua para post_line_break_filter. La podemos incluir simplemente dentro de la primitiva directlua:

\directlua{
rejilla = function(head)
      for linea in node.traverse_id(node.id("hlist"), head) do
      node.insert_after(linea.list, node.tail(linea.list),node.copy(tex.box.rejillas))
      end
         return head
end
}

Y, finalmente, nuestro entorno, definido con la siempre cómoda sintaxis de xparse (recordemos que nuestro argumento opcional será la familia de la fuente):

\NewDocumentEnvironment{rejilla}{o m m}{%
\IfNoValueF{#1}{\fontspec{#1}}
\fontsize{#2}{#3}\selectfont
\setbox\rejillas=\hbox{%
\fontsize{#2}{#3}\selectfont
  \begin{tikzpicture}[overlay]
  \draw[teal!60] ((-\textwidth,\alturamay) -- ++(\textwidth,0);
  \draw[red!60] ((-\textwidth,\alturax) -- ++(\textwidth,0);
  \draw[black!35] ((-\textwidth,0) -- ++(\textwidth,0);
\end{tikzpicture}}
\directlua{luatexbase.add_to_callback("post_linebreak_filter", rejilla, "rejilla")}
}
{%
\normalfont\par%
\directlua{luatexbase.remove_from_callback("post_linebreak_filter", "rejilla")}
}

Unos ejemplos de uso (el resultado de la compilación en fig. 1):

Adobe Garamond + Minio Pro + Sabon

\begin{rejilla}{20pt}{24pt}
  {\fontspec{Adobe Garamond}Lorem ipsum}
  {\fontspec{Minion Pro}Lorem ipsum}
  {\fontspec{Sabon LT Std}Lorem ipsum}
\end{rejilla}

\bigskip

\renewcommand{\alturamay}{1.5ex}

TeX Gyre Pagella

\begin{rejilla}[TeX Gyre Pagella]{20pt}{24pt}
  Lorem ipsum dolor sit amet

  LOREM IPSUM DOLOR SIT AMET
\end{rejilla}

\bigskip

Optima

\begin{rejilla}[Optima LT Std]{20pt}{24pt}
  Lorem ipsum dolor sit amet

  LOREM IPSUM DOLOR SIT AMET
\end{rejilla}

rejilla.png

Figura 1: Varios ejemplos con la representación gráfica de la línea base, la altura «x» y la altura de mayúsculas

Publicado: 22/01/22

Última actualización: 22/01/22


Í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