Fuentes OTF en LaTeX y pandoc

Posted on 2025-01-20 by Ernesto Hernández-Novich
Tags: ,

Las fuentes estándar de LaTeX son superlativas, desde su diseño y confección, para cumplir su propósito. Las fuentes adicionales distribuidas con TeX Live son igual de espectaculares. La mente WYSIWYG no está preparada para comprenderlo.

Puede faltar vocabulario, gramática, redacción, o substancia, pero nunca falta un pajúo que monta una guerra santa porque «necesita» una fuente ajena a LaTeX para cumplir con una éstetica. Usualmente se presentan con una fuente TrueType. Cuando son particularmente competentes, se presentan con una fuente OpenType.

Siempre es posible aptovechar ualquier fuente OpenType en un sistema Debian GNU/Linux reciente, para que funcione en un usuario regular. A efectos de esta guía, usaré la fuente Quicksand.

Para mi ambiente de escritorio personal

Personalmente uso GNOME y ocasionalmente XFCE. Para cualquiera de los dos, lo único que hay que hacer es poner todos los archivos .otf en el directorio ~/.fonts.

Descargué Quicksand.zip conteniendo todos los .otf relevantes, lo exploté dentro de mi directorio ~/.fonts.

$ cd .fonts
$ unzip  ~/Downloads/quicksand.zip '*.otf'
Archive:  /home/emhn/Downloads/quicksand.zip
  inflating: Quicksand-Light.otf     
  inflating: Quicksand-LightItalic.otf  
  inflating: Quicksand-Regular.otf   
  inflating: Quicksand-Italic.otf    
  inflating: Quicksand-Bold.otf      
  inflating: Quicksand-BoldItalic.otf  
  inflating: Quicksand_Dash.otf    

quedando listos para usar en el ambiente de escritorio

$ fc-list Quicksand
/home/emhn/.fonts/Quicksand-Bold.otf: Quicksand:style=Bold
/home/emhn/.fonts/Quicksand-LightItalic.otf: Quicksand:style=Light Italic
/home/emhn/.fonts/Quicksand_Dash.otf: Quicksand,Quicksand Dash:style=Dash,Regular
/home/emhn/.fonts/Quicksand-BoldItalic.otf: Quicksand:style=Bold Italic
/usr/share/fonts/truetype/quicksand/Quicksand-Bold.ttf: Quicksand:style=Bold
/home/emhn/.fonts/Quicksand-Regular.otf: Quicksand:style=Regular
/home/emhn/.fonts/Quicksand-Light.otf: Quicksand:style=Light
/usr/share/fonts/truetype/quicksand/Quicksand-Regular.ttf: Quicksand:style=Regular
/home/emhn/.fonts/Quicksand-Italic.otf: Quicksand:style=Italic

Se pueden usar en LibreOffice, GIMP, etc. hasta que no sea necesario, en cuyo caso basta

$ rm ~/.fonts/Quicksand-*

para desinstalarlos de mi espacio de usuario.

En MacOSX y Windows debe ser mucho más fácil, dicen.

Para mi ambiente TeX Live

En un sistema Debian GNU/Linux moderno, instalar TeX Live con para soportar inglés y español, se reduce a

# apt install texlive texlive-latex-extra texlive-lang-spanish texlive-lang-english

En MacOSX y Windows debe ser mucho más fácil, dicen.

TeX Live logra los resultados tipográficos que logra, gracias a que sus fuentes están representadas con más y mejor información que la que un simple .ttf u .otf contienen. Entonces, es necesario calcular toda la información adicional, y hacerla accesible a TeX Live.

Transformando el OTF a lo que TeX Live necesita

Siguiendo la tradición Unix, TeX Live permite separar los recursos que vienen con el sistema (los paquetes que instalamos más arriba), los recursos que el administrador agregó para todos los usuarios, y los recursos que un usuario particular quiere tener en su espacio privado.

Para mi usuario en particular

$ kpsewhich -var-value=TEXMFHOME
/home/emhn/texmf
$ mkdir -p /home/emhn/texmf/fonts

es necesario que exista el directorio de configuración local, con el subdirectorio para las fuentes. Aquí se pueden agregar todo tipo de fuentes para que TeX Live las aproveche, pero solamente accesibles a mi usuario.

El paquete

# apt install lcdf-typetools

incluye varias herramientas que asisten en la instalación de fuentes Type 1 u OpenType. Por razones históricas, que pueden estudiar a fondo en la documentación de TeX, el proceso de instalación de un conjunto de fuentes con un nombre particular, requiere tres pasos fundamentales:

  1. Extraer la información contenida en los archivos .otf y calcular la información adicional necesaria para TeX, depositando los resultados en la estuctura local.

    $ autoinst autoinst .fonts/Quicksand-Regular.otf \
                        .fonts/Quicksand-Bold.otf    \
                        .fonts/Quicksand-Italic.otf  \
                        .fonts/Quicksand-BoldItalic.otf 
    autoinst, version 20220124
    [INFO]      Generating fonts for Quicksand: 16 of 16
    [INFO]      Done generating fonts!
                Please update TeX's databases (by calling 'texhash' and 'updmap'
                or their equivalents on your system) before using these fonts.

    El resultado será la creación (o actualización) de la jerarquía de archivos bajo ~/texmf/fonts/, correspondiente a la información precalculada.

     $ tree texmf/fonts/
     texmf/fonts/
     ├── enc
     │   └── dvips
     │       └── Quicksand
     │           ├── a_7cn7o3.enc
     │           ├── a_bjndht.enc
     │           ├── a_u7nade.enc
     │           └── a_vftv2o.enc
     ├── map
     │   └── dvips
     │       └── Quicksand
     │           └── Quicksand.map
     ├── tfm
     │   └── lcdftools
     │       └── Quicksand
     │           ├── Quicksand-Regular-tlf-ly1--base.tfm
     │           ├── Quicksand-Regular-tlf-ly1--lcdfj.tfm
     │           ├── Quicksand-Regular-tlf-ly1.tfm
     │           ├── Quicksand-Regular-tlf-ot1--base.tfm
     │           ├── Quicksand-Regular-tlf-ot1--lcdfj.tfm
     │           ├── Quicksand-Regular-tlf-ot1.tfm
     │           ├── Quicksand-Regular-tlf-t1--base.tfm
     │           ├── Quicksand-Regular-tlf-t1--lcdfj.tfm
     │           ├── Quicksand-Regular-tlf-t1.tfm
     │           ├── Quicksand-Regular-tlf-ts1--base.tfm
     │           └── Quicksand-Regular-tlf-ts1.tfm
     ├── type1
     │   └── lcdftools
     │       └── Quicksand
     │           ├── Quicksand-RegularLCDFJ.pfb
     │           └── Quicksand-Regular.pfb
     └── vf
         └── lcdftools
             └── Quicksand
                 ├── Quicksand-Regular-tlf-ly1.vf
                 ├── Quicksand-Regular-tlf-ot1.vf
                 ├── Quicksand-Regular-tlf-t1.vf
                 └── Quicksand-Regular-tlf-ts1.vf

    Es crucial calcular la información usando todos los archivos .otf de la misma familia que se pretende usar, de manera que la herramienta pueda construir el mapa unificado, en este caso Quicksand.map.

    Es posible procesar sólo un subconjunto de los archivos otf y luego «refrescarlo» agregando o eliminando según lo que se desea utilizar. Como mínimo es necesario incluir las fuentes regular, negrita, e itálica. La herramienta autoinst extraerá todo lo que sea posible y pertinente para TeX, incluyendo símbolos matemáticos, «small caps», y decoraciones.

  2. Refrescar la lista de archivos en la instalación local usando texhash, tal como sugirió la corrida de autoinst, pero para la instalación privada del usuario

    $ texhash ~/texmf
    texhash: Updating /home/emhn/texmf/ls-R...
    texhash: Done.
  3. Incorporar el mapa recién creado al conjunto de mapas disponible para TeX Live, tal como sugirió la corrida de autoinst. Para que el mapa solamente sea tomado en cuenta en la instalación TeX Live de mi usuario

    $ updmap-user --enable Map=Quicksand.map

    El comando produce una cantidad importante de información que permite determinar los mapas que están siendo actualizados y las características que pudieron ser extraídas para la fuente. El elemento clave a considerar es que la corrida de updmap-user va a tomar todos los mapas globales del sistema (lo que viene con los paquetes) y la combinará con el nuevo mapa, creando un mapa unificado local bajo el directorio ~/.texlive2022/ personal.

    Este mapa unificado tiene precedencia sobre el mapa del sistema: si se actualizan los paquetes del sistema, o se instalan paquetes del sistema con fuentes adicionales, es necesario correr updmap-user para integrarlos nuevamente.

Completados estos pasos, se habrán generado automáticamente los archivos

$ tree texmf/tex/latex/Quicksand/
texmf/tex/latex/Quicksand/
├── LY1Quicksand-TLF.fd
├── OT1Quicksand-TLF.fd
├── Quicksand.sty
├── T1Quicksand-TLF.fd
└── TS1Quicksand-TLF.fd

esto es:

  1. Todos los archivos .fd (font definition) relevantes para todos los tipos de codificación posibles (OT1, T1, LY1, TS1) según la información del OpenType. Es decir, si la fuente tiene menos o más métricas, habrá menos o más archivos. En el pasado, uno tenía que escribir estos archivos manualmente.

  2. Un archivo de estilo LaTeX que define la familia de fuentes, incluyendo todas las variantes (negritas, itálicas, etc.) posibles según los OpenType incluidos.

Solamente resta usarlos en un documento LaTeX y generar el PDF. Independientemente del método utilizado, los comandos de formato (\texbf, \textit, etc.) sacarán provecho de la fuente instalada.

XeLaTeX

En escenarios en los cuales se puede usar XeLaTeX

# apt install texlive-xelatex

crear un documento LaTeX cuyo preámbulo contenga

\usepackage{fontspec}
\setmainfont{Quicksand-Regular.otf}[
  Path = /home/emhn/.fonts/,
  BoldFont = Quicksand-Bold.otf,
  ItalicFont = Quicksand-Italic.otf,
  BoldItalicFont = Quicksand-BoldItalic.otf]

y procesarlo con xelatex.

En efecto, XeLaTex no necesita toda la información bajo ~/texmf y puede usar fuentes TrueType, pero es notablemente más lento en la construcción de documentos, y no todos los paquetes LaTeX funcionan para manipular la geometría de las fuentes o meta-información para PDF.

No uso xelatex, pero lo incluyo en la receta porque hay mucha gente que usa OverLeaf a la que le puede servir.

LuaLaTex

En escenarios en los cuales se puede usar LuaLaTeX

# apt install texlive-luatex

crear un documento LaTeX cuyo preámbulo contenga

\documentclass[12pt]{article}
\usepackage{fontspec}
\setmainfont{Quicksand-Regular.otf}[
  Path = /home/emhn/.fonts/,
  BoldFont = Quicksand-Bold.otf,
  ItalicFont = Quicksand-Italic.otf,
  BoldItalicFont = Quicksand-BoldItalic.otf]

y procesarlo con lualatex.

Aplican los mismos comentarios que con XeLaTeX, siendo LuaLaTeX aún más lento que XeLaTeX.

PDFLaTeX

Este es el que prefiero por «razones»: la generación es más rápida, hago cosas con TikZ que no funcionan del todo bien en XeLaTeX ni LuaLaTex, y tengo mejor control cuando necesito múltiples fuentes en el mismo documento.

Gracias al trabajo de autoinst, basta crear un documento cuyo preámbulo contenga

\usepackage[utf8]{inputenc}
\usepackage[OT1]{fontenc}
\usepackage{mweights}
\usepackage[mainfont]{Quicksand}

y procesarlo con pdflatex.

Para usarlo con pandoc

Hoy en día, me resulta mucho más eficiente escribir artículos, libros, o documentos simples, usando Markdown extendido con fragmentos LaTeX, para luego procesarlos con pandoc hast generar el PDF final. La invocación de pandoc permite seleccionar el procesador PDF final, pero el preámbulo LaTeX es diferente en cada caso. Mi solución preferida es tener un archivo con el preámbulo particular para cada caso, e.g. cuando quiero usar lualatex como generador porque necesito emojis

$ pandoc --include-in-header=lualatex-header.tex \
         --pdf-engine=lualatex -o doc.pdf doc.markdown

donde lualatex-header.tex contiene la definición de la fuente discutida más arriba.

…y está en mi ambiente personal

Los fuentes están bajo ~/.fonts, mientras que la configuración de LaTeX y TeX Live está bajo ~/texmf/ y ~/.texlive2022. No necesito cooperación del administrador del sistema para que la generación de PDF saque provecho de las fuentes. Además, basta respaldar mi directorio personal para que la configuración sea portable de una máquina a otra. Y cuando actualizo mi sistema de una versión Debian a la siguiente, sólo tengo que repetir los pasos 2 y 3 de la generación de fuentes.

En MacOSX y Windows debe ser mucho más fácil, dicen.