Unidad de medida ilegal px al recortar en xelatex (pero no en pdflatex)

Unidad de medida ilegal px al recortar en xelatex (pero no en pdflatex)

Cuando compilo mi documento pdflatex(en Ubuntu), funciona bien. Estaba cambiando xelatexpor otros problemas, pero ahora el siguiente código ya no se compilará:

\includegraphics[clip, trim={50px 50px 100px 100px}, width=\textwidth, height=\textwidth]{./images/image1.png}

Aquí hay un MWE con el que la gente puede jugar:

\documentclass{article}
\usepackage{graphicx}
\usepackage{mwe}
\begin{document}
\includegraphics[clip, trim={10px 40px 10px 40px}, width=\textwidth, height=\textwidth]{example-grid-100x100pt.png}
\end{document}

Error:

Illegal unit of measure (pt inserted).

Sé que pxes una unidad no estándar en látex, pero los gráficos incluidos son PNG, que se miden inherente y naturalmente en píxeles y necesito recortarlos en un número específico de píxeles. Esto funcionó bien pdflatexy tenía sentido. (Si el PNG tuviera un ppp no ​​estándar, creo que podría cambiarlo px, \pdfpxdimenaunque no entiendo por qué no puede simplemente leer los metadatos y hacerlo él mismo).

¿Cómo puedo recortar una imagen en un número específico de píxeles xelatex?

EDITAR: Este es mi intento de encontrar una solución con los menores cambios posibles en la forma en que incorporo la imagen (lo que espero aclare lo que estoy tratando de hacer).

  1. Obtenga ppp de la imagen. Por ejemplo, con magia de imágenes: identify -format "%w x %h %x x %y" images/image1.png. Salida: 161 x 161 72 x 72es decir, las imágenes tienen 161x161 píxeles y el ppp es 72 en ambas dimensiones. (¿El látex utiliza siquiera los ppp reales de una imagen? ¿O simplemente asume el valor predeterminado de 72?)
  2. Calcular la longitud de un píxel en términos de una unidad de látex comprende: 1 píxel = 1/72 pulg. = 0,0388 (además, dicho sea de paso, 1 píxel = 1 pben este caso, así que podría cambiar px por bp aquí, pero esa no es una solución general).
  3. Defina una longitud \mypxcon el valor apropiado y cambie pxpara \mypx:
%72 dpi -> 1 px = 1/72 in = .013889
\newlength{\mypx}
\setlength{\mypx}{0.013889in}
\includegraphics[clip, trim={50\mypx 50\mypx 100\mypx 100\mypx}, width=\textwidth, height=\textwidth]{./images/data041_arrIm_image_1.png}

Lamentablemente esto no funciona. ¿Parece que las longitudes no se pueden utilizar como parámetros de clip? Para mí es importante utilizar píxeles como unidades (en el sentido inglés de la palabra "unidades", no en la definición de látex). No quiero calcular manualmente el valor de recorte equivalente en pt, in, etc. cada vez que lo modifico; necesito decir "quitar 13 píxeles" y recortar exactamente 13 píxeles de la imagen. Tengo muchas imágenes, todas con diferentes recortes requeridos y el recorte tiene que eliminar un número entero particular de píxeles.

Todavía no entiendo por qué esto es tan difícil en látex. El hecho de que sea capaz de incluir una imagen rasterizada significa quetiene que serconsciente de los píxeles en algún nivel (o no podría mostrarlos), por lo que debería ser posible recortar directamente por píxeles en lugar de por longitudes.

Respuesta1

Si desea utilizar una longitud definida usando \newlengthel parámetro de trim=, como \mypxen su ejemplo, debe tener cuidado con las reglas de análisis de TeX:

En

\includegraphics[clip, trim={10\mypx 40\mypx 10\mypx 40\mypx}, width=\textwidth, height=\textwidth]{example-grid-100x100pt.png}

los espacios después de la secuencia de control \mypxse usan como delimitador de secuencia de control, no como espacios regulares, por lo que no se pueden usar para separar los trimargumentos. Básicamente, la línea de arriba es la misma que

\includegraphics[clip, trim={10\mypx40\mypx10\mypx40\mypx}, width=\textwidth, height=\textwidth]{example-grid-100x100pt.png}

que obviamente no puede funcionar. Puede evitar esto agregando llaves alrededor de cada dimensión. Entonces puedes usar

\documentclass{article}
\usepackage{graphicx}
\usepackage{mwe}
\newlength{\mypx}
\setlength{\mypx}{0.013889in}
\begin{document}
\includegraphics[clip, trim={{10\mypx} {40\mypx} {10\mypx} {40\mypx}}, width=\textwidth, height=\textwidth]{example-grid-100x100pt.png}
\end{document}

información relacionada