
Относится к вопросуЧто делают \makeatletter и \makeatother?для LaTeX2e, здесь относится к LaTeX3
Что делать \ExplSyntaxOn
и \ExplSyntaxOff
делать?
решение1
Язык кодирования LaTeX3, expl3
, использует :
и _
как «буквы» в именах функций и переменных. Это позволяет использовать expl3
материал уровня кода в документе
\cs_new:Npn .... % fails: command \cs followed by characters '_', 'n', 'e', 'w', etc.
\ExplSyntaxOn
\cs_new:Npn .... % works here: command name \cs_new:Npn
Команда \ExplSyntaxOn
активирует это, а также изменяет обработку пробелов и окончаний строк таким образом, что они игнорируются, что означает, что
\ExplSyntaxOn
\cs_new:Npn \my_function:nn #1#2
{
% Code hre
}
не требуется %
в конце каждой строки (по сравнению с «нормальным» кодом LaTeX2e). Чтобы разрешить включение пробелов в вывод, ~
преобразуется в «нормальный» пробел с помощью \ExplSyntaxOn
. Обратите внимание, что это изменение в поведении пробелов не является существенным для expl3
имен доступа, но эти два понятия тесно связаны друг с другом, поскольку их сочетание обеспечивает «более ясное» программирование в expl3
.
\ExplSyntaxOff
отменяет это, возвращая :
и _
к ~
их значениям до этого \ExplSyntaxOn
и делая пробелы снова «важными».
На техническом уровне идея кодов категорий в названиях команд точно такая же, как и вЧто делают \makeatletter и \makeatother?, хотя \ExplSyntax...
переключатели делают больше.
Пара замечаний по поводу обработки ~
внутри блока кода. Во-первых, как ~
и «пробел» внутри блока кода, a ~
в начале строки игнорируется TeX
\ExplSyntaxOn
~ \cs_new:Npn ....
точно такой же как
\ExplSyntaxOn
\cs_new:Npn ....
так как «пробел» игнорируется.
Во-вторых, while ~
— это «пробел» внутри блока кода, \␣
и \~
они по-прежнему различимы и имеют определения LaTeX2e.
Для полноты картины следует обсудить еще несколько деталей. \ExplSyntaxOn
Также соответствующим образом устанавливает коды для других символов, которые неявно являются частью его синтаксиса:
- TAB — игнорируется (как и пробелы)
"
— «другой» символ, необходимый для шестнадцатеричного ввода, например\int_eval:n { "F }
(= 15)&
— символ выравнивания для табличного материала^
— верхний индекс для^^64
обозначения стиля|
— символ «другой», необходимый дляexpl3
булевых выражений
решение2
Хочу добавить немного информации о комбинации макросов ядра LaTeX2e и функций expl3. Команда \ExplSyntaxOn
не изменяет catcode специального токена @
. Поэтому для комбинации макросов ядра LaTeX2e и функций expl3 вам также придется вызывать \makeatletter
:
\ExplSyntaxOn
\makeatletter
\cs_set:Npn \@maketitle…