Pasar una cadena que contiene códigos cat "especiales" (especialmente `_`) al comando NewDocumentCommand personalizado

Pasar una cadena que contiene códigos cat "especiales" (especialmente `_`) al comando NewDocumentCommand personalizado

¿Cómo puedo pasar un guión bajo a \newcommand correctamente?sugiere que la solución es utilizar un comando sin argumentos que cambie el código cat de _, antes de expandirse al comando real.

Eso es todo lo contrario de por qué me gustaría usar \NewDocumentCommand, ya que es un tipo de argumento un poco incómodo y también confuso.

¿Hay alguna manera de pasar cadenas que contengan guiones bajos (nombres de archivos, por cierto) sin abandonar la comodidad de mi \NewDocumentCommandburbuja expl3/xparse/?

No quiero usar vargumentos; Realmente debería funcionar como una macro normal \includechapter{foo_bar}y no como \includechapter!foo_bar!.


Mi código actualmente:

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

La construcción se rompe al llegar

\includechapter{foo_bar}

con

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

Respuesta1

El problema es donde dices

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

porque un guión bajo en el nombre del archivo activaría el modo matemático.

Solución: cambiar a

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

Respuesta2

La solución en este caso es utilizar vargumentos de tipo:

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

Esto aún requiere más arreglos, ya que el argumento pasado debe procesarse antes de poder componerse si contiene guiones bajos.

Por suerte, no quiero utilizar esta macro como argumento para otra función (usrguide3.pdf):

v: Lee un argumento 'textualmente', entre el siguiente carácter y su siguiente aparición, de forma similar al argumento del comando LATEX 2ε \verb. Por lo tanto , un vargumento de tipo se lee entre dos caracteres idénticos, que no pueden ser ninguno de %, \, #, {o . El argumento textual también se puede encerrar entre llaves y .}{}Un comando con un argumento textual producirá un error cuando aparezca dentro de un argumento de otra función.

información relacionada