¿Cuándo entra en juego el catcode 5 "fin de línea"?

¿Cuándo entra en juego el catcode 5 "fin de línea"?

Mi objetivo es comprender la relación entrebytes de caracteresyfichas de personajecon respecto a los bytes de nueva línea. Probablemente no tengo mis datos claros.

Cuando TeX lee un archivo de bytes, se debe considerar la codificación. Dejando eso de lado,

  • Podemos observar que unbyte de carácter de nueva línea única(suponiendo LF y CRLF) se convierte en un espacio. ¿Pero qué sucede detrás de escena? ¿Se crea un token utilizando un par de datos (número de byte LF, código cat=10)?

  • Dos bytes de caracteres de nueva línea consecutivos¿Convertirse en un único token con el par de datos (número de byte de espacio, código cat 5)?

¿Cuándo entra en juego el catcode 5 "fin de línea"?

Sé que LaTeX inserta un \parcuando se encuentran dos finales de línea consecutivos.

Código

Intenté mostrar visualmente tokens con catcode 5, pero todavía no estoy seguro de si \tmprealmente se convierte en catcode 5.

\documentclass{article}
\usepackage{fontspec}% xelatex

\long\def\scan#1{#1\par\rule{\textwidth}{2pt}\par\xscan#1\relax}
\long\def\xscan{\afterassignment\xxscan\let\tmp= }
\long\def\xxscan{%
\ifx\tmp\relax\else%
\ifcat\tmp\space10 \else%
\ifcat\tmp a11 \else%
\ifcat\tmp 112 \else%...
\ifcat\tmp

5
\else%
\fi\fi\fi\fi
\expandafter\xscan
\fi}

\begin{document}
\scan{  mac::exception  ==

a
}
\end{document}

ingrese la descripción de la imagen aquí

Notas

Respuesta1

Nunca hay tokens con catcode 5.

Initex se instala

\catcode`\^^M=5

Pero eso actúa de manera similar a

\catcode`\%=14

lo que genera %el código cat 14, pero no hay tokens con ese código cat. Si se escanea un carácter con el código cat 14, ese carácter y el resto de la línea se descartan.

Un carácter del código cat 5 genera un carácter de espacio y coloca el escáner de tex en un modo especial que hace que los caracteres inmediatamente siguientes del código cat 10 se descarten como "espacio en blanco al principio de una línea" y que el carácter siguiente del código cat 5 se tokenice como \parno. una ficha de espacio "la línea en blanco equivale a \par"

Tenga en cuenta que la primera nueva línea siempre crea un espacio, las siguientes crean \paruna línea en blanco que suele equivaler a space\par.

Respuesta2

Los personajes tienen un código de categoría; ellospodergenerar una ficha de personaje durante la fase de tokenización, perono necesitaa.

Los códigos de categoría se utilizan con dos propósitos: se analizan durante la tokenización (cuando TeX absorbe texto de un archivo de entrada o del terminal) pero también durante el procesamiento de la lista de tokens.

Sólo caracteres con código de categoría.

1 2 3 4 6 7 8 10 11 12 13

puede generar tokens de personajes (con el mismo código de categoría), respectivamente

comenzar grupo
finalizar grupo
cambio matemático parámetro
de alineación superíndice subíndice espacio letra otro carácter carácter activo






Los caracteres con código de categoría 0 5 9 14 15nuncagenere un token de carácter con el mismo código de categoría: no hay manera de que un token de carácter con esos códigos de categoría pueda pasar al procesador de token interno de TeX:

  • un carácter con código de categoría 0 desencadena la formación de una secuencia de control

  • un carácter con código de categoría 9 se ignora

  • un carácter con código de categoría 15 genera un error y luego se ignora

  • un carácter con código de categoría 14 le dice al procesador de tokenización que lo ignore junto con todos los demás caracteres en la línea

Más interesante es el código de categoría 5, que es el objeto de su pregunta. Cuando TeX encuentra uno, descarta lo que quede en la línea de entrada, genera uncarácter espacialcon el código de carácter 32 y el código de categoría 10 como si hubiera estado en la línea desde el principio y configura el escáner en el estado especial de ignorar los espacios en blanco (código de categoría 10) hasta llegar a algo diferente: si se trata de otro carácter del código de categoría 5, TeX genera un \partoken; de lo contrario, ingresa al estado normal.

Nótese el énfasis encarácter espacialarriba: este carácter de espacio se tokeniza de acuerdo con las reglas normales, por lo que se ignorará si sigue a una palabra de control (como \foo) pero no después de un símbolo de control (como \~).

Una consecuencia de esto es que las siguientes entradas

\foo\baz

\foo \baz

\foo \baz

son completamente equivalentes. Tenga en cuenta que si el final de línea en la última entrada generó unficha espacial, habría una diferencia. Pero de hecho uncarácter espacial(aún no tokenizado) se genera en su lugar.

Nota.Lo dicho anteriormente sobre los caracteres ignorados puede resultar engañoso cuando se lo confronta con la formación de palabras de control. La formación de una palabra de control comienza con un carácter de código de categoría 0 seguido de uno de código de categoría 11. Cualquier carácter con un código de categoría diferente de 11 detendrá el escaneo, provocará la tokenización de la palabra de control formada y será examinado nuevamente (por ser ignorado, por ejemplo, en caso de que tenga el código de categoría 9).

Anexo sobre XeTeX y LuaTeX.Cuando un archivo codificado en UTF-8 se envía a los motores compatibles con Unicode, es indiferente si un carácter tiene una longitud única, dos, tres o cuatro bytes en su representación UTF-8. Estos dos motores realizan un paso preliminar para transformar combinaciones UTF-8 en entidades Unicode, por lo que lo que ve el procesador de tokenización es solo un carácter (con su código de categoría asignado en la tabla de inicialización). Los dos motores también son capaces de soportar UTF-16 o UTF-32, little o big endian.

Respuesta3

TeX lee la entrada línea por línea: se leerá y procesará una línea de entrada. Luego se leerá y procesará otra línea de entrada. ...

Una de las primeras cosas que hace TeX después de leer una línea de entrada es convertir los caracteres del esquema de codificación de caracteres de la plataforma informática al esquema de codificación de caracteres interno del motor TeX. Con los motores TeX tradicionales, el esquema de codificación de caracteres interno es ASCII, el Código Estándar Americano para el Intercambio de Información. Con los motores TeX basados ​​en LuaTeX o XeTeX, el esquema de codificación de caracteres interno es Unicode, del cual ASCII es un subconjunto estricto.

Después de eso, TeX elimina cualquier carácter de espacio en el extremo derecho de la línea. Más precisamente: después de eso, TeX elimina cualquier carácter en el extremo derecho de la línea cuyo código de carácter sea 32 (. 32 es el número del punto de código del carácter de espacio tanto en ASCII como en Unicode).

Luego TeX inserta un carácter en el extremo derecho de la línea cuyo código de carácter es igual al valor del parámetro entero\endlinechar.
Normalmente el valor de \endlinechares 13 y el código de categoría del carácter 13 (carácter de retorno) es 5 (fin de línea).

Esto implica que normalmente TeX encuentra un carácter cuyo código de categoría es 5 (fin de línea) cuando, durante la tokenización, la línea llega al final de la línea.

Luego TeX comienza a tokenizar la línea. Es decir, TeX "mira" los caracteres que contiene la línea y produce tokens de secuencia de control y tokens de caracteres según la tabla de códigos de categorías y según el estado del aparato de lectura.

En el momento de leer y tokenizar la entrada, el aparato de lectura de TeX puede estar en uno de tres estados:

Estado S:Saltarse espacios en blanco. El aparato de lectura estará en estado S.

  • después de procesar un carácter de la entrada cuyo código de categoría es 10 (espacio).
  • después de procesar una secuencia de dos caracteres iguales de código de categoría 7(superíndice) seguido de una secuencia de dos caracteres que forman el código de carácter en notación hexadecimal minúscula de un carácter cuyo código de categoría es 10(espacio).
    [Ejemplo: normalmente el código de categoría de ^es 7 (superíndice), mientras que el código de categoría del carácter 32 (carácter de espacio; hexadecimal 20) suele ser 10 (espacio). Por lo tanto, la notación ^^20generalmente se trata como si se procesara el carácter 32 (espacio) de la entrada cuyo código de categoría generalmente es 10 (espacio).]
  • después de procesar una secuencia de dos caracteres iguales del código de categoría 7 (superíndice) seguidos de un carácter donde, en caso de que el código de carácter del carácter esté en el rango de 64 a 127, el código de categoría del carácter cuyo código de carácter se obtiene restando 64 es 10 (espacio).
    [Ejemplo: Como el código de categoría de ^normalmente es 7 (superíndice) y el código de carácter de `es 96 mientras que 96-64=32 y el código de categoría del carácter 32 (carácter de espacio) normalmente es 10 (espacio), la notación ^^`generalmente se trata como procesar el carácter 32 (espacio) de la entrada cuyo código de categoría suele ser 10 (espacio).]
  • después de procesar una secuencia de dos caracteres iguales del código de categoría 7 (superíndice) seguidos de un carácter donde, en caso de que el código de carácter del carácter esté en el rango de 0 a 63, el código de categoría del carácter cuyo código de carácter se obtiene sumando 64 es 10 (espacio).
  • después de producir un token de palabra de control.
  • después de producir un token de símbolo de control cuyo nombre está formado por un carácter de código de categoría 10 (espacio). Por ejemplo, después de producir la ficha del símbolo de control \␣(espacio de control).

Mientras está en el estado S, tanto procesar un carácter cuyo código de categoría es 10 (espacio) como procesar una ^^..secuencia/ <superscript-char><superscript-char>..secuencia considerada equivalente a un carácter de código de categoría 10 (espacio) no producirá ningún token ni cambiará el estado del aparato de lectura.

Normalmente, el carácter de espacio (código de carácter 32) y el carácter de tabulación horizontal (código de carácter 9) son los únicos caracteres cuyo código de categoría es 10 (espacio).

Es por eso que puede tener varios caracteres de espacio consecutivos o caracteres de tabulación horizontal en la entrada, lo que generalmente produce solo un token de espacio, lo que a su vez produce cualquier pegamento horizontal para solo un espacio horizontal en el caso de que TeX esté en uno de los modos en los que los tokens de espacio producen. pegamento horizontal (es decir, en modo horizontal, en modo horizontal restringido pero ni en modo vertical, ni en modo vertical interno, ni en modo matemático, ni en modo matemático de visualización).

Estado M:Medio de línea. El aparato de lectura estará en el estado M.

  • después de producir una ficha de carácter que no sea un espacio.
  • después de producir un token de símbolo de control cuyo nombre está formado por un carácter que no es del código de categoría 10 (espacio).

Mientras está en el estado M, procesar un carácter cuyo código de categoría es 10 (espacio) y procesar una ^^..secuencia/ <superscript-char><superscript-char>..secuencia considerada equivalente a un carácter de código de categoría 10 (espacio) producirá un token de espacio, es decir, un token de carácter cuyo charcode es 32 (carácter de espacio) y cuyo catcode es 10 (espacio), y cambiar el estado del aparato de lectura al estado S.

Estado N:Nueva línea. El aparato de lectura está en el estado N cuando está a punto de comenzar a leer otra línea de entrada. Mientras está en el estado N, procesar un carácter cuyo código de categoría es 10 (espacio) y procesar una ^^..secuencia/ <superscript-char><superscript-char>..secuencia considerada equivalente a un carácter de código de categoría 10 (espacio) no producirá ningún token ni cambiará el estado del aparato de lectura.

Si TeX encuentra un carácter del código de categoría 5 (fin de línea) mientras el aparato de lectura está en el estado S, TeX no producirá ningún token.

Si TeX encuentra un carácter del código de categoría 5 (fin de línea) mientras el aparato de lectura está en el estado M, TeX producirá un token de espacio, es decir, un token de carácter cuyo código de carácter es 32 (carácter de espacio) y cuyo código de cat es 10 (espacio ).

Si TeX encuentra un carácter del código de categoría 5 (fin de línea) mientras el aparato de lectura está en el estado N, TeX producirá la palabra de control token \par.

Después de encontrar un carácter del código de categoría 5 (fin de línea), TeX- no importa en qué estado se encuentre el aparato de lectura -en cualquier caso, elimine cualquier información adicional en la línea actual y comience a leer otra línea de entrada. Por la presente, el aparato de lectura de TeX pasará al estado N.

Debido a lo mencionado anteriormente, \endlinechargeneralmente una línea vacía después de una línea no vacía dará como resultado que TeX procese dos caracteres de retorno consecutivos (código de carácter 13) cuyo código de categoría es 5 (fin de línea).

En el momento de encontrar el primero de estos caracteres de retorno, que está en la línea no vacía, el aparato de lectura podría estar en el estado S o en el estado M y, por lo tanto, el primero podría no dar ningún token o dar un token de espacio. .
En cualquier caso, después de encontrar el primero de estos caracteres de retorno, el aparato de lectura pasará al estado N. Por lo tantoen el momento de encontrar el segundo de estos caracteres de retorno, el aparato de lectura estará en el estado N y el segundo de estos caracteres de retorno producirá la palabra de control token \par.
Es por eso que normalmente una línea vacía se trata como un "salto de párrafo"/como el token de palabra de control \parque generalmente (si no se redefine) es una directiva para dividir en líneas y componer como un párrafo de texto el material recopilado/reunido hasta ahora.

Esto significa que puede suceder que lo último dentro de un párrafo sea una ficha de espacio que produzca pegamento horizontal. Tenga en cuenta que TeX generalmente descarta dicho pegamento horizontal al final de un párrafo y el pegamento de acuerdo con los valores del \parfillskipparámetro -glue se adjunta al final de un párrafo.

información relacionada