
Cuando uso el siguiente código en XeLaTeX
\resizebox{\textwidth}{!}{\includegraphics{foo.pdf}}
El archivo XDV contiene los siguientes códigos de operación:
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
¿Dónde puedo encontrar una descripción de las ofertas especiales con espacio de nombres x
y pdf
?
Supongo que eso pdf:btrans
mantiene el estado gráfico actual en la memoria y comienza uno nuevo. ¿Es x:scale
un especial específico de XeLaTeX?
¿Por qué hay primero una escala de 0,99667 (obtenida de \resizebox
) y luegootrocon escala 1.0?
En el pdf:image
especial veo una matrix
palabra clave que me recuerda a la matriz de estado gráfico PostScript, ¿por qué no se usa esta matriz para el escalado? Miré en mi documento y todas las figuras tenían la misma matriz "unitaria", ¿bajo qué circunstancias esta matriz sería diferente?
Y última pregunta: veo que, al contrario de los especiales de PostScript como
PSfile=%0022fig1.eps%0022 llx=0 lly=0 urx=104 ury=131 rwi=1040
donde el cuadro delimitador es explícito, en el pdf:image
no hay cuadro delimitador y el cuadro de recorte debe extraerse del archivo PDF. ¿Conoce alguna herramienta que extraiga el cropbox de forma segura? Probé pdfinfo
y produjo el siguiente código:
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
¿El "Tamaño de página" es realmente el cuadro de recorte? ¿Y los "pts" son puntos PostScript (= bp) o puntos TeX (= pt)?
Respuesta1
Primero, tomando la pregunta general, las pdf:
especiales se describen en los manuales dvipdfm
y dvipdfmx
. Para este último, desea dvipdfmx-special.pdf
, al que accedo usando texdoc -l dvipdfmx
la entrada número 2 en la lista de archivos.
Las x:
versiones no están (que yo sepa) documentadas - lecturala fuente, estos se originan en xdvipdfmx
, pero como dvipdfmx
y xdvipdfmx
ahora están fusionados, esto no es importante. La clave es que funcionan igual que pdf:...
las versiones documentadas para dvipdfm
, y lo que es más importante, sabemos que se han utilizado de esa manera durante muchos años. Entonces, aunque comenzaron como específicos de XeTeX, hoy podemos mezclarlos pdf:
con x:
especiales dvipdfmx
como has visto. (Vale la pena señalar que se implementan de forma independiente, por lo que, en general, se deben probar las interacciones). Hay información en la lista de XeTeX sobre algunas de las ofertas especiales, la más obvia.https://tug.org/pipermail/xetex/2004-May/000220.html.
El par btrans
/ etrans
forma un ámbito para la matriz de transformación. (En la l3backend
versión del mismo código, usamos x:gsave
/ x:grestore
, que guarda/restaura todo el estado de los gráficos, lo que permite compartir código con otras operaciones). El par btrans
/ etrans
es útil cuando se desea una conexión explícitaemparejadoconjunto de especiales; contraste con x:rotate
o similar, que es una operación de "una sola vez", por lo que es más adecuada para "construir"dentroun exterior x:gsave
/ x:grestore
par. (En el l3backend
código utilizamos ambos por este motivo, ya que coinciden con las API de otros backends).
Usar x:scale
, etc., debería ser equivalente a usar pdf:brans scale
, ya que ambos permiten que el backend "rastree" las transformaciones. Esto aparece, por ejemplo, cuando tiene hipervínculos anidados dentro de dicho espacio: una llamada sin formato a una cm
operación PDF significará que estos se estropearán. Como se señaló anteriormente, la principal diferencia entre los dos es que la x:
versión puede ser "independiente" dentro de una serie de transformaciones, mientras que pdf:btrans
requiere pdf:etrans
operaciones de coincidencia.
En la pregunta "¿por qué escalar dos veces?", es porque tienes una imagen dentro de un cuadro escalado. En XeTeX, no escalamos las imágenes 'directamente' (en el nivel especial para incluir la imagen), sino que insertamos la imagen dentro de un cuadro que luego se escala (esto se comparte con pdfTeX, ver más abajo). Como tal, cuando incluye la imagen, se establece a escala completa (sin escala como argumento opcional para \includegraphics
), y eso se muestra como la escala no operativa. Luego escalas uncircundantecuadro, que se hace en 'puntos grandes', de ahí los valores ligeramente extraños.
(Con XeTeX, podríamos optar por escalar la imagen en el punto de inclusión, pero eso no funciona, por dvipdfmx
lo que lo evitamos para compartir código. Esencialmente, el código backend más nuevo tiende a seguir a pdfTeX y la primitiva que usa para la imagen). La inclusión no ofrece escala para todos los tipos de imágenes, por lo que la mejor ruta de código compartido es escalar un cuadro contenedor).
Finalmente, pasamos al cuadro delimitador. En la dvipdfmx
ruta, tenemos que usar el programa auxiliar extractbb
para obtener el cuadro delimitador. Sin embargo, en XeTeX tenemos una primitiva de imagen \XeTeXpdffile
que puede leer el PDF directamente. Se necesita un argumento de palabra clave para decircualcuadro para leer: esto está cubierto en texdoc xetex
. Verá allí que esta primitiva puede escalar la imagen, a diferencia de usar \special{pdf:image ...}
, pero como se señaló anteriormente, esa característica no se usa. Si uno elige escalar/rotar la imagen en el \XeTeXpdffile
nivel, esto aparecería en matrix
: En este caso, no estoy seguro de qué tan bien interactúa con los hipervínculos.
Al insertar una imagen PDF, se recorta alrededor del cuadro delimitador deseado, lo que significa que no necesita preocuparse por las unidades. Si quieres saber el tamaño de la imagen resultante, mides el cuadro TeX en el que termina, por ejemplo
\setbox0=\hbox{\XeTeXpdffile "foo.pdf" media }%
\edef\pictureheight{\the\ht0 }%
\edef\picturewidth{\the\wd0 }%
ya que la imagen siempre se inserta en el punto de referencia del cuadro sin profundidad. Verás que xetex.def
usamos eso para asumir que las coordenadas inferiores izquierdas son siempre (0,0)
(cf. dvips
, donde la vida es más "interesante").
Para gráficos de mapa de bits, la primitiva \XeTeXpicfile
está disponible y puede insertar la imagen sin necesidad de un cuadro delimitador por adelantado. Como acabamos de ver con \XeTeXpdffile
, como estas primitivas conocen el cuadro delimitador de las imágenes, las insertan en TeX con un tamaño "real", por lo que podemos medir los resultados usando un cuadro TeX en todos los casos.