Hace años que escribo la mayoría de mis documentos usando pandoc porque es una de esas herramientas tan poderosas, que no usarlas es incivilizado. Aparte está escrita en Haskell, lo cual lo hace civilizado con título.

En general, edito el documento con vim usando las extensiones para Markdown. Casi siempre es puro texto. De vez en cuando hay que hacer alguna curiosidad usando LaTeX para insertar una fórmula matemática o TiKZ/PGF para programar diagramas.

En esta ocasión, quise insertar varios Emojis acompañando el texto y Nunca es Fácil®...

El documento tiene emojis insertados de manera literal. Nada de entidades UTF, escapes XML, ni nombres largos. En mi caso, se trata de un documento que tiene que contener las entidades

  • ⬛ (U+02B1B)
  • 🟨 (U+1F7E8)
  • 🟩 (U+1F7E9)

Acostumbro usar pdflatex para generar los PDF finales vía LaTeX. La plantilla «estándar» es razonable, y no existe ninguna aplicación en el planeta con mejor tipografía que LaTeX.

Supuse que bastaba con agregar el plugin para Emojis, así que intenté

$ pandoc -o doc.pdf -f markdown+emoji doc.mdwn
! Package inputenc Error: Unicode character ⬛ (U+2B1B)
(inputenc)                not set up for use with LaTeX.
...

para que pandoc tradujera Markdown a LaTeX, y luego invocara pdflatex para generar el documento. Fallo miserablemente indicando que la entidad UTF-8 arriba mencionada no está «preparada» para su utilización en pdflatex.

Usualmente, basta con agregar un par de líneas al preámbulo LaTeX de la plantilla .tex que usa pandoc... pero cuando me disponía a hacerlo, supe que no iba a funcionar: dos de las tres entidades UTF-8 están por encima de 65535, y en consecuencia no pueden estar en ninguno de los fonts soportados por pdflatex (si no lo sabías desde 2003, ahora lo sabes).

Hasta aquí me trajo pdflatex.

Las entidades funcionan perfectamente en el terminal, porque tengo instalado el paquete Debian fonts-noto-color-emoji que provee una fuente, disponible para todas mis aplicaciones

$ fc-match Emoji
NotoColorEmoji.ttf: "Noto Color Emoji" "Regular"

El emulador de terminal tilix tiene una fuente diferente diseñada para escribir y programar, y al mismo tiempo sabe sustituir las entidades faltantes usando esa fuente. Por eso puedo manipular cualquier Emoji en la pantalla, en cualquier aplicaciones basada en texto.

Es posible usar generadores PDF alternativos con pandoc. Hay alternativas que hacen toda suerte de peripecias generando páginas HTML y simulando «navegadores» para imprimirlas, sacrificando control de los tipos de letra. Primitivo.

Quedan dos alternativas razonables: xelatex y lualatex. Independientemente de cuál escogiera, era seguro que necesitaría escribir una definición de fuente alternativa usando TeX fontenc y probablemente las definiciones para las entidades Unicode con TeX newunicodechar.

Después de 15 minutos intentando con xelatex, lo único que recibí fue un error críptico indicando que la fuente Noto Color Emoji no estaba disponible. Resulta que xelatex no soporta fuentes que incluyan especificación de colores. No vale la pena tenerlo, porque ya le conozco las mañas a pdflatex, así que

# apt purge texlive-xetex

Al final tuve éxito con lualatex

# apt install texlive-luatex

combinado con la flexibilidad de pandoc y la experiencia LaTeX.

Cualquier documento procesable con pandoc puede incluir un preámbulo en formato YAML. Ahí se indican cosas como título, autor, fecha, además de otras directivas para configurar las extensiones Markdown que uno necesite emplear. En versiones recientes de pandoc es posible agregar pedazos de código LaTeX que sean incorporados en el preámbulo.

Tuve que agregar lo siguiente en el preámbulo:

---
title: El título
subtitle: El subtítulo
header-includes: |
    \usepackage{newunicodechar}
    \usepackage{fontspec}
    \newcommand{\emoji}[1]{
      {\setmainfont{Noto Color Emoji}[Renderer=Harfbuzz]{#1}}
    }
    \newunicodechar{⬛}{{\emoji ⬛}}
    \newunicodechar{🟨}{{\emoji 🟨}}
    \newunicodechar{🟩}{{\emoji 🟩}}

colorlinks: true
---
  • Todo lo que está en el bloque header-includes irá a parar al preámbulo del archivo LaTeX intermedio generado por pandoc, a partir del cual se emite el PDF vía lualatex. La línea en blanco al final de ese bloque es clave.

  • Como anticipé, fue necesario incluir las librerías newunicodechar y fontspec de LaTeX.

  • Definí el comando LaTeX \emoji de un argumento, para cambiar a la fuente específica para Emojis, activo solamente para mostrar el parámetro único. En el segundo intento tuve que agregar la opción Renderer pues se trata de una fuente TTF que no tiene contorno (fc-cache me lo dijo pero no presté atención).

  • Definí sustituciones para cada una de las entidades literales de manera que al ser encontradas en el texto, se reemplacen por la invocación al comando \emoji previamente definido.

Enseguida, pude generar el documento PDF con

$ pandoc -o doc.pdf --pdf-engine=lualatex -f markdown+emoji doc.mdwn

y los Emojis aparecieron. Más aún, los Emojis se adaptan bastante bien cuando son usados en espacio proporcional, pero en espacio fijo generan unos blancos espurios a su alrededor...