
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 \par
macro.
Cuando \vbox{Abc.}
termina, TeX finaliza el párrafo actual, pero no insertando la \par
macro. Parece que TeX está insertando la \par
primitiva 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 \par
y 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 \par
token 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
\vbox
pero también\noalign
o\vcenter
o 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 \par
inserta un token (que podría estar sujeto a redefiniciones); en cambio, elend_graf¡Se ejecuta el procedimiento!
\par
los 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 \par
token y no la \par
primitiva. Eso significa que eso \par
debe 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
\par
en la entrada; después de leer y ampliar esto\par
token, TeX verá el <comando vertical> token nuevamente. (\par
Se utilizará el significado actual de la secuencia de control ;\par
es posible que ya no represente\par
la 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 \par
ficha ya que no hay marcadores de final de línea con los que lidiar. (Se insertará un \par
mensaje si hay una línea en blanco entre el último material \vbox
y el final del cuadro).
Al leer el resultado del seguimiento, no se menciona la \par
primitiva 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 \par
primitiva 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 \par
al 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 \par
antes de volver a leer el }
by
\vbox{\let\par\empty a\vskip0pt}
porque \vskip
inserta un (actual) \par
y TeX relee \vskip
. ¡El resultado es un bucle infinito!
(Encontrado en unDiscusión de 1993 sobrecomp.text.tex
.)