![Pasar una cadena que contiene códigos cat "especiales" (especialmente `_`) al comando NewDocumentCommand personalizado](https://rvso.com/image/449643/Pasar%20una%20cadena%20que%20contiene%20c%C3%B3digos%20cat%20%22especiales%22%20(especialmente%20%60_%60)%20al%20comando%20NewDocumentCommand%20personalizado.png)
¿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 \NewDocumentCommand
burbuja expl3/xparse/?
No quiero usar v
argumentos; 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 v
argumentos 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 , unv
argumento 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.