
Mientras lee sobre paquetes que permitenganchomacros para ciertos eventos, me encontré con este comando, \shipout
. Buscar en Internet no ayudó mucho, pero si no me equivoco, de alguna manera está relacionado con la creación de nuevas páginas (¿o no?).
Mi pregunta es, ¿qué es exactamente \shipout
, qué hace y cómo hace lo que hace? (es decir, lo que está sucediendo en el nivel bajo en segundo plano)
Respuesta1
Esto es bastante fácil: \shipout
es una primitiva. Su sintaxis es
\envío ⟨caja⟩
donde ⟨box⟩ se especifica completamente en la página 278 del TeXbook:
⟨cuadro⟩ →
\box
⟨número de 8 bits⟩ |\copy
⟨Número de 8 bits⟩
|\lastbox
|\vsplit
⟨número de 8 bits⟩to
⟨dimen⟩
|\hbox
⟨especificación de la caja⟩{
⟨material en modo horizontal⟩}
|\vbox
⟨especificación de la caja⟩{
⟨material en modo vertical⟩}
|\vtop
⟨especificación de la caja⟩{
⟨material en modo vertical⟩}
⟨especificación de la caja⟩ →to
⟨dimen⟩⟨relleno⟩ |spread
⟨dimen⟩⟨relleno⟩ | ⟨relleno⟩
Se podría decir, por ejemplo,
\shipout\hbox{Hello world}
y se creará una página en el archivo DVI o PDF. Por supuesto, nadie quiere utilizar \shipout
este método. Su uso principal es en la rutina de salida que se llama cuando TeX decide que tiene suficiente material para expulsar una página completa. La lista vertical principal actual se divide en el salto de página elegido y su contenido se empaqueta en archivos \box255
, sobre los que puede actuar la rutina de salida. Por ejemplo, la rutina de salida Plain TeX no
\shipout\vbox{
\makeheadline
\pagebody
\makefootline
}
\advancepageno
\ifnum\outputpenalty>-\@MM
\else
\dosupereject
\fi
por lo que se envía una página completa, adornada con encabezados y pies de página. El contenido de \box255
es masajeado por \pagebody
. La rutina de salida en LaTeX es mucho más complicada.
Lo que uno puede hacer es redefinir \shipout
para que haga otros trabajos. El conjunto de macros más antiguo que hizo algo como esto fue quire.tex
(aún disponible en CTAN y TeX Live)
\def\q_init
{\global\q_sheetnr=0\global\q_qnr=0
\global\let\q_oldship=\shipout
\global\let\shipout=\q_boat
\xdef\q_cycles{\the\deadcycles}%
\global\let\endquire=\q_endquire
}
Guarda el significado primitivo de \shipout
en el comando \q_oldship
(las macros lo usan _
como marcador 'privado') y lo redefine como \q_boat
, que hará algunos trabajos y eventualmente llamará a \q_oldship
. Por ejemplo, podría configurarse para colocar dos páginas de salida en la misma página física, o para crear requisitos de dieciséis páginas (de ahí el nombre del paquete).
El paquete atbegshi
hace lo mismo. Se redefine \shipout
para que pueda conectarse entre la llamada \shipout
y el envío de la página real.
Precisamente lo \shipout
que hace la primitiva es transformar la lista vertical con la que se alimenta en instrucciones de impresión de bajo nivel (formato DVI o PDF, según el valor de \pdfoutput
si se usa pdftex
o , XDV si se usa, solo DVI para Knuth TeX). Mientras tanto, ejecuta todas las operaciones retrasadas, expandiendo tokens a medida que avanza: de esta manera se garantiza que las referencias al número de página sean correctas, porque se calculan cuando se envía la página.luatex
xetex
\write
Respuesta2
Delibro de texto, Capítulo 23: Rutinas de salida, página 254:
El comando primitivo <box> de TeX
\shipout
es lo que realmente causa la salida. Envía el contenido del cuadro aldvi
archivo, que es el archivo de salida principal de TeX; Una vez finalizado TeX, eldvi
archivo contendrá una codificación compacta de instrucciones independiente del dispositivo que especifica exactamente qué se debe imprimir. Cuando se envía una caja, TeX muestra los valores de\count0
Through\count9
en su terminal, como se explica en el Capítulo 15; Estos diez contadores también se registran en eldvi
archivo, donde se pueden utilizar para identificar la página. Todos los comandos\openout
,\closeout
y\write
que aparecen dentro de la caja se ejecutan en su orden natural a medida que se envía la caja. Dado que un\write
comando expande macros, como se explica en el Capítulo 21, el mecanismo de escaneo de TeX puede detectar errores de sintaxis mientras un comando\shipout
está en progreso. Si\tracingoutput
es distinto de cero en el momento de un\shipout
, el contenido de la caja que se envía se escribe en su archivo de registro en forma simbólica. Puede decirlo\shipout
en cualquier lugar, no sólo en una rutina de salida.