
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 \midarrow
y uso \regex_replace
de expl3
para modificar el argumento de \midarrow
.
quiero \midarrow
convertir
"a,A;b,B;c,C" a "(a->A); (b->B); (c->C)"
"a,A;b,B;c,C;d,D" a "(a->A); (b->B); (c->C); (d->D)"
"->" 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_all
pdfLaTeX 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 l3regex
la biblioteca.
Respuesta2
No lo usaría \regex_replace:nnN
para 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}
Es irrelevante si ingresa \midarrow{a,A;b,B;c,C}
o
\midarrow{
a, A;
b, B;
c, C
}