
Когда я использую следующий код в 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 specials, таких как
PSfile=%0022fig1.eps%0022 llx=0 lly=0 urx=104 ury=131 rwi=1040
где ограничивающий блок явный, в pdf:image
нет ограничивающего блока, и cropbox должен быть извлечен из файла PDF. Знаете ли вы какой-либо инструмент, который безопасно извлекает cropbox? Я протестировал, 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:
специальные описаны в руководствах dvipdfm
и dvipdfmx
. Для последнего вам нужен dvipdfmx-special.pdf
, к которому я обращаюсь, используя texdoc -l dvipdfmx
его запись № 2 в списке файлов.
Версии 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
, поскольку оба позволяют бэкэнду «отслеживать» преобразования. Это проявляется, например, когда у вас есть гиперссылки, вложенные в такое пространство: необработанный вызов операции PDF cm
приведет к тому, что они будут испорчены. Как отмечено выше, основное различие между ними заключается в том, что версия 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 во всех случаях.