Todo sobre \shipout

Todo sobre \shipout

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: \shipoutes 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 \shipouteste 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 \box255es masajeado por \pagebody. La rutina de salida en LaTeX es mucho más complicada.

Lo que uno puede hacer es redefinir \shipoutpara 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 \shipouten 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 atbegshihace lo mismo. Se redefine \shipoutpara que pueda conectarse entre la llamada \shipouty el envío de la página real.

Precisamente lo \shipoutque 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 \pdfoutputsi se usa pdftexo , 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.luatexxetex\write

Respuesta2

Delibro de texto, Capítulo 23: Rutinas de salida, página 254:

El comando primitivo <box> de TeX \shipoutes lo que realmente causa la salida. Envía el contenido del cuadro al dviarchivo, que es el archivo de salida principal de TeX; Una vez finalizado TeX, el dviarchivo 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 \count0Through \count9en su terminal, como se explica en el Capítulo 15; Estos diez contadores también se registran en el dviarchivo, donde se pueden utilizar para identificar la página. Todos los comandos \openout, \closeouty \writeque aparecen dentro de la caja se ejecutan en su orden natural a medida que se envía la caja. Dado que un \writecomando expande macros, como se explica en el Capítulo 21, el mecanismo de escaneo de TeX puede detectar errores de sintaxis mientras un comando \shipoutestá en progreso. Si \tracingoutputes 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 \shipouten cualquier lugar, no sólo en una rutina de salida.

información relacionada