Unidade de medida ilegal px ao recortar em xelatex (mas não em pdflatex)

Unidade de medida ilegal px ao recortar em xelatex (mas não em pdflatex)

Quando compilo meu documento pdflatex(no Ubuntu), ele funciona bem. Eu estava mudando xelatexpara alguns outros problemas, mas agora o código a seguir não será mais compilado:

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

Aqui está um MWE com o qual as pessoas podem brincar:

\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}

Erro:

Illegal unit of measure (pt inserted).

Eu sei pxque é uma unidade não padrão em látex, mas os gráficos incluídos são PNG, que são inerente e naturalmente medidos em pixels e preciso cortar em um número específico de pixels. Isso funcionou bem pdflatexe fez sentido. (Se o PNG tivesse um dpi fora do padrão, acho que poderia mudar px, \pdfpxdimenembora não entenda por que ele não pode simplesmente ler os metadados e fazer isso sozinho).

Como cortar uma imagem por um número específico de pixels xelatex?

EDITAR: Aqui está minha tentativa de solução alternativa com o mínimo de alterações possíveis na forma como incorporo a imagem (o que, espero, esclarecerá o que estou tentando fazer).

  1. Obtenha dpi da imagem. Por exemplo, com magia de imagem: identify -format "%w x %h %x x %y" images/image1.png. Saída: 161 x 161 72 x 72ou seja, as imagens têm 161x161 pixels e o dpi é 72 em ambas as dimensões. (O látex usa o dpi real de uma imagem? Ou apenas assume o padrão de 72?)
  2. Calcule o comprimento do pixel em termos de uma unidade que o látex entende: 1 pixel = 1/72 pol = 0,0388 (também, aliás, 1 pixel = 1bpnesse caso, então eu poderia simplesmente trocar px por bp aqui, mas isso não é uma solução geral).
  3. Defina um comprimento \mypxcom o valor apropriado e alterne 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}

Infelizmente isso não funciona. Parece que os comprimentos não podem ser usados ​​como parâmetros de clipe? É importante para mim usar pixels como unidades (no sentido inglês da palavra 'unidades', não na definição de látex). Não quero calcular manualmente o valor de corte equivalente em pt, etc. toda vez que mexo com isso - preciso dizer 'tirar 13 pixels' e cortar exatamente 13 pixels da imagem. Eu tenho muitas imagens, todas com cortes diferentes necessários e o corte precisa retirar um determinado número inteiro de pixels.

Ainda não entendo por que isso é tão difícil no látex. O fato de ser capaz de incluir uma imagem raster significa quetem que serciente dos pixels em algum nível (ou não seria capaz de exibi-los), portanto deveria ser possível cortar diretamente por pixels em vez de por comprimentos.

Responder1

Se você quiser usar um comprimento definido \newlengthno parâmetro trim=, como \mypxno seu exemplo, você deve ter cuidado com as regras de análise do TeX:

Em

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

os espaços após a sequência de controle \mypxsão usados ​​como delimitadores da sequência de controle, não como espaços regulares, portanto não podem ser usados ​​para separar os trimargumentos. Então basicamente a linha acima é igual a

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

o que obviamente não pode funcionar. Você pode evitar isso adicionando colchetes em torno de cada dimensão. Então você pode 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}

informação relacionada