
Preciso produzir uma string de tamanho variável consistindo em um número par de letras latinas, sendo cada par no formato a\textrightarrow A;
. Cada par separado dos outros pares por algum espaço vazio (aqui 1cm por exemplo). Para isso defino um comando \midarrow
e uso \regex_replace
de expl3
para modificar o argumento de \midarrow
.
Eu quero \midarrow
converter
"a,A;b,B;c,C" para "(a->A); (b->B); (c->C)"
"a,A;b,B;c,C;d,D" para "(a->A); (b->B); (c->C); (d->D)"
"->" acima devem ser setas reais produzidas por
\textrightarrow
O MWE é o seguinte:
\documentclass[a4paper,11pt]{article}
\usepackage{expl3,xparse}
\usepackage{textcomp}
\ExplSyntaxOn
\NewDocumentCommand{\midarrow}{m}
{
\tl_set:Nn \l_tmpa_tl { (#1) }
\regex_replace_all:nnN { , } { \textrightarrow } \l_tmpa_tl
\regex_replace_all:nnN { ; } { );\hspace{1cm}( } \l_tmpa_tl
\tl_use:N \l_tmpa_tl
}
\ExplSyntaxOff
\begin{document}
\midarrow{a,A;b,B;c,C}
\end{document}
No entanto, recebo lixo como resultado. Como posso ter certeza de que o resultado \regex_replace_all
deve ser compilado pelo pdfLaTeX e produzir a saída desejada?
PS: Não sou proficiente em latex3. Acabei de reutilizar e modificar o código que encontrei neste site para atender aos meus propósitos.
Responder1
Você deve seguir regras especiais no texto de substituição:
- Use
\c{cmd}
para representar a sequência de controle\cmd
. - Usar
\cB\{
e\cE\}
representarbcomeçar eesegunda chave de grupo, respectivamente. - Para garantir os códigos de categoria, escape de todos os caracteres imprimíveis que não sejam
a-zA-Z0-9
. Por exemplo, use\(
para representar character(
e use(...)
para representar um grupo de captura. (Obrigado pelo comentário de @frougon.)
Portanto, seu exemplo pode ser modificado para ser
\documentclass[a4paper,11pt]{article}
\usepackage{expl3,xparse}
\usepackage{textcomp}
\ExplSyntaxOn
\NewDocumentCommand{\midarrow}{m}
{
\tl_set:Nn \l_tmpa_tl { (#1) }
\regex_replace_all:nnN { \, } { \c{textrightarrow} } \l_tmpa_tl
\regex_replace_all:nnN { \; } { \)\; \c{hspace}\cB\{ 1cm \cE\} \( } \l_tmpa_tl
\tl_use:N \l_tmpa_tl
}
\ExplSyntaxOff
\begin{document}
\midarrow{a,A;b,B;c,C}
\end{document}
Use odocumentointerface3.pdf
, parte XXVII como uma introdução completa à l3regex
biblioteca.
Responder2
Eu não usaria \regex_replace:nnN
para este trabalho.
Minha sugestão é dividir a entrada em ponto e vírgula; em seguida, aplique a cada item um comando para a seta e por fim utilize a sequência com o espaço desejado entre os itens.
A função de criação de setas usa o fato de você ter dois itens separados por vírgula, portanto, é uma boa entrada para um arquivo clist
.
\documentclass[a4paper,11pt]{article}
\usepackage{expl3,xparse}
\usepackage{textcomp}
\ExplSyntaxOn
\NewDocumentCommand{\midarrow}{m}
{
\seq_set_split:Nnn \l_magguu_arrows_in_seq { ; } { #1 }
\seq_set_map:NNn \l_magguu_arrows_out_seq \l_magguu_arrows_in_seq
{ \magguu_arrows_make:n { ##1 } }
\seq_use:Nn \l_magguu_arrows_out_seq { \hspace{1cm} }
}
\cs_new_protected:Nn \magguu_arrows_make:n
{
\clist_item:nn { #1 } { 1 }
\textrightarrow
\clist_item:nn { #1 } { 2 }
}
\ExplSyntaxOff
\begin{document}
\midarrow{a,A;b,B;c,C}
\end{document}
É irrelevante se você inserir \midarrow{a,A;b,B;c,C}
ou
\midarrow{
a, A;
b, B;
c, C
}