Quando o catcode 5 "fim da linha" entra em ação?

Quando o catcode 5 "fim da linha" entra em ação?

Meu objetivo é entender a relação entrebytes de caracteresefichas de personagemem relação aos novos bytes de linha. Provavelmente não tenho meus fatos corretos.

Quando o TeX lê um arquivo de bytes, a codificação deve ser considerada. Deixando isso de lado,

  • Podemos observar que umbyte de caractere de nova linha única(assumindo LF e CRLF) é convertido em um espaço. Mas o que acontece nos bastidores? Um token é criado usando um par de dados (número de byte LF, catcode=10)?

  • Dois bytes consecutivos de caracteres de nova linhatornar-se um único token com o par de dados (número de bytes de espaço, catcode 5)?

Quando o catcode 5 "fim da linha" entra em ação?

Eu sei que o LaTeX insere a \parquando dois finais de linha consecutivos são encontrados.

Código

Tentei mostrar visualmente os tokens com o catcode 5, mas ainda não tenho certeza se \tmprealmente se torna o 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}

insira a descrição da imagem aqui

Notas

Responder1

Nunca há tokens com catcode 5.

Initex configura

\catcode`\^^M=5

Mas isso funciona de maneira semelhante a

\catcode`\%=14

o que torna %o catcode 14, mas não há tokens com esse catcode. Se um caractere com catcode 14 for verificado, esse caractere e o restante da linha serão descartados.

Um caractere de catcode 5 gera um caractere de espaço e coloca o scanner do tex em um modo especial que faz com que os caracteres imediatamente seguintes do catcode 10 sejam descartados "espaço em branco no início de uma linha" e um caractere seguinte do catcode 5 seja tokenizado como \parnão um token de espaço "linha em branco é equivalente a \par"

Portanto, observe que a primeira nova linha sempre deixa um espaço, as subsequentes fazem \parcom que uma linha em branco geralmente seja equivalente a space\par.

Responder2

Os personagens possuem um código de categoria; elespodegeram um token de personagem durante a fase de tokenização, mas elesnão precisapara.

Os códigos de categoria são usados ​​com dois propósitos: eles são visualizados durante a tokenização (quando o TeX absorve texto de um arquivo de entrada ou do terminal), mas também durante o processamento da lista de tokens.

Apenas caracteres com código de categoria

1 2 3 4 6 7 8 10 11 12 13

pode gerar tokens de caracteres (com o mesmo código de categoria), respectivamente

grupo inicial
grupo final
matemática deslocamento parâmetro
de alinhamento sobrescrito subscrito letra de espaço outro caractere caractere ativo






Caracteres com código de categoria 0 5 9 14 15 serãonuncagerar um token de caractere com o mesmo código de categoria: não há como um token de caractere com esses códigos de categoria passar no processador de token interno do TeX:

  • um caractere com código de categoria 0 desencadeia a formação de uma sequência de controle

  • um caractere com código de categoria 9 é ignorado

  • um caractere com código de categoria 15 gera um erro e depois é ignorado

  • um caractere com código de categoria 14 diz ao processador de tokenização para ignorá-lo junto com todos os outros caracteres na linha

Mais interessante é o código da categoria 5, que é o objeto da sua pergunta. Quando o TeX encontra um, ele descarta o que resta na linha de entrada, gera umcaractere de espaçocom código de caractere 32 e código de categoria 10 como se estivesse na linha para começar e coloca o scanner no estado especial de ignorar espaços em branco (código de categoria 10) até chegar a algo diferente: se este for outro caractere de código de categoria 5, o TeX gera um \partoken, caso contrário entra no estado normal.

Observe a ênfase emcaractere de espaçoacima: este caractere de espaço é tokenizado de acordo com as regras normais, portanto será ignorado se seguir uma palavra de controle (como \foo), mas não após um símbolo de controle (como \~).

Uma consequência disso é que as seguintes entradas

\foo\baz

\foo \baz

\foo \baz

são completamente equivalentes. Observe que se o fim de linha na última entrada gerou umficha de espaço, haveria uma diferença. Mas na verdade umcaractere de espaço(ainda não tokenizado) é gerado.

Observação.O que foi dito acima sobre caracteres ignorados pode ser enganoso quando confrontado com a formação de palavras de controle. A formação de uma palavra de controle começa com um caractere de código de categoria 0 seguido por um de código de categoria 11. Qualquer caractere com código de categoria diferente de 11 interromperá a varredura, causará tokenização da palavra de controle formada e será examinado novamente (por ser ignorado, por exemplo, caso possua código de categoria 9).

Adendo sobre XeTeX e LuaTeX.Quando um arquivo codificado em UTF-8 é alimentado nos mecanismos compatíveis com Unicode, é irrelevante se um caractere tem um, dois, três ou quatro bytes de comprimento em sua representação UTF-8. Esses dois mecanismos realizam uma etapa preliminar ao transformar combinações UTF-8 em entidades Unicode, de modo que o que o processador de tokenização vê é apenas um caractere (com seu código de categoria conforme atribuído na tabela de inicialização). Os dois motores também são capazes de lidar com UTF-16 ou UTF-32, little ou big endian.

Responder3

TeX lê a entrada linha por linha: uma linha de entrada será lida e processada. Então outra linha de entrada será lida e processada. ...

Uma das primeiras coisas que o TeX faz depois de ler uma linha de entrada é converter os caracteres do esquema de codificação de caracteres da plataforma do computador para o esquema de codificação de caracteres interno do mecanismo TeX. Com os motores TeX tradicionais, o esquema interno de codificação de caracteres é ASCII, o American Standard Code for Information Interchange. Com motores TeX baseados em LuaTeX ou XeTeX, o esquema interno de codificação de caracteres é Unicode, do qual ASCII é um subconjunto estrito.

Depois disso, o TeX exclui qualquer caractere de espaço na extremidade direita da linha. Mais precisamente: depois disso, o TeX exclui qualquer caractere na extremidade direita da linha cujo código de caractere seja 32. (0,32 é o número do ponto de código do caractere de espaço tanto em ASCII quanto em Unicode.)

Então o TeX insere um caractere na extremidade direita da linha cujo código de caractere é igual ao valor do parâmetro inteiro\endlinechar.
Normalmente o valor de \endlinecharé 13 e o código de categoria do caractere 13 (caractere de retorno) é 5 (fim de linha).

Isso implica que normalmente o TeX encontra um caractere cujo código de categoria é 5 (fim de linha) quando durante a tokenização a linha atinge o final da linha.

Então o TeX começa a tokenizar a linha. Ou seja, o TeX “olha” para os caracteres que a linha contém e produz tokens de sequência de controle e tokens de caracteres de acordo com a tabela de códigos de categoria e de acordo com o estado do aparelho de leitura.

No momento da leitura e tokenização da entrada, o aparelho de leitura do TeX pode estar em um dos três estados:

Estado S:Ignorando espaços em branco. O aparelho de leitura estará no estado S

  • após processar um caractere da entrada cujo código de categoria é 10 (espaço).
  • após processar uma sequência de dois caracteres iguais de código de categoria 7(sobrescrito) seguida de uma sequência de dois caracteres formando o código de caracteres em notação hexadecimal minúscula de um caractere cujo código de categoria é 10(espaço).
    [Exemplo: Normalmente o código da categoria ^é 7 (sobrescrito), enquanto o código da categoria do caracter 32 (caractere de espaço; hex 20) geralmente é 10 (espaço). Portanto, a notação ^^20geralmente é tratada como o processamento do caractere 32 (caractere de espaço) da entrada cujo código de categoria geralmente é 10 (espaço).]
  • após processar uma sequência de dois caracteres iguais de código de categoria 7(sobrescrito) seguido de um caractere onde - caso o código do caractere esteja na faixa de 64 a 127 - o código da categoria do caractere cujo código de caractere é obtido pela subtração 64 é 10 (espaço).
    [Exemplo: Como o código da categoria ^geralmente é 7 (sobrescrito) e o código do caractere `é 96, enquanto 96-64 = 32 e o código da categoria do caractere 32 (caractere de espaço) geralmente é 10 (espaço), a notação ^^`geralmente é tratada como processar o caractere 32 (caractere de espaço) da entrada cujo código de categoria geralmente é 10 (espaço).]
  • após processar uma sequência de dois caracteres iguais de código de categoria 7(sobrescrito) seguido de um caractere onde - caso o código do caractere esteja na faixa de 0 a 63 - o código da categoria do caractere cujo código de caractere é obtido pela adição 64 é 10 (espaço).
  • depois de produzir um token de palavra de controle.
  • após produzir um token de símbolo de controle cujo nome é formado por um caractere de código de categoria 10(espaço). Por exemplo, após produzir o token do símbolo de controle \␣(espaço de controle).

Enquanto estiver no estado S, tanto o processamento de um caractere cujo código de categoria é 10(espaço) quanto o processamento de uma ^^..-sequência/ <superscript-char><superscript-char>..-sequência considerada equivalente a um caractere de código de categoria 10(espaço) resultará na não produção de nenhum token e na não alteração do estado do aparelho de leitura.

Normalmente, o caractere de espaço (código de caractere 32) e o caractere de tabulação horizontal (código de caractere 9) são os únicos caracteres cujo código de categoria é 10 (espaço).

É por isso que você pode ter vários caracteres de espaço consecutivos ou caracteres de tabulação horizontal na entrada, geralmente produzindo apenas um token de espaço, por sua vez produzindo qualquer cola horizontal para apenas um espaço horizontal no caso do TeX estar em um dos modos onde os tokens de espaço produzem cola horizontal (ou seja, no modo horizontal, no modo horizontal restrito, mas nem no modo vertical, nem no modo vertical interno, nem no modo matemático, nem no modo matemático de exibição).

Estado M:Meio da linha. O aparelho de leitura estará no estado M

  • depois de produzir um token de caractere não espacial.
  • após produzir um token de símbolo de controle cujo nome é formado por um caractere que não é do código de categoria 10 (espaço).

Enquanto estiver no estado M, tanto o processamento de um caractere cujo código de categoria é 10(espaço) quanto o processamento de uma ^^..-sequência/ <superscript-char><superscript-char>..-sequência considerada equivalente a um caractere de código de categoria 10(espaço) produzirão um token de espaço, ou seja, um token de caracter cujo charcode é 32 (caractere de espaço) e cujo catcode é 10 (espaço), e mudando o estado do aparelho de leitura para o estado S.

Estado N:Nova linha. O aparelho de leitura está no estado N quando está prestes a começar a ler outra linha de entrada. Enquanto estiver no estado N, tanto o processamento de um caractere cujo código de categoria é 10(espaço) quanto o processamento de uma ^^..-sequência/ <superscript-char><superscript-char>..-sequência considerada equivalente a um caractere de código de categoria 10(espaço) resultará na não produção de nenhum token e na não alteração do estado do aparelho de leitura.

Se o TeX encontrar um caractere de código de categoria 5 (fim de linha) enquanto o aparelho de leitura estiver no estado S, o TeX não produzirá nenhum token.

Se o TeX encontrar um caractere de código de categoria 5 (fim de linha) enquanto o aparelho de leitura estiver no estado M, o TeX produzirá um token de espaço, ou seja, um token de caractere cujo characode é 32 (caractere de espaço) e cujo catcode é 10 (espaço ).

Se o TeX encontrar um caractere de código de categoria 5 (fim de linha) enquanto o aparelho de leitura estiver no estado N, o TeX produzirá a palavra de controle token \par.

Depois de encontrar um caractere de código de categoria 5 (fim de linha), o TeX irá- não importa em que estado esteja o aparelho de leitura -em qualquer caso, deixe cair qualquer informação adicional na linha atual e comece a ler outra linha de entrada. Assim, o aparelho de leitura do TeX será alterado para o estado N.

Devido ao \endlinechar-thingie mencionado acima, geralmente uma linha vazia após uma linha não vazia resultará no TeX processar dois caracteres de retorno consecutivos (código de caractere 13) cujo código de categoria é 5 (fim de linha).

No momento de encontrar o primeiro desses caracteres de retorno, que está na linha não vazia, o aparelho de leitura pode estar no estado S ou no estado M e, portanto, o primeiro pode não produzir nenhum token ou gerar um token de espaço .
Em qualquer caso, após encontrar o primeiro destes caracteres de retorno, o aparelho de leitura será comutado para o estado N. Portantono momento de encontrar o segundo destes caracteres de retorno, o aparelho de leitura estará no estado N e o segundo destes caracteres de retorno produzirá a palavra de controlo token \par.
É por isso que geralmente uma linha vazia é tratada como uma "quebra de parágrafo"/como o token da palavra de controle \parque geralmente (se não for redefinido) é uma diretiva para quebrar em linhas e compor como um parágrafo de texto o material coletado/coletado até agora.

Isso significa que pode acontecer que a última coisa dentro de um parágrafo seja um símbolo de espaço produzindo cola horizontal. Esteja ciente de que essa cola horizontal no final de um parágrafo geralmente é descartada pelo TeX e a cola de acordo com os valores do \parfillskipparâmetro -glue é anexada no final de um parágrafo.

informação relacionada