
當我在 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 框來測量結果。