Когда вступает в действие кокод 5 «конец строки»?

Когда вступает в действие кокод 5 «конец строки»?

Моя цель — понять взаимосвязь междубайты символовижетоны персонажейотносительно байтов новой строки. Вероятно, я не владею фактами прямо.

Когда TeX читает файл байтов, необходимо учитывать кодировку. Оставив это в стороне,

  • Мы можем наблюдать, чтоодин байт символа новой строки(предполагая, что LF и CRLF) преобразуется в пробел. Но что происходит за кулисами? Создается ли токен с использованием пары данных (номер байта LF, catcode=10)?

  • Два последовательных байта символа новой строкистать одним токеном с парой данных (номер байта пробела, код кота 5)?

Когда вступает в действие кокод 5 «конец строки»?

Я знаю, что LaTeX вставляет a \par, когда встречаются два последовательных окончания строки.

Код

Я попытался визуально отобразить токены с кодом catcode 5, но я все еще не уверен, \tmpдействительно ли они становятся кодом 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}

введите описание изображения здесь

Примечания

решение1

Токенов с кодом 5 не существует.

Initex устанавливает

\catcode`\^^M=5

Но это действует аналогично

\catcode`\%=14

что создает %catcode 14, но токенов с этим catcode нет. Если сканируется символ с catcode 14, то этот символ и остальная часть строки отбрасываются.

Символ с кодом catcode 5 генерирует символ пробела и переводит сканер tex в специальный режим, в котором следующие сразу за ним символы с кодом catcode 10 отбрасываются как «пробел в начале строки», а следующий за ним символ с кодом catcode 5 токенизируется как \parне являющийся символом пробела «пустая строка эквивалентна \par»

Обратите внимание, что первая новая строка всегда представляет собой пробел, последующие — пробел, \parпоэтому пустая строка обычно эквивалентна space\par.

решение2

Персонажи имеют код категории; ониможетгенерируют токен персонажа во время фазы токенизации, но ониНе надок.

Коды категорий используются в двух целях: они просматриваются во время токенизации (когда TeX получает текст из входного файла или терминала), а также во время обработки списка токенов.

Только символы с кодом категории

1 2 3 4 6 7 8 10 11 12 13

может генерировать токены символов (с тем же кодом категории), соответственно

начало группы
конец группы
математика сдвиг
выравнивание
параметр
верхний индекс
нижний индекс
пробел
буква
другой символ
активный символ

Персонажи с кодом категории 0 5 9 14 15 будутникогдасгенерировать токен символа с тем же кодом категории: токен символа с этими кодами категорий не может пройти через внутренний процессор токенов TeX:

  • символ с кодом категории 0 запускает формирование управляющей последовательности

  • символ с кодом категории 9 игнорируется

  • символ с кодом категории 15 вызывает ошибку, а затем игнорируется

  • символ с кодом категории 14 сообщает процессору токенизации о необходимости игнорировать его вместе со всеми остальными символами в строке

Более интересен код категории 5, который является объектом вашего вопроса. Когда TeX находит его, он отбрасывает все, что осталось на входной строке, генерируеткосмический символс кодом символа 32 и кодом категории 10, как если бы он был на линии изначально, и устанавливает сканер в особое состояние игнорирования пробелов (код категории 10) до тех пор, пока не дойдет до чего-то другого: если это другой символ с кодом категории 5, TeX генерирует токен \par, в противном случае переходит в обычное состояние.

Обратите внимание на акцент накосмический символвыше: этот символ пробела токенизирован в соответствии с обычными правилами, поэтому он будет проигнорирован, если следует за управляющим словом (например, \foo), но не после управляющего символа (например, \~).

Следствием этого является то, что следующие входы

\foo\baz

\foo \baz

\foo \baz

полностью эквивалентны. Обратите внимание, что если конец строки в последнем вводе сгенерировалкосмический жетон, то была бы разница. Но на самом делекосмический символ(еще не токенизирован) генерируется вместо этого.

Примечание.Сказанное выше об игнорируемых символах может ввести в заблуждение при столкновении с формированием контрольного слова. Формирование контрольного слова начинается с символа с кодом категории 0, за которым следует один из символов с кодом категории 11. Любой символ с кодом категории, отличным от 11, остановит сканирование, вызовет токенизацию сформированного контрольного слова и будет проверен заново (например, на предмет игнорирования, если у него код категории 9).

Дополнение о XeTeX и LuaTeX.Когда файл в кодировке UTF-8 подается в движки, поддерживающие Unicode, неважно, является ли символ одно-, двух-, трех- или четырехбайтовым в своем представлении UTF-8. Эти два движка выполняют предварительный шаг, преобразуя комбинации UTF-8 в сущности Unicode, поэтому процессор токенизации видит только один символ (с его кодом категории, назначенным в таблице инициализации). Эти два движка также способны работать с UTF-16 или UTF-32, с прямым или обратным порядком байтов.

решение3

TeX читает ввод построчно: Строка ввода будет прочитана и обработана. Затем будет прочитана и обработана другая строка ввода. ...

Одной из первых операций, которую TeX выполняет после считывания строки ввода, является преобразование символов из схемы кодировки символов компьютерной платформы во внутреннюю схему кодировки символов движка TeX. В традиционных движках TeX внутренняя схема кодировки символов — ASCII, Американский стандартный код для обмена информацией. В движках TeX на основе LuaTeX или XeTeX внутренняя схема кодировки символов — Unicode, строгим подмножеством которого является ASCII.

После этого TeX удаляет любой символ пробела в правом конце строки. Точнее: После этого TeX удаляет любой символ в правом конце строки, код символа которого равен 32. (. 32 — это номер кодовой точки символа пробела как в ASCII, так и в Unicode.)

Затем TeX вставляет символ в правый конец строки, код символа которого равен значению целочисленного параметра\endlinechar.
Обычно значение \endlinecharравно 13, а код категории символа 13 (символ возврата) равен 5 (конец строки).

Это означает, что обычно TeX встречает символ, код категории которого равен 5 (конец строки), когда во время токенизации строка достигает конца строки.

Затем TeX начинает токенизацию строки. То есть TeX «смотрит» на символы, которые содержит строка, и выдает токены управляющей последовательности и токены символов в соответствии с таблицей кодов категорий и в соответствии с состоянием считывающего аппарата.

Во время считывания и токенизации входных данных считывающий аппарат TeX может находиться в одном из трех состояний:

Состояния:Пропуск пробелов. Считывающий аппарат будет в состоянии S

  • после обработки символа из входных данных, код категории которого равен 10 (пробел).
  • после обработки последовательности из двух одинаковых символов с кодом категории 7 (верхний индекс), за которой следует последовательность из двух символов, образующих код символа в шестнадцатеричной записи в нижнем регистре для символа, код категории которого равен 10 (пробел).
    [Пример: обычно код категории ^равен 7 (верхний индекс), в то время как код категории символа 32 (символ пробела; hex 20) обычно равен 10 (пробел). Поэтому запись ^^20обычно рассматривается как обработка символа 32 (символ пробела) из входных данных, код категории которых обычно равен 10 (пробел).]
  • после обработки последовательности из двух одинаковых символов с кодом категории 7 (надстрочный индекс), за которыми следует символ, где - в случае, если код символа находится в диапазоне от 64 до 127 - код категории символа, код символа которого получен путем вычитания 64, равен 10 (пробел).
    [Пример: поскольку код категории ^обычно равен 7 (надстрочный индекс), а код символа равен `96, в то время как 96-64=32, а код категории символа 32 (символ пробела) обычно равен 10 (пробел), запись ^^`обычно рассматривается как обработка символа 32 (символ пробела) из входных данных, код категории которых обычно равен 10 (пробел).]
  • после обработки последовательности из двух одинаковых символов с кодом категории 7 (надстрочный индекс), за которыми следует символ, где - в случае, если код символа находится в диапазоне от 0 до 63 - код категории символа, код символа которого получен путем прибавления 64, равен 10 (пробел).
  • после создания токена контрольного слова.
  • после создания токена управляющего символа, имя которого образовано символом категории кода 10(пробел). Например, после создания токена управляющего символа \␣(управляющий пробел).

В состоянии S как обработка символа, код категории которого равен 10 (пробел), так и обработка -последовательности ^^../ <superscript-char><superscript-char>..-последовательности, считающейся эквивалентной символу с кодом категории 10 (пробел), приведут к тому, что никакой токена не будет создан, а состояние считывающего устройства не изменится.

Обычно единственными символами, код категории которых равен 10 (пробел), являются символ пробела (код символа 32) и символ горизонтальной табуляции (код символа 9).

Вот почему во входных данных может быть несколько последовательных символов пробела или символов горизонтальной табуляции, что обычно приводит к появлению только одного символа пробела, в свою очередь приводящего к горизонтальному склеиванию только для одного горизонтального пробела в случае, если TeX находится в одном из режимов, в которых символы пробела приводят к горизонтальному склеиванию (т. е. в горизонтальном режиме, в ограниченном горизонтальном режиме, но не в вертикальном режиме, не во внутреннем вертикальном режиме, не в математическом режиме и не в режиме отображения математических данных).

Состояние М:Середина строки. Считывающий аппарат будет в состоянии M

  • после создания токена символа, отличного от пробела.
  • после создания токена управляющего символа, имя которого образовано символом, не имеющим кода категории 10 (пробел).

В состоянии M обработка символа, код категории которого равен 10 (пробел), и обработка -последовательности ^^../ <superscript-char><superscript-char>..-последовательности, считающейся эквивалентной символу с кодом категории 10 (пробел), приведут к созданию токена пробела, т. е. токена символа, код категории которого равен 32 (символ пробела), а код категории равен 10 (пробел), и переключению состояния считывающего устройства в состояние S.

Штат N:Новая строка. Считывающее устройство находится в состоянии N, когда собирается начать считывать другую строку ввода. В состоянии N как обработка символа, код категории которого 10(пробел), так и обработка -последовательности ^^../ <superscript-char><superscript-char>..-последовательности, считающейся эквивалентной символу с кодом категории 10(пробел), приведет к тому, что никакой токена не будет создано и состояние считывающего устройства не изменится.

Если TeX встречает символ с кодом категории 5 (конец строки), когда считывающее устройство находится в состоянии S, TeX вообще не выдаст никакой токена.

Если TeX встречает символ с кодом категории 5 (конец строки), когда считывающее устройство находится в состоянии M, TeX выдаст токен пробела, т. е. токен символа, код символа которого равен 32 (символ пробела), а код символа равен 10 (пробел).

Если TeX встречает символ с кодом категории 5 (конец строки), когда считывающее устройство находится в состоянии N, TeX выдаст токен контрольного слова \par.

После встречи с символом категории кода 5 (конец строки) TeX- независимо от того, в каком состоянии находится считывающий аппарат -в любом случае отбросьте любую дальнейшую информацию на текущей строке и начните читать другую строку ввода. При этом считывающий аппарат TeX перейдет в состояние N.

Из-за вышеупомянутой \endlinecharособенности пустая строка после непустой строки обычно приводит к тому, что TeX обрабатывает два последовательных символа возврата каретки (код символа 13), код категории которых равен 5 (конец строки).

В момент встречи с первым из этих символов возврата, который находится в непустой строке, считывающий аппарат может находиться в состоянии S или в состоянии M, и поэтому первый может вообще не выдать маркер или выдать маркер пробела.
В любом случае после встречи с первым из этих символов возврата считывающий аппарат перейдет в состояние N. ПоэтомуВ момент встречи со вторым из этих символов возврата считывающее устройство будет находиться в состоянии N, а второй из этих символов возврата выдаст токен управляющего слова \par.
Вот почему обычно пустая строка обрабатывается как «разрыв абзаца»/как токен управляющего слова, \parкоторый обычно (если не переопределен) является директивой для разбиения на строки и набора в виде абзаца текста материала, собранного/собранного к настоящему моменту.

Это означает, что может случиться так, что последним в абзаце будет пробел, дающий горизонтальный клей. Имейте в виду, что такой горизонтальный клей в конце абзаца обычно отбрасывается TeX, а клей в соответствии со значениями параметра \parfillskip-glue-parameter присоединяется в конце абзаца.

Связанный контент