Formatos de imagen e inclusión

Al escribir \includegraphics{plot} no se le está dando a LaTeX un nombre de archivo, sino una raíz de nombre. El paquete graphicx le añade extensiones en un orden fijo —.pdf, .png, .jpg, etc.— y se queda con el primer archivo que exista. Esa única decisión de diseño es la que permite que un mismo fuente compile con pdfLaTeX, LuaLaTeX o dvipdfmx, y también la que explica la queja habitual: «he regenerado el PNG y la figura no cambia». Esta página cubre las opciones de \includegraphics, la ruta de búsqueda que fija \graphicspath, qué formatos lee de verdad cada motor y cómo leer los errores cuando LaTeX dice que no encuentra un archivo.

graphicx y \includegraphics: por qué se omite la extensión

La inclusión de imágenes corresponde al paquete estándar graphicx: se declara \usepackage{graphicx} y se escribe \includegraphics[opciones]{nombre}. Omitir la extensión es lo habitual, y el motivo salta a la vista al mirar por dentro. El archivo de controlador pdftex.def deja escrito el orden de las extensiones que se prueban: .pdf, .png, .jpg, .mps, .jpeg, .jbig2, .jb2. Es decir, si en la carpeta conviven plot.pdf y plot.png, siempre gana el PDF. Cuando se vuelve a exportar una gráfica como PNG y la figura no cambia, casi siempre queda al lado un plot.pdf antiguo. Visto al revés: precisamente por no escribir la extensión se puede sustituir después un PNG por un PDF sin tocar ni una letra del manuscrito. graphicx es la versión ampliada del antiguo paquete graphics, y la diferencia está en que las opciones llegan como pares key=value; ambos vienen en el paquete estándar latex-graphics, así que no hay nada extra que instalar.

document.tex
\documentclass{article}
\usepackage{graphicx}
\begin{document}
% no extension: graphicx tries .pdf, .png, .jpg ... in that order
\includegraphics[width=0.6\textwidth]{plot}
\end{document}

Escribir la extensión no solo desactiva la elección automática: también cambia la redacción del error. Cuando \includegraphics{plot} no encuentra nada, la búsqueda la lleva el núcleo de LaTeX, que dice ! LaTeX Error: File 'plot' not found. Cuando \includegraphics{plot.png} no encuentra nada, responde en cambio el controlador: ! Package pdftex.def Error: File 'plot.png' not found: using draft setting. El primero significa «ninguna extensión coincidió»; el segundo, «falta ese archivo concreto», y saber cuál aparece indica dónde mirar. De paso: el paquete mwe de TeX Live instala example-image.pdf en el propio árbol de TeX, de modo que \includegraphics{example-image} funciona desde cualquier directorio. Por eso ese nombre aparece en todos los ejemplos mínimos de los sitios de preguntas.

Fijar el tamaño: width, height, scale, keepaspectratio

En la práctica casi siempre se indica el tamaño, y lo habitual es darlo relativo a la página, como width=0.8\textwidth. Los valores absolutos tipo 8cm dejan atrás la figura en cuanto se pasa a dos columnas o se cambia el tamaño de papel. \textwidth es el ancho del bloque de texto; \linewidth es el ancho de la línea que se está componiendo, que se encoge al ancho de la caja dentro de una minipage o una subfigure. Así, escribir width=\linewidth dentro de una caja hace que la imagen siga automáticamente cualquier cambio posterior de esa caja. scale= multiplica las dimensiones naturales de la imagen, lo que conviene cuando esas dimensiones significan algo por sí mismas, pero desconoce el ancho del texto y se desborda con facilidad; width= suele ser más seguro.

Si se dan a la vez width= y height=, graphicx obedece dócilmente a ambos, con lo que se rompe la relación de aspecto y la imagen se deforma. keepaspectratio lo evita: los dos valores definen entonces un marco y la imagen se amplía todo lo posible dentro de él conservando sus proporciones. Al verter fotografías en huecos de tamaño fijo casi siempre se quiere. Otra opción útil para revisar es draft: no lee la imagen en absoluto, compone un marco de las dimensiones correctas con el nombre del archivo impreso dentro, lo que acelera muchísimo las compilaciones de prueba de un documento con cientos de figuras. \usepackage[draft]{graphicx} la aplica a todo el documento.

Girar y recortar: angle, trim, clip, viewport

angle= recibe un giro en grados, medido en sentido antihorario. angle=90 gira la imagen un cuarto de vuelta a la izquierda, el recurso clásico para meter una gráfica apaisada en una página vertical. Conviene fijarse en el orden en que se escriben angle= y width=, porque graphicx aplica las claves en el orden dado. [angle=90,width=6cm] significa «girar y luego ajustar el resultado a 6 cm de ancho»; [width=6cm,angle=90] significa «poner 6 cm de ancho y luego girar», y las dimensiones finales no coinciden. El giro se hace por omisión en torno a la esquina inferior izquierda; origin=c lleva el pivote al centro y origin=tr a la esquina superior derecha.

Para recortar los bordes de una imagen, trim= va emparejado con clip. trim toma cuatro valores en el orden izquierda, abajo, derecha, arriba, un orden heredado del sistema de coordenadas de PostScript, cuyo origen está abajo a la izquierda, y que por eso no coincide con la intuición de nadie. La unidad por omisión es el bp (big point, la setentaidosava parte de una pulgada). Y hay que añadir siempre clip: sin él, la parte que se pretendía quitar no se descarta, sino que se derrama sobre el texto circundante. Los valores negativos hacen lo contrario y añaden margen, una forma elegante de dar aire alrededor de una figura. Si se prefiere describir el recorte como un rectángulo en coordenadas absolutas en lugar de cuatro cantidades a recortar, se usa viewport=, también junto con clip.

latex
% half the text width
\includegraphics[width=0.5\textwidth]{photo}

% fit inside 8cm x 5cm without distortion
\includegraphics[width=8cm,height=5cm,keepaspectratio]{photo}

% rotate a quarter turn to the left, then scale the result
\includegraphics[angle=90,width=6cm]{diagram}

% shave 20bp left, 20bp bottom, 30bp right, 10bp top -- clip is mandatory
\includegraphics[trim=20 20 30 10,clip,width=6cm]{scan}

% page 3 of a multi-page PDF
\includegraphics[page=3,width=\linewidth]{report}
OpciónQué hace
width=Anchura de salida; lo normal son valores relativos como 0.8\textwidth
height=Altura de salida; añada keepaspectratio si se combina con width=
scale=Multiplicador del tamaño natural (scale=0.5 es la mitad)
angle=Rotación antihoraria en grados; el orden respecto a width= importa
origin=Pivote de giro; abajo a la izquierda por omisión, c centro, tr arriba a la derecha
keepaspectratioAjusta lo más grande posible dentro del marco anchura-altura, sin deformar
trim= ... clipRecorta izquierda, abajo, derecha y arriba; unidad bp por omisión, clip obligatorio
viewport= ... clipDefine la ventana de recorte como rectángulo absoluto; se usa con clip
page=Elige qué página de un PDF de varias páginas se incluye (la 1 por omisión)
draftNo lee la imagen; compone un marco vacío del tamaño correcto con el nombre

Apuntar a una carpeta de figuras con \graphicspath

Si las imágenes viven en otra carpeta, se amplía la ruta de búsqueda con \graphicspath. Cada directorio va en su propio par de llaves —aunque solo haya uno— y termina con una barra /, también en Windows. El orden de búsqueda se comprueba fácilmente: una imagen del mismo nombre en el directorio actual gana sin discusión; si no la hay, se prueban los directorios en el orden escrito y se toma el primero que aparezca. Escribir \graphicspath{{figures/}{old-figures/}} da así un montaje cómodo: una versión nueva en figures/ tapa automáticamente la vieja, y solo las figuras aún no rehechas se recogen de old-figures/. Una ruta con espacios va entre comillas, como {"my figures/"}. Para cambiar la propia lista de extensiones se usa \DeclareGraphicsExtensions.

latex
\usepackage{graphicx}
% braces around each directory, trailing slash on each, searched in this order
\graphicspath{ {figures/} {../shared-figures/} }

% narrow or reorder the list of extensions graphicx will try
\DeclareGraphicsExtensions{.pdf,.png,.jpg}

PDF o PNG: elegir entre vectorial y raster

En el fondo hay un solo criterio: lo hecho de líneas y texto debe ser vectorial; lo de tono continuo, raster. Las imágenes vectoriales (PDF, EPS, SVG) describen puntos, rectas y curvas como coordenadas, de modo que los contornos se recalculan a cualquier aumento y la resolución de impresión no interviene. Gráficas, esquemas de circuitos y dibujos con fórmulas pertenecen a este grupo. Las imágenes raster (PNG, JPEG) son una cuadrícula de píxeles de color; ampliarlas solo agranda los píxeles. Fotografías y capturas de pantalla pertenecen a este otro, y para imprimir conviene partir de datos a 300 dpi o más. Vectorizar una fotografía no aporta nada y solo engorda el archivo. Cuando la figura se genera dentro de LaTeX —TikZ, pgfplots—, la salida es vectorial desde el principio.

Dentro del raster la regla es breve: JPEG para fotografías, PNG para todo lo demás. JPEG comprime con pérdida y trata bien la gradación fotográfica, pero ensucia el borde de líneas y letras con lo que se llama ruido de mosquito, que es exactamente por lo que una captura de pantalla guardada en JPEG se ve sucia alrededor del texto. PNG es sin pérdida, admite transparencia y va bien con gráficos de color plano y capturas. En cuanto al SVG, ningún motor lo lee directamente. El paquete svg permite escribir \includesvg{file}, pero por detrás llama a la línea de órdenes de Inkscape para convertir a PDF (o a EPS si la salida es DVI) y exporta el texto del SVG a un archivo aparte que LaTeX vuelve a componer. Necesita Inkscape instalado y una compilación con --shell-escape. Si se busca fiabilidad, lo seguro es exportar antes a PDF con Inkscape o una herramienta similar. En sentido inverso, para obtener SVG a partir de la salida de TeX, la herramienta es dvisvgm.

Qué formatos lee cada motor: ¿de verdad falla EPS?

Lo que decide los formatos aceptados no es el motor, sino el archivo de controlador que hay detrás. Al arrancar, graphics.cfg averigua qué motor está en marcha y carga pdftex.def para pdfTeX, xetex.def para XeTeX, dvips.def cuando la salida es DVI; la lista de extensiones que declare ese archivo es exactamente el conjunto de formatos admitidos. De ahí se siguen dos correcciones al relato habitual. Primera: XeLaTeX y dvipdfmx manejan EPS y PS directamente; las listas de xetex.def y dvipdfmx.def incluyen .eps y .ps, y siguen con .ai, .bmp y .jp2. Segunda: pdfLaTeX y LuaLaTeX también leen EPS, a efectos prácticos.

RutaArchivo de controladorExtensiones probadas, en orden
pdflatexpdftex.def.pdf .png .jpg .mps .jpeg .jbig2 .jb2; se añade .eps si el shell escape está activo
lualatexluatex.defla misma lista que pdftex.def, y el mismo trato de .eps
xelatexxetex.def.pdf .ai .png .jpg .jpeg .jp2 .jpf .bmp .ps .eps .mps: EPS y PS de forma directa
platex + dvipdfmxdvipdfmx.defla misma lista que xetex.def; las dimensiones pueden venir de un .xbb
latex + dvipsdvips.defsolo .eps .ps .eps.gz .ps.gz .eps.Z .mps: ni PDF, ni PNG, ni JPEG

El mecanismo por el que pdfLaTeX deja pasar el EPS está escrito dentro de pdftex.def. En \begin{document}, si el shell escape está activo, ese archivo añade por su cuenta .eps a la lista de extensiones y carga epstopdf-base. Y basta con el shell escape restringido que TeX Live activa por omisión: no hace falta --shell-escape. En modo restringido se llama al gemelo prudente repstopdf; solo con --shell-escape se cambia a epstopdf propiamente dicho. El archivo convertido queda junto al fuente con el nombre myfig-eps-converted-to.pdf. pdftex.def añade, eso sí, su propia advertencia: cuando el original verdadero es el PDF y no el EPS, esta conversión automática puede dar un resultado equivocado. Para desactivarla se escribe \newcommand{\DoNotLoadEpstopdf}{} antes incluso de la línea \documentclass.

latex
% EPS under pdflatex already works; this line only makes it explicit
\usepackage{epstopdf}

% ... and this, placed BEFORE \documentclass, switches the conversion off
% \newcommand{\DoNotLoadEpstopdf}{}

% pLaTeX / upLaTeX: the driver cannot be detected, so name it
% \usepackage[dvipdfmx]{graphicx}

También hay motivo para no apoyarse demasiado en esa conversión automática. Al ejecutar pdflatex -no-shell-escape, .eps no se incorpora nunca a la lista de extensiones, de modo que myfig.eps está ahí mismo y aun así aparece ! LaTeX Error: File 'myfig' not found. Peor es el caso en que sí se escribió la extensión: \includegraphics{myfig.eps} no produce ni error ni aviso y compone en silencio un recuadro con el nombre del archivo en lugar de la imagen. Donde un servidor de compilación o la cadena de un coautor use -no-shell-escape, lo seguro es convertir el EPS a PDF de antemano y versionar el PDF. Para pLaTeX / upLaTeX, cuyo controlador no puede detectarse, hay que indicarlo: \usepackage[dvipdfmx]{graphicx}. Si hacen falta las dimensiones de un PNG, JPEG o PDF, extractbb genera el archivo .xbb.

Cuando LaTeX dice File not found

Los errores relacionados con imágenes dicen la causa con todas las letras. Cuatro de ellos cubren casi cualquier percance. ! LaTeX Error: File 'plot' not found. significa «no coincidió nada con ninguna extensión de la lista»: una errata, un \graphicspath ausente, o una figura que solo existe en EPS con el shell escape apagado. ! Package pdftex.def Error: File 'plot.png' not found: using draft setting. significa «falta ese archivo concreto». ! LaTeX Error: Unknown graphics extension: .tiff. significa «el archivo está, pero esta ruta no conoce el formato», que es lo que se obtiene al entregarle un TIFF o un WebP. Conviértalo a PNG o PDF.

El cuarto es de otra naturaleza. ! LaTeX Error: Cannot determine size of graphic in plot.png (no BoundingBox). significa «el archivo se pudo leer, pero se desconocen sus dimensiones». Lo provoca un EPS al que le falta la línea BoundingBox, pero en el trabajo diario la razón abrumadoramente más frecuente es haber ejecutado latex cuando se quería pdflatex. latex toma la vía DVI y carga por tanto dvips.def, que no sabe leer los bytes de un PNG o un JPEG como dimensiones. Si todas las figuras se rompen a la vez, sospeche primero de la orden de compilación.

  • BoundingBox del EPS: si falta la línea o los valores son erróneos, el tamaño queda indeterminado. Reescríbala con ps2eps o epstool.
  • PDF de varias páginas: por omisión solo la página 1. Elija una con page=; para insertar un documento entero, use el paquete pdfpages.
  • Márgenes en un PDF: unos márgenes amplios en el PDF de una figura la hacen parecer pequeña. Recórtelos con pdfcrop antes de incluirla.
  • Espacios y puntos en los nombres: nombres como my plot.tar.gz dificultan separar la extensión. Quédese con letras, dígitos, guiones y guiones bajos.
  • Extensión escrita a mano: indicarla impide cambiar de formato después. Como regla, escriba el nombre sin extensión.

Por último, conviene fijar que \includegraphics solo deja la imagen donde está: no añade número ni pie. Para escribir «véase la figura 3» en un artículo hay que meter la imagen en un entorno figure y darle \caption y \label. Todo lo que viene después —dónde deposita realmente la figura [htbp], cómo se estiliza el pie, cómo se divide en (a) y (b)— corresponde a las dos páginas hermanas.