Compilação Tex após substituição de regex

Compilação Tex após substituição de regex

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 \midarrowe uso \regex_replacede expl3para modificar o argumento de \midarrow.

Eu quero \midarrowconverter

  1. "a,A;b,B;c,C" para "(a->A); (b->B); (c->C)"

  2. "a,A;b,B;c,C;d,D" para "(a->A); (b->B); (c->C); (d->D)"

  3. "->" 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_alldeve 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 à l3regexbiblioteca.

Responder2

Eu não usaria \regex_replace:nnNpara 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}

insira a descrição da imagem aqui

É irrelevante se você inserir \midarrow{a,A;b,B;c,C}ou

\midarrow{
  a, A;
  b, B;
  c, C
}

informação relacionada