XeLaTeX/图形特辑

XeLaTeX/图形特辑

当我在 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:scaleXeLaTeX 特有的吗?

为什么首先有一个 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。dvipdfmdvipdfmxdvipdfmx-special.pdftexdoc -l dvipdfmx

据我所知,这些x:版本没有记录 - 阅读来源,这些源自xdvipdfmx,但由于dvipdfmxxdvipdfmx现已合并,所以这并不重要。关键是它们的工作方式与pdf:...的记录版本相同dvipdfm,更重要的是,我们知道它们已经以这种方式使用了很多年。因此,尽管这些最初是 XeTeX 特有的,但今天我们可以将pdf:x:特殊项与混合使用dvipdfmx,正如您所见。(值得注意的是,它们是独立实现的,因此通常应该测试交互。)XeTeX 列表中有一些关于某些特殊项的信息,最明显的是https://tug.org/pipermail/xetex/2004-May/000220.html

/对构成了变换矩阵的范围。(在btrans相同代码的版本中,我们使用/ ,它保存/恢复整个图形状态 - 允许与其他操作共享一些代码。)当需要显式etransl3backendx:gsavex:grestorebtransetrans成对一组特色菜;与之形成对比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 框来测量结果。

相关内容