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®…
…hasta que le encuentras la vuelta
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 porpandoc
, a partir del cual se emite el PDF víalualatex
. La línea en blanco al final de ese bloque es clave.Como anticipé, fue necesario incluir las librerías
newunicodechar
yfontspec
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ónRenderer
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…