![Passando string contendo catcodes "especiais" (especialmente `_`) para o comando NewDocumentCommand personalizado](https://rvso.com/image/449643/Passando%20string%20contendo%20catcodes%20%22especiais%22%20(especialmente%20%60_%60)%20para%20o%20comando%20NewDocumentCommand%20personalizado.png)
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/ \NewDocumentCommand
bubble?
Não quero usar v
argumentos; 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 v
argumentos 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, umv
argumento 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.