当我在 XeLaTeX 下使用以下代码时
\resizebox{\textwidth}{!}{\includegraphics{foo.pdf}}
XDV 文件包含以下操作码:
PUSH
XXX "pdf:btrans"
XXX "x:scale 0.99667 0.99667"
PUSH
PUSH
PUSH
PUSH
PUSH
PUSH
XXX "pdf:btrans"
XXX "x:scale 1 1"
PUSH
PUSH
XXX "pdf:image matrix 1.0 0.0 0.0 1.0 0.0 0.0 page 0 pagebox cropbox (foo.pdf)"
POP
POP
XXX "pdf:etrans"
POP
POP
POP
POP
POP
POP
XXX "pdf:etrans"
POP
x
在哪里可以找到带有命名空间和的特殊内容的描述pdf
?
我猜测这pdf:btrans
会将当前图形状态保存在内存中并启动一个新的图形状态,这是x:scale
XeLaTeX 特有的吗?
为什么首先有一个 0.99667 的比例(从 获得\resizebox
),然后另一个采用 1.0 比例?
在pdf:image
特别版中,我看到一个matrix
关键词,让我想起了 PostScript 图形状态矩阵,为什么这个矩阵不用于缩放?我查看了我的文档,发现所有图形都有相同的“单一”矩阵,在什么情况下这个矩阵会不同?
最后一个问题:我发现,与 PostScript 特辑相反,
PSfile=%0022fig1.eps%0022 llx=0 lly=0 urx=104 ury=131 rwi=1040
其中边界框是明确的,在pdf:image
没有边界框的情况下,必须从 PDF 文件中提取裁剪框。你知道有什么工具可以安全地提取裁剪框吗?我测试了一下,pdfinfo
它产生了以下代码:
Creator: TeX
Producer: pdfTeX-1.40.20
CreationDate: Mon Aug 31 13:24:48 2020 CEST
ModDate: Mon Aug 31 13:24:48 2020 CEST
Tagged: no
UserProperties: no
Suspects: no
Form: none
JavaScript: no
Pages: 1
Encrypted: no
Page size: 347 x 426 pts
Page rot: 0
File size: 11745 bytes
Optimized: no
PDF version: 1.5
“页面大小”实际上是裁剪框吗?“pts”是 PostScript 点 (= bp) 还是 TeX 点 (= pt)?
答案1
首先,就一般问题而言,和手册pdf:
中描述了特殊内容。对于后者,您需要,我使用它来访问,因为它是文件列表中的条目 #2。dvipdfm
dvipdfmx
dvipdfmx-special.pdf
texdoc -l dvipdfmx
据我所知,这些x:
版本没有记录 - 阅读来源,这些源自xdvipdfmx
,但由于dvipdfmx
和xdvipdfmx
现已合并,所以这并不重要。关键是它们的工作方式与pdf:...
的记录版本相同dvipdfm
,更重要的是,我们知道它们已经以这种方式使用了很多年。因此,尽管这些最初是 XeTeX 特有的,但今天我们可以将pdf:
和x:
特殊项与混合使用dvipdfmx
,正如您所见。(值得注意的是,它们是独立实现的,因此通常应该测试交互。)XeTeX 列表中有一些关于某些特殊项的信息,最明显的是https://tug.org/pipermail/xetex/2004-May/000220.html。
/对构成了变换矩阵的范围。(在btrans
相同代码的版本中,我们使用/ ,它保存/恢复整个图形状态 - 允许与其他操作共享一些代码。)当需要显式etrans
l3backend
x:gsave
x:grestore
btrans
etrans
成对一组特色菜;与之形成对比x:rotate
或类似,这是“一次性”操作,因此最适合“建立”之内外部x:gsave
/x:grestore
对。(l3backend
出于这个原因,我们在代码中同时使用这两个,因为它们与其他后端的 API 相匹配。)
我认为使用x:scale
等应该等同于使用pdf:brans scale
,因为两者都允许后端“跟踪”转换。例如,当您在这样的空间内嵌套超链接时,就会出现这种情况:对 PDFcm
操作的原始调用将意味着这些操作会变得混乱。如上所述,两者之间的主要区别在于版本x:
可以在一系列转换中“独立”,而pdf:btrans
需要匹配pdf:etrans
操作。
关于“为什么要缩放两次”的问题,这是因为您有一个缩放框内的图像。在 XeTeX 中,我们不会“直接”缩放图像(在包含图像的特殊级别),而是将图像插入一个框内,然后进行缩放(这与 pdfTeX 共享,见下文)。因此,当您包含图像时,它会设置为全尺寸(不缩放作为可选参数\includegraphics
),并且显示为无操作缩放。然后缩放周围盒子,这是用“大点”完成的,因此值有点奇怪。
(使用 XeTeX,我们可以选择在包含点缩放图像,但这并不适用,因此为了dvipdfmx
共享代码我们避免这样做。本质上,较新的后端代码倾向于遵循 pdfTeX,并且它用于图像包含的原语并不提供所有图像类型的缩放,因此最好的共享代码路线是缩放包含框。)
最后,我们转到边界框。在dvipdfmx
路线中,我们必须使用辅助程序extractbb
来获取边界框。然而,在 XeTeX 中,我们有一个图像基元\XeTeXpdffile
,它可以直接读取 PDF。它需要一个关键字参数来表示哪个框中显示:这在 中有介绍texdoc xetex
。您将在那里看到,与使用 相比,此原语可以进行图像缩放\special{pdf:image ...}
,但如上所述,该功能未使用。如果选择在 级别缩放/旋转图像\XeTeXpdffile
,这将显示在 中matrix
:我不确定在这种情况下它与超链接的交互效果如何。
插入 PDF 图像会裁剪所需的边界框,这意味着您无需担心单位。如果您想知道生成的图像的大小,可以测量它最终所在的 TeX 框,例如
\setbox0=\hbox{\XeTeXpdffile "foo.pdf" media }%
\edef\pictureheight{\the\ht0 }%
\edef\picturewidth{\the\wd0 }%
因为图像总是插入到没有深度的框的参考点。您将看到xetex.def
我们使用它来假设左下角的坐标总是(0,0)
(参见dvips
,其中生活更“有趣”)。
对于位图图形,可以使用图元\XeTeXpicfile
,无需预先设置边界框即可插入图像。正如我们在 中看到的那样\XeTeXpdffile
,由于这些图元知道图像的边界框,因此它们会以“真实”大小将其插入 TeX,因此我们可以在所有情况下使用 TeX 框来测量结果。