Недопустимая единица измерения px при обрезке в xelatex (но не в pdflatex)

Недопустимая единица измерения px при обрезке в xelatex (но не в pdflatex)

Когда я компилирую свой документ с помощью pdflatex(на Ubuntu), все работает нормально. Я переключался на из-за xelatexнекоторых других проблем, но теперь следующий код больше не компилируется:

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

Вот MWE, с которым люди могут поиграть:

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

Ошибка:

Illegal unit of measure (pt inserted).

Я знаю, pxчто это нестандартная единица измерения в латексе, но включенная графика — это PNG, которые по своей сути и естественным образом измеряются в пикселях, и мне нужно обрезать на определенное число пикселей. Это отлично работало pdflatexи имело смысл. (Если бы у PNG было нестандартное разрешение, то я думаю, я мог бы изменить pxна \pdfpxdimen, хотя я не понимаю, почему он не может просто прочитать метаданные и сделать это сам).

Как обрезать изображение по определенному количеству пикселей в xelatex?

РЕДАКТИРОВАТЬ: Вот моя попытка обходного пути с минимальными изменениями в том, как я вставляю изображение (надеюсь, это прояснит, что я пытаюсь сделать).

  1. Получить dpi изображения. Например, с помощью image magick: identify -format "%w x %h %x x %y" images/image1.png. Вывод: 161 x 161 72 x 72ie images имеет размер 161x161 пикселей, а dpi составляет 72 в обоих измерениях. (Latex вообще использует фактическое dpi изображения? Или просто предполагает значение по умолчанию 72?)
  2. Рассчитайте длину пикселя в единицах, которые понимает латекс: 1 пиксель = 1/72 дюйма = .0388 (также, кстати, 1 пиксель = 1bp)в этом случае, поэтому я мог бы просто заменить px на bp здесь, но это не общее решение).
  3. Определите длину \mypxс соответствующим значением и переключитесь pxна \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}

К сожалению, это не работает. Кажется, что длины нельзя использовать в качестве параметров обрезки? Для меня важно использовать пиксели в качестве единиц (в английском смысле слова «единицы», а не в определении Latex). Я не хочу вручную вычислять эквивалентное значение обрезки в pt, in и т. д. каждый раз, когда я с этим возюсь - мне нужно сказать «убрать 13 пикселей» и урезать ровно 13 пикселей с изображения. У меня много изображений, все с разной требуемой обрезкой, и обрезка должна убирать определенное целое число пикселей.

Я до сих пор не понимаю, почему это так сложно в латексе. Тот факт, что он вообще способен включать растровое изображение, означает, что ондолжно бытьна каком-то уровне распознает пиксели (иначе не смог бы их отобразить), поэтому должна быть возможность прямой обрезки по пикселям, а не по длине.

решение1

Если вы хотите использовать длину, определенную с помощью \newlengthпараметра trim=, как \mypxв вашем примере, вам следует быть внимательным с правилами синтаксического анализа TeX:

В

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

пробелы после управляющей последовательности \mypxиспользуются как разделитель управляющей последовательности, а не как обычные пробелы, поэтому их нельзя использовать для разделения аргументов trim. Так что в основном строка выше такая же, как

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

что, очевидно, не может работать. Вы можете избежать этого, добавив скобки вокруг каждого измерения. Так что вы можете использовать

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

Связанный контент