Передача строки, содержащей «специальные» коды (особенно `_`), в пользовательскую команду NewDocumentCommand

Передача строки, содержащей «специальные» коды (особенно `_`), в пользовательскую команду NewDocumentCommand

Как правильно передать подчеркивание в \newcommand?предлагает решение использовать команду с нулевым аргументом, которая изменяет catcode _, прежде чем расширяться до фактической команды.

Это как раз противоположно тому, почему я хотел бы использовать \NewDocumentCommand, поскольку это довольно неудобно и также запутывает типы аргументов.

Есть ли способ передавать строки, содержащие подчеркивания (кстати, имена файлов), не покидая удобного \NewDocumentCommandпузыря expl3/xparse/?

Я не хочу использовать vаргументы; он должен работать как обычный макрос, \includechapter{foo_bar}а не как \includechapter!foo_bar!.


Мой код на данный момент:

%%% Chapter Inclusion Macros
\RequirePackage{expl3}
\ExplSyntaxOn
% Command to include chapter files, if
% either the exclusive chapter list is empty,
% or said chapter is in there
\cs_set:Npn \cel_includechapter:n #1 {
  % Check whether list is empty
  \clist_if_empty:NTF
  \g_cel_enabled_clist % which list
  {\include{#1/#1}} % if empty, just include
  { % else
    % check whether argument in list of enabled chapters
    \clist_if_in:NnTF 
    \g_cel_enabled_clist % in which list
    {#1} % which element to look for
    {\include{#1/#1}} % if in there
    {\chapter{#1~(currently~disabled)}} %if not in there
  }
}
% user-facing command \includechapter
% includes chaptername/chaptername
% if enabled
\NewDocumentCommand{\includechapter}{m}{
  \cel_includechapter:n{#1}
}
\NewDocumentCommand{\enableChapter}{m}{
  \clist_put_right:Nn \g_cel_enabled_clist {#1}
}
\ExplSyntaxOff

Сборка ломается при достижении

\includechapter{foo_bar}

с

! Missing $ inserted.
<inserted text>
                $
l.147 \includechapter{foo_bar}

решение1

Проблема в том, где вы говорите

{\chapter{#1~(currently~disabled)}} %if not in there

поскольку подчеркивание в имени файла активирует математический режим.

Решение: изменить на

{\chapter{\tl_to_str:n {#1}~(currently~disabled)}} %if not in there

решение2

Решением в этом случае является использование vаргументов -type:

\NewDocumentCommand{\includechapter}{v}{
  \cel_includechapter:n{#1}
}
\NewDocumentCommand{\enableChapter}{v}{
  \clist_put_right:Nn \g_cel_enabled_clist {#1}
}

Это все еще требует дальнейшего исправления, поскольку переданный аргумент должен быть обработан, прежде чем его можно будет набрать, если он содержит подчеркивания.

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

v: Считывает аргумент 'дословно', между следующим символом и его следующим вхождением, аналогично аргументу команды LATEX 2ε \verb. Таким образом, vаргумент -type считывается между двумя идентичными символами, которые не могут быть ни одним из %, \, #, {, } или . Дословный аргумент также может быть заключен в фигурные скобки { и }.Команда с дословным аргументом вызовет ошибку, если она появится внутри аргумента другой функции.

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