
Ich muss eine Zeichenfolge mit variabler Größe erstellen, die aus einer geraden Anzahl lateinischer Buchstaben besteht, wobei jedes Paar das Format hat a\textrightarrow A;
. Jedes Paar ist von den anderen Paaren durch einen Leerraum (hier beispielsweise 1 cm) getrennt. Dazu definiere ich einen Befehl \midarrow
und verwende \regex_replace
von expl3
, um das Argument von zu ändern \midarrow
.
Ich möchte \midarrow
konvertieren
„a,A;b,B;c,C“ zu „(a->A); (b->B); (c->C)“
„a,A;b,B;c,C;d,D“ zu „(a->A); (b->B); (c->C); (d->D)“
"->" oben sollten tatsächliche Pfeile sein, die erzeugt werden von
\textrightarrow
Der MWE lautet wie folgt:
\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}
Als Ergebnis erhalte ich jedoch Müll. Wie stelle ich sicher, dass das Ergebnis \regex_replace_all
von pdfLaTeX kompiliert wird und die gewünschte Ausgabe erzeugt?
PS: Ich beherrsche Latex3 nicht. Ich habe lediglich Code, den ich auf dieser Site gefunden habe, wiederverwendet und für meine Zwecke geändert.
Antwort1
Im Ersetzungstext sind besondere Regeln zu beachten:
\c{cmd}
Wird zur Darstellung einer Steuersequenz verwendet\cmd
.- Verwenden Sie
\cB\{
und\cE\}
zur DarstellungBegin undt2. Gruppenklammer. - Um die Kategoriecodes sicherzustellen, maskieren Sie jedes druckbare Zeichen außer
a-zA-Z0-9
. Verwenden Sie beispielsweise ,\(
um das Zeichen darzustellen(
, und verwenden Sie ,(...)
um eine Erfassungsgruppe darzustellen. (Danke für den Kommentar von @frougon.)
Daher kann Ihr Beispiel wie folgt geändert werden:
\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}
Verwenden Sie diedokumentiereninterface3.pdf
, Teil XXVII als ausführliche Einführung in l3regex
die Bibliothek.
Antwort2
\regex_replace:nnN
Ich würde ihn für diese Arbeit nicht verwenden .
Mein Vorschlag ist, die Eingabe an den Semikolons aufzuteilen, dann auf jedes Element einen Befehl für den Pfeil anzuwenden und schließlich die Sequenz mit dem gewünschten Abstand zwischen den Elementen zu verwenden.
Die Pfeilfunktion nutzt die Tatsache, dass Sie zwei durch Kommas getrennte Elemente haben und es sich daher um eine gute Eingabe für ein handelt 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}
\midarrow{a,A;b,B;c,C}
Dabei ist es unerheblich, ob Sie
\midarrow{
a, A;
b, B;
c, C
}