Escribes latex y no aparece ningún PDF. Nada está roto: la orden más antigua de LaTeX escribe DVI, no PDF, y todo lo que viene después es tarea de un conversor DVI: dvipdfmx, dvips, dvisvgm. El formato viene de lejos; el fuente de DVItype, de Knuth, deja constancia de que el primer programa DVItype lo diseñó David Fuchs en 1979, más de una década antes de que existiera el PDF. Aun así, la ruta en dos pasos sobrevive en una época en que pdflatex produce PDF directamente, y sobrevive por razones muy concretas. Esta página explica qué consume y qué emite cada conversor de TeX Live 2024, por qué la cadena japonesa uplatex → dvipdfmx sigue siendo la estándar, y cómo leer los errores que aparecen en el paso de conversión.
Por qué pasar por DVI si existe pdflatex
DVI —device independent— es un formato intermedio que solo lleva instrucciones: coloca este carácter de esta fuente en esta posición de esta página. No incrusta archivos de fuente ni sabe de color ni de imágenes. Esa ligereza es justamente el objetivo. TeX se concentra en la composición y delega en un conversor todo lo que depende del dispositivo de salida; una decisión de diseño de 1979 es la que hoy sigue abriendo la salida hacia PostScript, PDF y SVG. Así que DVI no sobrevive solo por compatibilidad. pdflatex únicamente escribe PDF, mientras que un archivo DVI se bifurca en tres direcciones. Además, la familia PSTricks funciona con instrucciones \special que presuponen un intérprete PostScript en algún punto de la cadena, y latex → dvips es la manera directa de proporcionárselo. Y los motores japoneses de la familia pTeX ni siquiera tienen una implementación que escriba PDF directamente.
dvipdfmx, xdvipdfmx y extractbb son un único programa
Si se mira dentro del directorio bin de TeX Live 2024, resulta que dvipdfmx, dvipdfm, extractbb y ebb son todos enlaces simbólicos a xdvipdfmx. Es un único ejecutable con cinco nombres, y el programa comprueba con qué nombre lo han invocado antes de decidir cómo comportarse. dvipdfmx --version se presenta como «This is dvipdfmx Version 20240305»; xdvipdfmx --version da la misma fecha bajo el nombre xdvipdfmx. El mismo archivo. Sabiendo eso, la parte de XeTeX también encaja: xelatex -no-pdf no escribe un PDF sino un .xdv (DVI extendido), y xdvipdfmx lo convierte en PDF; como es el mismo binario, dvipdfmx sample.xdv funciona igual de bien. El antecesor dvipdfm lo escribió Mark A. Wicks; la extensión a dvipdfmx, con soporte CJK, incrustación de fuentes y flujos de objetos, es obra de Jin-Hwan Cho, Shunsaku Hirata y otros.
ls -l $(dirname $(which dvipdfmx))/dvipdfmx
# dvipdfmx -> xdvipdfmx
dvipdfmx sample.dvi # sample.dvi -> sample.pdf
dvipdfmx -p a4 -o out.pdf sample.dvi
xelatex -no-pdf paper.tex # writes paper.xdv, not paper.pdf
xdvipdfmx paper.xdv # paper.xdv -> paper.pdf| Opción | Qué hace (valores por omisión de TeX Live 2024) |
|---|---|
-o FILE | Nombre del archivo de salida; - es stdout. Por omisión, el nombre de entrada con .pdf |
-p a4 | Tamaño de papel por nombre; por omisión a4. Lista con dvipdfmx --showpaper |
-V 5 | Versión del PDF; el valor 5 significa PDF 1.5. -V 4 si una revista exige 1.4 |
-s 1-3,5 | Restringe los rangos de páginas procesados; varios separados por comas |
-l | Apaisado: intercambia anchura y altura del papel |
-z 9 | Nivel de compresión zlib de 0 a 9; por omisión 9. -z 0 para depurar el PDF en crudo |
-f FILE.map | Carga un archivo de mapa de fuentes adicional; la vía para sustituir las fuentes incrustadas |
Si aparece ! LaTeX Error: Cannot determine size of graphic, sospecha de la opción de controlador
Al meter una figura en la ruta DVI, este es el primer error con el que casi todos tropiezan: ! LaTeX Error: Cannot determine size of graphic in fig.pdf (no BoundingBox). La causa no es el archivo de imagen sino para qué controlador está configurado graphicx. En TeX Live 2024, graphics.cfg elige por omisión dvips.def en cualquier ejecución que escriba DVI, y dvips solo sabe incrustar PostScript, así que no tiene modo de leer el tamaño de un PDF o un PNG. Con \usepackage[dvipdfmx]{graphicx} en el preámbulo, en esta instalación tanto PDF como PNG pasan directamente sin archivos adicionales. En la prueba, latex recogió las figuras sin generar ni un .xbb y sin shell escape, y dvipdfmx las incrustó. Si una imagen antigua sigue sin dar su tamaño, ejecuta extractbb fig.pdf; el .xbb resultante son unas pocas líneas de texto como %%BoundingBox: 0 0 612 792, y —según el enlace simbólico de arriba— quien lo escribe es el propio dvipdfmx.
% name the driver explicitly on the DVI route
\documentclass{article}
\usepackage[dvipdfmx]{graphicx}
\begin{document}
\includegraphics[width=3cm]{fig.pdf}
\end{document}dvips: la ruta que sobrevive por lo que solo PostScript puede hacer
dvips -o paper.ps paper.dvi convierte DVI en PostScript. Es el programa de Tomas Rokicki, pero la línea de autor de su página de manual dice «extended to virtual fonts by Don Knuth», con la búsqueda de rutas y la configuración a cargo de Karl Berry: un trabajo realmente compartido. Hoy quedan tres motivos para recurrir a él: figuras que dependen de la aritmética PostScript, PSTricks el primero; una imprenta que pide un .ps; y recortar una figura suelta con dvips -E, que escribe un EPS cuyo recuadro delimitador se ajusta al contenido real (en esta ejecución, %%BoundingBox: 148 88 326 668). Si al final quieres un PDF, el remate habitual es pasar el archivo por ps2pdf, incluido con Ghostscript.
dvips -t a4 -o paper.ps paper.dvi # DVI -> PostScript
ps2pdf paper.ps # PostScript -> PDF (Ghostscript)
dvips -E -o figure.eps figure.dvi # one tightly cropped EPS| Opción | Qué hace |
|---|---|
-o FILE | Nombre del archivo PostScript a escribir; sin él, dvips puede intentar imprimir |
-t a4 | Tipo de papel: a4, letter, legal, y también landscape |
-E | Escribe una sola página como EPS; solo archivos de una página, y los gráficos incluidos no cuentan para el recuadro |
-P NAME | Lee la configuración de impresora config.NAME, que cambia resolución y gestión de fuentes |
-p 3 -l 7 | Produce solo las páginas 3 a 7 |
Aquí está la trampa que devora un día entero cuando no se conoce. No mandes imágenes de mapa de bits por la ruta dvips. Con el controlador en dvips, \includegraphics{dot.png} se detiene en el error no BoundingBox de arriba; fuérzalo —aportando un .xbb a mano, por ejemplo— y entonces ni LaTeX ni dvips dicen nada, y el .ps se escribe tan campante. La rotura está más adelante. Al pasar ese .ps por ps2pdf, Ghostscript imprimió aquí Error: /syntaxerror in (binary token, type=137) y murió con GPL Ghostscript 10.03.0: Unrecoverable error, exit code 1. PostScript sencillamente no sabe qué es un PNG, lo cual es razonable; lo doloroso es que nadie protesta hasta el último paso. Así que: si usas dvips, mantén todas las figuras en EPS. Si quieres mezclar PNG, JPEG y PDF, toma la ruta dvipdfmx. Esa única línea es toda la decisión.
dvisvgm: fórmulas en SVG y cómo el formato de fuente cambia el tamaño
Poner matemáticas en la web suele ser elegir entre una imagen de mapa de bits que se emborrona al ampliar y MathML que se representa distinto en cada sitio. dvisvgm —de Martin Gieseking, en desarrollo desde 2005— convierte DVI directamente en SVG, de modo que la composición de TeX sobrevive como vector. La versión que hay aquí en TeX Live 2024 es dvisvgm 3.2.2, y también acepta EPS con --eps y PDF con --pdf. La opción que más pesa es --font-format. Convirtiendo la misma página y midiendo: 13.156 bytes con las fuentes SVG incrustadas por omisión, 8.361 bytes con --font-format=woff2 y —en sentido contrario— 23.563 bytes con --no-fonts, que convierte cada glifo en un trazado. El archivo vectorizado tampoco contiene ni un elemento <text>, así que no se puede buscar ni copiar. «Los contornos ocupan menos» no se cumple aquí.
| Ajuste | Tamaño medido y carácter de la misma página |
|---|---|
(default) | 13.156 bytes; fuentes SVG incrustadas, sobreviven 14 elementos <text> |
--font-format=woff2 | 8.361 bytes; el más pequeño, y el texto sobrevive. Primera opción para la web |
--no-fonts | 23.563 bytes; todo pasa a trazados y no queda ningún <text>: ni búsqueda ni copia |
-z | 5.383 bytes; un .svgz comprimido con gzip, el menor de todos si el servidor lo admite |
latex equation.tex # -> equation.dvi
dvisvgm --font-format=woff2 equation.dvi # -> equation.svg
dvisvgm --pdf figure.pdf # PDF input
dvisvgm --libgs=/path/to/libgs.dylib f.dvi # only if PS specials are usedOtro mensaje alimenta un goteo constante de reportes: processing of PostScript specials is disabled (Ghostscript not found), en una máquina donde Ghostscript sí está instalado. Es justo el caso de aquí: gs está en /usr/local/bin/gs, y dvisvgm lo dice igualmente. El motivo es que busca otra cosa. dvisvgm no ejecuta el binario gs; carga en tiempo de ejecución la biblioteca compartida libgs. El Ghostscript que viene con MacTeX instala solo el ejecutable, así que la biblioteca no aparece por ninguna parte. Si necesitas convertir figuras que usan \special —PSTricks, alguna salida de TikZ—, instala un Ghostscript que traiga la biblioteca compartida o señálala con --libgs=. Para un DVI con solo matemáticas y \includegraphics, la advertencia se puede ignorar.
La ruta japonesa uplatex → dvipdfmx y ptex2pdf
Que la ruta DVI sobreviva en la composición japonesa es una necesidad, no nostalgia. Los motores de la familia pTeX —ptex, eptex, uptex, uplatex— no pueden escribir PDF directamente. Escritura vertical, prohibiciones de corte de línea, el espacio entre escritura japonesa y latina: todo eso es cosa de pTeX, mientras que dvipdfmx se ocupa de fabricar el PDF e incrustar las fuentes japonesas. Cuarenta años de trabajo se han acumulado a ambos lados de ese reparto. Por eso el procedimiento siempre tiene dos pasos: uplatex paper.tex produce el .dvi y dvipdfmx paper.dvi produce el PDF. Nombrar además el controlador en el documento, como en \documentclass[uplatex,dvipdfmx]{jsarticle}, es lo que hace que graphicx y color emitan los \special correctos.
Reunir esos dos pasos en una sola orden es lo que hace ptex2pdf. La versión incluida en TeX Live 2024 es la 20200520.0, un script texlua de texjporg —la comunidad japonesa de desarrollo de TeX— y Norbert Preining; la orden en sí es un enlace simbólico a texmf-dist/scripts/ptex2pdf/ptex2pdf.lua, y llama a dvipdfmx automáticamente cuando el motor termina. El motor se elige combinando flags, y upLaTeX, el estándar para artículos japoneses, es -l -u. Las opciones finas van al lado de TeX con -ot y a dvipdfmx con -od. Lo que ptex2pdf no hace es contar las pasadas de compilación, así que para un documento con referencias cruzadas o bibliografía conviene encargar el trabajo a latexmk.
| Flags | Motor invocado |
|---|---|
(none) | ptex — la variante pTeX de plain TeX |
-l | platex — pLaTeX, el motor tradicional limitado al repertorio JIS X 0208 |
-u | uptex — la versión de pTeX con Unicode interno |
-l -u | uplatex — upLaTeX, la opción por omisión actual para artículos japoneses |
# the two steps, written out
uplatex paper.tex # -> paper.dvi
dvipdfmx paper.dvi # -> paper.pdf
# the same thing in one command
ptex2pdf -l -u -ot '-kanji=utf8 -synctex=1' paper.tex
ptex2pdf -l -u -s paper.tex # stop at the DVI
# what to check when the converter fails
dvipdfmx nosuch.dvi
# dvipdfmx:fatal: Could not open specified DVI (or XDV) file: nosuch.dvi
# No output PDF file written.Los errores del paso de conversión y qué significan
| Mensaje | Qué está ocurriendo en realidad |
|---|---|
dvipdfmx:fatal: Could not open specified DVI | No existe ningún .dvi, casi siempre porque el documento se compiló con pdflatex. Código de salida 1 |
dvips: DVI file can't be opened | También falta la entrada; dvips no adivina nombres, así que revisa el nombre y la extensión |
dvips: ! Bad DVI file: id byte not 2 | Se pasó a dvips un .xdv escrito por XeTeX; solo xdvipdfmx lee XDV |
no BoundingBox | graphicx está configurado para dvips; prueba \usepackage[dvipdfmx]{graphicx} |
Ghostscript not found | dvisvgm no encuentra libgs; tener el ejecutable gs es otra cosa |
Las comprobaciones previas a la entrega también cambian según la ruta. Si entregas un PDF, ábrelo después de dvipdfmx en el visor que usarán tus lectores y confirma fuentes incrustadas, tamaño de papel, marcadores y enlaces. Si va a una imprenta, compara el .ps de dvips antes y después de ps2pdf para ver que los archivos EPS y las instrucciones \special de PostScript han sobrevivido. Y si dependes de la búsqueda directa e inversa desde tu editor, latex -synctex=1 produce un .synctex.gz también en la ruta DVI: aquí salió un archivo de 860 bytes que seguía ahí tras ejecutar dvipdfmx. El .dvi, el .pdf y el .synctex.gz comparten el nombre de trabajo, así que si las salidas van a un directorio aparte, haz que la herramienta de compilación indique esa ruta de forma coherente.
Dicho esto, rara vez teclearás estas órdenes en secuencia a mano. latexmk cubre las rutas latex → dvipdfmx y (u)platex → dvipdfmx con solo cambiar $pdf_mode, y decide por su cuenta si el .dvi está caducado. Teclear a mano sirve cuando sospechas de la ruta misma, es decir, en los momentos para los que existe esta página. Dicho al revés: aprende una vez los nombres y argumentos de los conversores y también sabrás leer lo que hace tu herramienta de compilación.