Was ist die beste Möglichkeit, eine Zeichenfolge in Zeichen zu zerlegen, jedes Zeichen einzeln zu verarbeiten und die Zeichen dann wieder zusammenzusetzen?

Was ist die beste Möglichkeit, eine Zeichenfolge in Zeichen zu zerlegen, jedes Zeichen einzeln zu verarbeiten und die Zeichen dann wieder zusammenzusetzen?

Ich möchte eine Zeichenfolge in einzelne Zeichen aufteilen, jedes Zeichen einzeln umwandeln und sie anschließend wieder zusammenfügen.

Etwas wie das:

\newcommand{\drawaboxaroundit}[1]{...}
\newcommand{\glue}{+}
\explodethenjoin{abcdef}{\drawaboxaroundit}{\glue}

Wenn ich kurz darüber nachdenke, wie es \drawaboxarounditfunktionieren könnte (es dient nur der Veranschaulichung, es ist nicht das, was ich wirklich mache), würde das Ergebnis für dieses Beispiel etwa so aussehen:

Bildbeschreibung hier eingeben

Die Absicht ist, \explodethenjoin{abc}{\drawaboxaroundit}{\glue}sich auszuweiten auf

\drawaboxaroundit{a}\glue\drawaboxaroundit{b}\glue\drawaboxaroundit{c}

Ich habe fast eine Lösung für mein Problem mitdiese Antwort(obwohl ich im Grunde nichts über expl weiß und daher nicht verstehe, wie es funktioniert) – dabei wird jedes Zeichen einzeln verarbeitet, aber es wird kein Klebstoff zwischen ihnen angebracht.

Ein Ansatz (der mir nicht wie ein gutes Design erscheint) wäre, \drawaboxarounditauf die Position aufmerksam zu machen, d. h. das obige abcBeispiel würde sich erweitern auf

\drawaboxarounditwrapper{0}{\glue}{a}\drawaboxarounditwrapper{1}{\glue}{b}\drawaboxarounditwrapper{2}{\glue}{c}

mit \drawaboxarounditwrapperdefiniert als etwa dies

\newcommand{\drawaboxarounditwrapper}[2]{
    \ifthenelse{\equal{#1}{0}}{}{\glue}
    \drawaboxaroundit{#2}
}

Eine andere Möglichkeit wäre, die Zeichenfolge in Kopfzeichen und Endzeichenfolge aufzuteilen. So etwas wie das hier

\witheachcharacterinheadandtail{abcdef}{\drawaboxaroundit}{\glue\drawaboxaroundit}

Wo \witheachcharacterinheadandtail{abcdef}{\foo}{\bar}erweitert in

\foo{a}\bar{b}\bar{c}\bar{d}\bar{e}\bar{f}

Dieser zweite Ansatz scheint besser zu sein, aber ich weiß nicht, wie ich einen dieser Ansätze realisieren soll oder ob einer von beiden überhaupt eine gute Idee ist.

Wie kann ich einen String explodieren, transformieren und verbinden?Wir können davon ausgehen, dass es sich bei den betreffenden Zeichenfolgen um ASCII-Zeichenfolgen handelt und dass sie keine Latex-Befehle enthalten und dass alle Zeichenfolgen mindestens zwei Zeichen enthalten (ein Ende hat immer eine Länge ungleich Null).

Antwort1

Bildbeschreibung hier eingeben

\documentclass{article}
\def\xloop#1{\ifx\relax#1\else\xloopbody{#1}\expandafter\xloop\fi}
\newcommand\explodethenjoin[3]%
  {\def\inter{\def\inter{#3}}%
   \def\xloopbody##1{\inter#2{##1}}%
   \xloop#1\relax
  }
\begin{document}
\explodethenjoin{abcdef}{\fbox}{+}
\end{document}

Das Makro \xloopiteriert über die ihm folgenden Token, bis es auf stößt \relax. Es wurde verwendetmehrmals auf dieser SeiteFür jedes Token \xloopbodywird das Makro ausgeführt; durch entsprechende Definition können die Token nach Bedarf verarbeitet werden.

Antwort2

Da TeX eigentlich keine Strings hat, benötigen Sie keine speziellen Befehle, um eine Tokenliste aufzuteilen, da es sich bereits um eine Liste unterschiedlicher Token handelt. Ebenso müssen Sie kein explizites Schleifenmakro verwenden, da das Durchlaufen einer Tokenliste einfach das normale Tex-Verhalten ist.

\documentclass{article}

\def\zz#1{\def\zzsep{}\zzz#1\relax}
\def\zzz#1{\ifx\relax#1\else\zzsep\def\zzsep{+}\fbox{#1}\expandafter\zzz\fi}
\begin{document}
\zz{abcdef}
\end{document}

Bildbeschreibung hier eingeben

Antwort3

Mit ist es ein Kinderspiel xparse:

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\splitstring}{mmO{}}
 {
  \spraff_string_split:nnn { #1 } { #2 } { #3 }
 }

\seq_new:N \l_spraff_string_in_seq
\seq_new:N \l_spraff_string_out_seq

\cs_new_protected:Nn \spraff_string_split:nnn
 {
  % split the string at 'nothing'
  \seq_set_split:Nnn \l_spraff_string_in_seq { } { #1 }
  % change each item into '#2{<item>}'
  \seq_set_map:NNn \l_spraff_string_out_seq \l_spraff_string_in_seq { #2 { ##1 } }
  % use the sequence with '#3' in between items
  \seq_use:Nn \l_spraff_string_out_seq { #3 }
 }
\ExplSyntaxOff

\NewDocumentCommand{\boxit}{m}{\fbox{\strut#1}}

\begin{document}

\splitstring{abcdef}{\boxit}

\splitstring{abcdef}{\boxit}[${}+{}$]

\end{document}

Beachten Sie, dass das als zweites Argument verwendete Makro \splitstringmit definiert werden sollte \NewDocumentCommand.

Bildbeschreibung hier eingeben

verwandte Informationen