Compilación de Tex después del reemplazo de expresiones regulares

Compilación de Tex después del reemplazo de expresiones regulares

Necesito producir una cadena de tamaño variable que consta de un número par de letras latinas, cada par con el formato a\textrightarrow A;. Cada par está separado de los demás por un espacio vacío (aquí 1 cm, por ejemplo). Para esto defino un comando \midarrowy uso \regex_replacede expl3para modificar el argumento de \midarrow.

quiero \midarrowconvertir

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

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

  3. "->" arriba deberían ser flechas reales producidas por\textrightarrow

El MWE es el siguiente:

\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}

Sin embargo, como resultado obtengo basura. ¿Cómo me aseguro de que \regex_replace_allpdfLaTeX debe compilar el resultado y producir el resultado deseado?

PD: No soy competente en látex3. Acabo de reutilizar y modificar el código que encontré en este sitio para adaptarlo a mis propósitos.

Respuesta1

Debes seguir reglas especiales en el texto de reemplazo:

  • Se utiliza \c{cmd}para representar la secuencia de control \cmd.
  • Usar \cB\{y \cE\}representarbcomenzar ymiy llave de grupo, respectivamente.
  • Para garantizar los códigos de categoría, escape todos los caracteres imprimibles que no sean a-zA-Z0-9. Por ejemplo, utilícelo \(para representar un carácter (y utilícelo (...)para representar un grupo de captura. (Gracias por el comentario de @frougon).

Por lo tanto, su ejemplo se puede modificar para que sea

\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}

Utilizar eldocumentointerface3.pdf, parte XXVII como una introducción completa a l3regexla biblioteca.

Respuesta2

No lo usaría \regex_replace:nnNpara este trabajo.

Mi sugerencia es dividir la entrada en punto y coma; luego aplique a cada elemento un comando para la flecha y finalmente use la secuencia con el espacio deseado entre elementos.

La función de creación de flechas utiliza el hecho de que tiene dos elementos separados por una coma, por lo que es una buena entrada para un archivo 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}

ingrese la descripción de la imagen aquí

Es irrelevante si ingresa \midarrow{a,A;b,B;c,C}o

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

información relacionada