¿TeX siempre inserta la macro \par?

¿TeX siempre inserta la macro \par?

Cuando el procesador de entrada encuentra dos caracteres con el código de categoría 5 seguidos (en otras palabras, una línea en blanco), inserta la \parmacro.

Cuando \vbox{Abc.}termina, TeX finaliza el párrafo actual, pero no insertando la \parmacro. Parece que TeX está insertando la \parprimitiva en su lugar. ¿Estoy entendiendo correctamente lo que hace TeX en este caso? ¿Qué pasa con otros lugares donde se inserta TeX \par? ¿Cuándo es la macro \pary cuándo la primitiva?

\catcode`@=11
\let\@@par\par
\def\par{\typeout{Macro!}\@@par}

Abc.

\vbox{Abc.\tracingall}

Respuesta1

Hay exactamente 7 lugares en el programa TeX donde TeX ejecuta el generador de párrafos internamente, es decir, convierte una lista horizontal (si hay una en construcción) en un párrafo. Esto pasanoinsertando un \partoken en el flujo de entrada pero ejecutando el procedimientoend_grafimplementado en el módulo §1096 en el programa TeX.

Este procedimiento no hace nada si TeX no está en modo horizontal, más o menos nada si está en modo horizontal pero con una lista vacía (TeX ignora los párrafos nulos), y ejecuta el procedimiento.salto de líneade lo contrario (y ese hace toda la magia para agregar penalizaciones por salto parcial, etc.).

Los siete lugares son

  • al final de las estructuras verticales internas como la llave de cierre de un \vboxpero también \noaligno \vcentero una celda de alineación
  • cuando el primitivopar_endse detecta (que está disponible inicialmente en el nivel macro como el significado del token \par)
  • inmediatamente después de que finalice una rutina de salida (OR) (por lo tanto, cualquier lista horizontal iniciada en el OR no continuará con el material de la galera sino que formará un párrafo por sí solo)

En ninguno de estos casos se \parinserta un token (que podría estar sujeto a redefiniciones); en cambio, elend_graf¡Se ejecuta el procedimiento!

\parlos tokens solo se insertan cuando están en modo horizontal y se encuentran primitivas incompatibles con el modo horizontal (como \vskip,, \hrule... la lista completa es §1094 en el código TeX). Y, por supuesto, en el proceso de tokenización, cuando TeX reemplaza dos caracteres de línea final por \par(es decir, haciendo que las líneas vacías sean equivalentes a \par).

Respuesta2

De acuerdo aEl libro de texto, la regla para el final de línea es la siguiente

Si TeX ve un carácter de final de línea (categoría 5), ​​descarta cualquier otra información que pueda quedar en la línea actual. Entonces si TeX está en estadonorte(nueva línea), el carácter de fin de línea se convierte en el token de secuencia de control\par (fin de párrafo); si TeX está en estadoMETRO(línea media), el carácter de fin de línea se convierte en un token para el carácter 32 ( ) de la categoría 10 (espacio); y si TeX está en estadoS(omitiendo espacios en blanco), el carácter de final de línea simplemente se elimina.

Aquí, es importante tener en cuenta que TeX inserta el \partoken y no la \parprimitiva. Eso significa que eso \pardebe definirse en todas las circunstancias. Knuth ilustra este punto cuando analiza los comandos que fuerzan el modo horizontal:

La aparición de un <comando vertical> en modo horizontal restringido está prohibido, pero en modo horizontal normal hace que TeX inserte el token \paren la entrada; después de leer y ampliar esto \par token, TeX verá el <comando vertical> token nuevamente. ( \parSe utilizará el significado actual de la secuencia de control ; \pares posible que ya no represente \parla primitiva de TeX).

Ahora bien, lo que no parece mencionarse por ningún lado es lo que sucede al final del modo vertical interno. Claramente, las reglas anteriores no permiten la inserción de una \parficha ya que no hay marcadores de final de línea con los que lidiar. (Se insertará un \parmensaje si hay una línea en blanco entre el último material \vboxy el final del cuadro).

Al leer el resultado del seguimiento, no se menciona la \parprimitiva al final del cuadro, pero el envío sí muestra

....\penalty 10000
....\glue(\parfillskip) 0.0 plus 1.0fil

y por supuesto hay claramente un párrafo construido. Entonces, mi conclusión es que el final del modo vertical interno inserta implícitamente una \parprimitiva y, por lo tanto, inserta el material habitual de final de párrafo y luego ejecuta el generador de párrafos.

Respuesta3

Hay una razón por la cual TeX pone el "significado original" de \paral final de a \vbox: considere la siguiente entrada tonta

\vbox{\let\par\empty a}

Cuando TeX encuentra }, hace una copia de seguridad, finaliza el modo horizontal insertando el "original \par" y luego vuelve a leer el }que cierra el modo vertical interno.

Podemos emular lo que sucedería si TeX insertara el significado actual de \parantes de volver a leer el }by

\vbox{\let\par\empty a\vskip0pt}

porque \vskipinserta un (actual) \pary TeX relee \vskip. ¡El resultado es un bucle infinito!

(Encontrado en unDiscusión de 1993 sobrecomp.text.tex.)

información relacionada