在 xelatex 中剪辑时测量单位 px 非法(但不是 pdflatex)

在 xelatex 中剪辑时测量单位 px 非法(但不是 pdflatex)

当我使用(在 Ubuntu 上)编译我的文档时,pdflatex它工作正常。我正切换到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在 latex 中是非标准单位,但包含的图形是 PNG,本质上自然是以像素为单位的,我需要修剪特定数量的像素。这很有效,pdflatex也很有意义。(如果 PNG 有非标准 dpi,那么我认为我可以用 进行更改px\pdfpxdimen但我不明白为什么它不能只读取元数据并自行执行此操作)。

如何按特定像素数修剪图像xelatex

编辑: 这是我尝试的一种解决方法,尽可能少地改变我如何合并图像(希望这能澄清我想做的事情)。

  1. 获取图像的 dpi。例如,使用 image magick:。 identify -format "%w x %h %x x %y" images/image1.png输出:161 x 161 72 x 72即图像为 161x161 像素,并且 dpi 在两个维度上均为 72。(latex 是否甚至使用图像的实际 dpi?还是只是假设默认值为 72?)
  2. 按照 latex 理解的单位计算像素的长度: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}

不幸的是,这不起作用。似乎长度不能用作剪辑参数?对我来说,使用像素作为单位很重要(在英语中“单位”一词的含义,而不是乳胶定义)。我不想每次弄乱它时都手动计算 pt、in 等中的等效修剪值 - 我需要说“去掉 13 个像素”并从图像中精确修剪 13 个像素。我有很多图像,都需要不同的修剪,并且修剪必须去掉特定整数个像素。

我仍然不明白为什么在 latex 中这如此困难。事实上,它能够包含光栅图像,这意味着它必须在某种程度上意识到像素(否则它将无法显示它们),因此应该可以直接按像素而不是按长度进行裁剪。

答案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}

相关内容