Passando string contendo catcodes "especiais" (especialmente `_`) para o comando NewDocumentCommand personalizado

Passando string contendo catcodes "especiais" (especialmente `_`) para o comando NewDocumentCommand personalizado

Como posso passar o sublinhado para \newcommand corretamente?sugere que a solução é usar um comando com argumento zero que altera o catcode de _, antes de expandir para o comando real.

Isso é o oposto do motivo pelo qual eu gostaria de usar \NewDocumentCommand, pois é meio estranho e também ofusca os tipos de argumento.

Existe uma maneira de passar strings contendo sublinhados (nomes de arquivos, aliás) sem sair do conforto do meu expl3/xparse/ \NewDocumentCommandbubble?

Não quero usar vargumentos; realmente deveria funcionar como uma macro normal \includechapter{foo_bar}e não como \includechapter!foo_bar!.


Meu código atualmente:

%%% 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

A construção quebra ao atingir

\includechapter{foo_bar}

com

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

Responder1

O problema é onde você diz

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

porque um sublinhado no nome do arquivo acionaria o modo matemático.

Solução: mude para

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

Responder2

A solução neste caso é usar vargumentos do tipo:

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

Isso ainda requer mais ajustes, já que o argumento passado precisa ser processado antes de poder ser digitado se contiver sublinhados.

Felizmente, não quero usar esta macro como argumento para outra função (usrguide3.pdf):

v: Lê um argumento 'literalmente', entre o caracter seguinte e a sua próxima ocorrência, de forma semelhante ao argumento do comando LATEX 2ε \verb. Assim, um vargumento do tipo é lido entre dois caracteres idênticos, que não podem ser nenhum dos seguintes caracteres %: \, , #, {, } ou . O argumento literal também pode ser colocado entre colchetes { e }.Um comando com um argumento literal produzirá um erro quando aparecer dentro de um argumento de outra função.

informação relacionada