Что делают ExplSyntaxOn и ExplSyntaxOff?

Что делают ExplSyntaxOn и ExplSyntaxOff?

Относится к вопросуЧто делают \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…

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