La orden pdftex --version devuelve tres números encadenados: pdfTeX 3.141592653-2.6-1.40.26. El primero no pertenece a pdfTeX: es el TeX de Knuth sorprendido a mitad de su convergencia hacia π, y tanto XeTeX como LuaTeX arrastran las mismas cifras. pdfTeX es ese mismo TeX con una sola adición: escribe PDF directamente. Es lo que realmente se ejecuta al teclear pdflatex, y sigue siendo el motor por omisión de LaTeX. Esta página explica por qué lo sigue siendo, cómo se resuelven las fuentes mediante métricas TFM y ficheros map —un diseño antiguo— y cuál es la aportación propia de pdfTeX: la microtipografía que activa microtype, es decir, la protrusión de caracteres y la dilatación de glifos. Todo lo que sigue procede de ejecuciones reales sobre TeX Live 2024.
La diferencia entre pdflatex, latex y pdftex
Los tres son el mismo ejecutable. En el directorio bin de TeX Live 2024, pdflatex y latex son enlaces simbólicos a pdftex; también lo son amstex y csplain. Lo único que cambia es el formato que se carga al arrancar. Un formato es un fichero .fmt con un juego de macros ya expandido y congelado; la línea pdflatex pdftex ... *pdflatex.ini de fmtutil.cnf dice: si se invoca con el nombre pdflatex, ejecuta el motor pdftex cargando las macros de LaTeX. Motor (el programa) y formato (el sistema de órdenes) son, pues, ejes distintos, y «pdfLaTeX» no es más que el nombre de la combinación motor pdfTeX + formato LaTeX.
$ readlink $(which pdflatex) latex amstex
pdftex
pdftex
pdftex
$ grep -E '^(latex|pdflatex|pdftex) ' $(kpsewhich fmtutil.cnf)
latex pdftex language.dat -translate-file=cp227.tcx *latex.ini
pdflatex pdftex language.dat -translate-file=cp227.tcx *pdflatex.ini
pdftex pdftex language.def -translate-file=cp227.tcx *pdfetex.iniDe esa tabla se desprenden dos cosas más. Primera: la orden latex no es «el TeX antiguo» en absoluto, sino pdfTeX en modo DVI. Al ejecutarla el encabezado dice This is pdfTeX, ... (preloaded format=latex) y lo que sale es un .dvi. Segunda: el formato pdftex se construye a partir de pdfetex.ini, donde la e es e-TeX, el conjunto de extensiones —\protected, \unexpanded, el espacio ampliado de registros, \middle— que el LaTeX moderno da por supuestas. Si se comprueba en los tres motores si \eTeXversion está definido, pdfTeX, XeTeX y LuaTeX responden que sí. e-TeX dejó de ser opcional hace mucho. \pdftexversion, en cambio, solo existe en pdfTeX, y por eso los paquetes lo usan para reconocer el motor sobre el que corren.
Escribir PDF directamente y volver a DVI con \pdfoutput=0
Un único parámetro entero decide el formato de salida: \pdfoutput. Un valor positivo da PDF; 0, el DVI clásico. El TeX original de Knuth solo emitía DVI (device independent) y dejaba la conversión a PostScript o PDF en manos de otro programa; pdfTeX integró ese paso justo después del constructor de páginas, pero nunca clausuró la salida DVI. Los paquetes que dependen de \special de PostScript, PSTricks en primer lugar, aún necesitan a veces la ruta DVI → PS → PDF, y \pdfoutput=0 es lo que la mantiene abierta.
La trampa está en el lugar. \pdfoutput debe fijarse antes de que se expida la primera página; si se cambia después, pdfTeX se detiene con ! pdfTeX error (setup): \pdfoutput can only be changed before anything is written to the output. y a continuación ! ==> Fatal error occurred, no output PDF file produced!. No sobrevive ni el PDF ni el DVI. Como LaTeX detecta el controlador muy pronto, el sitio seguro es el principio del fichero, antes de \documentclass.
% Force DVI output even when the file is compiled with pdflatex.
% This line must come before \documentclass.
\pdfoutput=0
\documentclass{article}
\begin{document}
This run writes a .dvi file, not a .pdf.
\end{document}Qué hace realmente microtype: protrusión y dilatación
Esa única línea \usepackage{microtype} activa dos mecanismos independientes. En el .log aparecen uno junto a otro: Package microtype Info: Character protrusion enabled (level 2). y Package microtype Info: Automatic font expansion enabled (level 2), stretch: 20, shrink: 20, step: 1. El primero es la protrusión, o interletraje de margen: los puntos y guiones de final de línea sobresalen ligeramente de la caja de texto, de modo que un borde mecánicamente alineado se ve ópticamente recto —una generalización de la vieja puntuación colgada—. El segundo es la dilatación de glifos: las formas pueden estirarse o estrecharse en horizontal hasta un 2 % (20/1000), y ese margen se incorpora a la propia decisión de corte de línea. Los espacios entre palabras se igualan y los «ríos» blancos que bajan por el párrafo adelgazan con ellos.
Ninguna de las dos ideas nació en TeX. Ambas se remontan al hz-program, el motor de composición que el diseñador de tipos Hermann Zapf desarrolló desde 1988 con Peter Karow y otros en URW, en Hamburgo, buscando una página de gris uniforme, sin agujeros ni ríos. URW lo patentó (patente europea EP 0466953; los derechos caducaron en julio de 2010) y los algoritmos acabaron en Adobe, que los incorporó a InDesign. Pero la misma idea siguió un segundo camino: el vietnamita Hàn Thế Thành analizó hz y lo implementó en TeX como trabajo doctoral en la Facultad de Informática de la Universidad Masaryk de Brno —la tesis Micro-typographic extensions to the TeX typesetting system, octubre de 2000, dirigida por Jiří Zlatuška—. Una idea, dos destinos: la cima del mercado comercial y una implementación libre que cualquiera puede ejecutar. \usepackage{microtype} es la segunda.
\documentclass{article}
\usepackage{microtype} % protrusion + expansion, sensible defaults
\begin{document}
With microtype loaded, pdfTeX nudges punctuation into the margin
and flexes glyph widths by a hair, so justified text looks far
more even. Nothing else in the document has to change.
\end{document}También se pueden manejar ambos desde las primitivas en crudo. Del lado de la protrusión: \pdfprotrudechars (0 desactivado, 1 activado, 2 reflejado además en el cálculo de anchuras) junto con \lpcode y \rpcode, que fijan la cantidad por carácter en el borde izquierdo y derecho. Del lado de la dilatación: \pdfadjustspacing (=2 integra el juego en el corte de línea), \efcode para la disposición de cada carácter a estirarse y \pdffontexpand para declarar las instancias dilatadas de una fuente. En la práctica casi nunca se tocan: microtype trae un fichero de configuración por familia (mt-cmr.cfg para Computer Modern) y elige los valores. Aun así conviene conocer los nombres: hacen legibles los avisos del registro.
| Primitiva | Función | Qué controla |
|---|---|---|
\pdfprotrudechars | protrusion | 0 desactivado, 1 activado, 2 afecta también al cálculo de anchuras |
\lpcode / \rpcode | protrusion | saliente por carácter en el borde izquierdo/derecho (por mil) |
\pdfadjustspacing | expansion | =2 integra el juego en la decisión de corte |
\efcode | expansion | disposición de cada carácter a estirarse; no existe en XeTeX |
\pdffontexpand | expansion | declara las instancias dilatadas de una fuente |
Las fuentes se resuelven mediante métricas TFM y ficheros map
pdfTeX obtiene las métricas y las formas de los glifos de dos sitios distintos. Las métricas vienen de un .tfm (TeX Font Metric): kpsewhich cmr10.tfm devuelve fonts/tfm/public/cm/cmr10.tfm, y ese fichero solo guarda anchura, altura, profundidad de cada carácter y una tabla de interletraje; ni un solo contorno. Solo cuando la composición ha terminado y hay que armar el PDF se consulta el fichero map y se lee la fuente real allí nombrada (un .pfb Type 1 o una TrueType). La entrada de cmr10 ocupa una línea: cmr10 CMR10 <cmr10.pfb —nombre TFM, nombre PostScript y < con el sentido de «incrusta este fichero»—. El pdftex.map que genera updmap en TeX Live 2024 tiene 45 443 líneas; ese único fichero de texto es la tabla de correspondencias de todas las fuentes de la distribución.
$ kpsewhich cmr10.tfm cmr10.pfb
/usr/local/texlive/2024/texmf-dist/fonts/tfm/public/cm/cmr10.tfm
/usr/local/texlive/2024/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb
$ grep -m1 '^cmr10 ' $(kpsewhich pdftex.map)
cmr10 CMR10 <cmr10.pfb
# The same one-line document, compiled by three engines:
$ pdffonts min-pdflatex.pdf
INJFRF+CMR10 Type 1 Builtin yes yes yes
$ pdffonts min-xelatex.pdf
HOLJOD+LMRoman10-Regular-Identity-H CID Type 0C Identity-H yes yes yes
$ pdffonts min-lualatex.pdf
YIRABR+LMRoman10-Regular CID Type 0C Identity-H yes yes yesComponga el mismo documento de una línea con los tres motores y pase pdffonts: la diferencia de diseño aparece tal cual en la salida. pdfLaTeX incrusta CMR10 como Type 1; XeLaTeX y LuaLaTeX incrustan LMRoman10-Regular como CID Type 0C. La página parece Computer Modern en ambos casos, pero el camino recorrido y el fichero incrustado no tienen nada que ver. Los ficheros map se pueden ampliar desde el documento con \pdfmapfile y \pdfmapline; y, cosa curiosa, ambas primitivas siguen existiendo en XeTeX. El legado de la era de 8 bits sobrevive más de lo que se supondría.
El techo de 8 bits: ! Bad character code y por qué fontspec se niega
256 caracteres por fuente. Ese es el techo más duro de pdfTeX. Escriba \font\x=cmr10 \x \char"1234 y se detiene con ! Bad character code (4660).. Dele la misma entrada a LuaTeX y no ocurre nada: sus fuentes son anchas internamente. Ese muro de 256 posiciones es la razón de que las letras latinas acentuadas deban reempaquetarse en una codificación de fuente como T1, y de que las letras griegas y los símbolos se desplacen a otras fuentes. Visto el techo, queda claro para qué sirve realmente fontenc.
El malentendido está del lado de la entrada. Un fuente en UTF-8 compila con LaTeX moderno sin cargar inputenc: desde 2018 es lo predeterminado. Ahora bien, solo compila el conjunto de caracteres que LaTeX ha declarado. Un .tex con → pasa por pdflatex sin quejas; ponga 日 y obtendrá ! LaTeX Error: Unicode character 日 (U+65E5) not set up for use with LaTeX.. La limitación de pdfTeX no es «no lee UTF-8» sino «solo compone los caracteres previstos». Y no hay manera de nombrar una fuente OpenType instalada en el sistema: al cargar fontspec la ejecución muere de inmediato con ! Fatal Package fontspec Error: The fontspec package requires either XeTeX or LuaTeX.. Estos tres hechos —256 posiciones, solo caracteres declarados, sin fuentes del sistema— explican casi todas las migraciones a XeTeX o LuaTeX.
- Razones para quedarse: compatibilidad con plantillas existentes, rapidez y treinta años de rodaje. Para un artículo mayoritariamente en inglés,
pdflatexes la opción con menos sorpresas. - Razones para irse: Unicode multilingüe, fuentes del sistema, composición japonesa, procesamiento con Lua. Si de verdad hace falta alguna, cambiar de motor sale mejor que apilar apaños.
- El accidente habitual: cargar
fontspecsin salir de pdfLaTeX.fontspecpertenece a XeLaTeX y LuaLaTeX. - El otro accidente: poner
\pdfoutputdespués de\documentclass. La ejecución muere sin dejar ni PDF ni DVI.
Imágenes: PNG, JPEG y PDF directamente, EPS convertido por usted
pdfTeX lee tres formatos de imagen directamente —PNG, JPEG y PDF— a través de la primitiva de bajo nivel \pdfximage, sobre la que se apoya a diario \includegraphics de graphicx. Solo el EPS debe convertirse antes a PDF, y hasta eso es ya automático: con el escape de shell restringido que TeX Live activa por omisión, \includegraphics{fig.eps} llama en silencio a repstopdf, deja un fig-eps-converted-to.pdf junto al fichero e incrusta ese. Aquí está la trampa. Si se ejecuta con -no-shell-escape no hay conversión, y tampoco hay error ni aviso. En su lugar se compone un marco vacío con el nombre del fichero impreso dentro, y el PDF sale perfectamente válido. Así es como desaparecen las figuras en integración continua.
Como es él quien escribe el PDF, pdfTeX ofrece además primitivas que alcanzan las prestaciones del formato. \pdfliteral inyecta operadores de dibujo PDF en crudo; \pdfobj crea un objeto PDF; \pdfannot coloca una anotación: un enlace, un campo de formulario. Los enlaces y marcadores de hyperref se apoyan en esa capa. Para ajustes de documento existen \pdfinfo, que escribe metadatos como título y autor, \pdfcompresslevel, que fija la intensidad de compresión, y \pdfpageattr, que adjunta atributos a cada página.
\pdfinfo{
/Title (My Report)
/Author (A. Author)
}
\pdfcompresslevel=9
% a thin rule drawn with a raw PDF operator
\pdfliteral{0 0 m 100 0 l 0.4 w S}| Primitiva | Papel en pdfTeX | Escritura en LuaTeX |
|---|---|---|
\pdfoutput | elige salida PDF o DVI | \outputmode |
\pdfliteral | inyecta operadores de dibujo PDF en crudo | \pdfextension literal |
\pdfobj / \pdfannot | crea un objeto o una anotación PDF | \pdfextension obj / annot |
\pdfinfo | escribe metadatos como el título y el autor | \pdfextension info |
\pdfcompresslevel | nivel de compresión del PDF (0–9) | \pdfvariable compresslevel |
\pdfximage | lee una imagen PNG / JPEG / PDF | \saveimageresource |
\pdfsavepos | registra la posición actual en la página | \savepos |
\pdfprotrudechars | activa la protrusión | \protrudechars |
\pdfadjustspacing | activa la dilatación de glifos | \adjustspacing |
Qué dejaron las primitivas \pdf... de pdfTeX en los motores posteriores
LuaTeX se construyó sobre pdfTeX y heredó casi toda su maquinaria, pero el desbordado espacio de nombres \pdf... se ordenó. Buena parte pasa ahora por tres ventanillas —\pdfextension, \pdfvariable y \pdffeedback— que reciben una palabra clave y sus argumentos. \pdfliteral pasó a ser \pdfextension literal; \pdfoutput, \outputmode; \pdfximage, \saveimageresource; y \pdfprotrudechars / \pdfadjustspacing, \protrudechars / \adjustspacing. En cambio, \lpcode, \rpcode y \efcode conservaron su nombre. El conocimiento de la época de pdfTeX se traslada casi íntegro; lo único que cambia es la ortografía.
XeTeX heredó solo una parte, y esa herencia parcial tiene consecuencias prácticas. Al sondear las primitivas una a una en TeX Live 2024 se ve que XeTeX tiene \lpcode y \rpcode pero no tiene \efcode; su interruptor de protrusión tampoco es \pdfprotrudechars sino uno con otro nombre, \XeTeXprotrudechars. Así que bajo XeLaTeX la protrusión funciona mientras que la dilatación no puede implementarse en absoluto, y pedirla de forma explícita con \usepackage[expansion=true]{microtype} detiene la ejecución: ! Package microtype Error: Font expansion does not work with xetex.. Si se carga microtype sin opciones, la línea sobre la dilatación desaparece del registro sin comentario alguno; de ahí la impresión extendida de que «hace menos» bajo XeLaTeX, sin saber por qué.
Cuándo pdflatex sigue siendo la elección correcta
Si el documento es mayoritariamente en inglés, si la revista o los coautores ya han fijado la plantilla y la fecha límite aprieta: pdfLaTeX. Sobre un mismo documento matemático de 417 páginas, cronometrado en esta máquina, pdfLaTeX resultó el más rápido de los tres motores, y además es el que menos tropieza con un paquete existente. Pide poco: una línea \usepackage{microtype}, figuras en PNG / JPEG / PDF y, si se depende de EPS, no desactivar el escape de shell. A la inversa, apilar apaños sobre pdfTeX para un documento que necesita japonés o fuentes del sistema es mal negocio; pasado ese punto, el trabajo corresponde a XeLaTeX o LuaLaTeX. pdfTeX se encuentra hoy en buena medida en modo mantenimiento y el desarrollo nuevo se ha trasladado a LuaTeX, pero esas 45 443 líneas de pdftex.map y treinta años de plantillas acumuladas no se van a ninguna parte.