Zeichenfolge in Zeichen aufteilen und mit Formatierung zusammenführen

Zeichenfolge in Zeichen aufteilen und mit Formatierung zusammenführen

Wie erstelle ich ein Makro

\split{ABC}

das gibt aus

Bildbeschreibung hier eingeben

wobei die Formatierung der Zeichen mit einem anderen Makro vorgenommen wird, d.h.

\formatchar{A}

Wo

\def\formatchar#1{{\color{red}#1}}

für jede Zeichenfolgenlänge?

Ich habe versucht, den Code in zu ändern Eine Zeichenfolge n mal n teilen

\documentclass{article}
\usepackage{xstring}

\def\split#1#2{%
    \StrSplit{#2}{1}\tempa\tempb
    x%
    \tempa\let\tempa\empty
    \unless\ifx\tempb\empty\def\tempa{|\split{1}\tempb}\fi
    y%
    \tempa
}

\begin{document}
\split{1}{ABCD}
\end{document}

Und ich bekomme x und y vor und nach (da ich die Begrenzung mit einem Befehl und } nicht geschafft habe), aber ich kann es nicht richtig formatieren. Außerdem möchte ich die {1} im Aufruf vermeiden und verwenden

\split{ABCD}

nur. Es handelt sich immer um 1-Zeichen-Aufteilungen.

Jede Hilfe wird sehr geschätzt!

Antwort1

Wenn nicht garantiert ist, dass Ihre Eingabe nur ASCII-Daten enthält, \seq_set_split:Nnnfunktioniert ein Ansatz möglicherweise nicht.

Ich habe den Namen in geändert, \splitcharsweil \splitvon belegt ist amsmath.

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{xcolor}

\NewDocumentCommand{\formatchar}{m}{%
  \textcolor{red!90!yellow}{#1}% <--- or whatever you like
}

\ExplSyntaxOn

\NewDocumentCommand{\splitchars}{O{|}m}
 {% #1 = optional separator, default |
  % #2 = text to split
  \mflxvii_split:nn { #1 } { #2 }
 }

\seq_new:N \l__mflxvii_split_items_seq

\cs_new_protected:Nn \mflxvii_split:nn
 {
  \seq_clear:N \l__mflxvii_split_items_seq
  \text_map_inline:nn { #2 }
   {
    \seq_put_right:Nn \l__mflxvii_split_items_seq { \formatchar{##1} }
   }
  \seq_use:Nn \l__mflxvii_split_items_seq { #1 }
 }

\ExplSyntaxOff

\begin{document}

\splitchars{ABC}

\splitchars[--]{ABC}

\splitchars{ábç}

\splitchars{ÅÄÖ}

\end{document}

Bildbeschreibung hier eingeben

Um eine listenähnliche Ausgabe zu erhalten, gibt es hier eine Erweiterung, die ein anderes Trennzeichen zwischen den letzten beiden Elementen zulässt.

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{xcolor}

\NewDocumentCommand{\formatchar}{m}{%
  \textcolor{red!90!yellow}{#1}% <--- or whatever you like
}

\ExplSyntaxOn

\NewDocumentCommand{\splitchars}{O{|}O{#1}m}
 {% #1 = optional separator, default |
  % #2 = optional separator between last two
  % #3 = text to split
  \mflxvii_split:nnn { #1 } { #2 } { #3 }
 }

\seq_new:N \l__mflxvii_split_items_seq

\cs_new_protected:Nn \mflxvii_split:nnn
 {
  \seq_clear:N \l__mflxvii_split_items_seq
  \text_map_inline:nn { #3 }
   {
    \seq_put_right:Nn \l__mflxvii_split_items_seq { \formatchar{##1} }
   }
  \seq_use:Nnnn \l__mflxvii_split_items_seq { #2 } { #1 } { #2 }
 }

\ExplSyntaxOff

\begin{document}

\splitchars{ABC}

\splitchars[--]{ABC}

\splitchars{ábç}

\splitchars{ÅÄÖ}

\splitchars[, ][ and ]{ÅÄÖ}

\splitchars[, ][ and ]{ÅÄ}

\end{document}

Bildbeschreibung hier eingeben

Antwort2

Hier ist eine LuaLaTeX-basierte Lösung, die die integrierten Funktionen von Lua gsubund verwendet . Tatsächlich verwendet der Code Versionen der und Funktionen, die UTF-8-codierte Zeichen direkt verarbeiten können.subgsubsub

Das Hauptmakro auf Benutzerebene wird \splitstringanstelle von aufgerufen \split, da dasAbonnierenDas Paket definiert eine Umgebung namens splitzusammen mit Makros namens \splitund \endsplit.

Beachten Sie, dass (a) das Argument \splitstringLeerzeichen enthalten kann und (b) formatcharals Lua-Funktion und nicht als LaTeX-Makro implementiert ist.

Bildbeschreibung hier eingeben

% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{xcolor}  % for '\textcolor' macro

% Lua-side code
\directlua{
  function formatchar ( c )
     return ( '\\textcolor{red}{\\textbf{' .. c .. '}}|' )
  end
  function split ( s )
     s = unicode.utf8.gsub ( s , '.' , formatchar )
     return ( unicode.utf8.sub ( s , 1 , -2 ) ) % delete final '|'
  end
}
% LaTeX-side code
\newcommand\splitstring[1]{\directlua{tex.sprint(split('#1'))}}

\begin{document}
\obeylines % just for this example
\splitstring{ABC}
\splitstring{123abc}
\splitstring{Hello World}
\end{document}

Antwort3

Hier ist mein Lösungsversuch mit ExplSyntax:

\documentclass{article}
\usepackage{xcolor}

\ExplSyntaxOn
\seq_new:N \l__my_split_seq
\NewDocumentCommand { \split } { m } {  \__my_split:n { #1 }  }
\cs_new_protected:Npn \__my_split:n #1
{
  \seq_set_split:Nnn \l__my_split_seq {} { #1 }
  \seq_set_map:NNn \l__my_split_seq \l__my_split_seq
  {  \__my_split_fn:n { ##1 }  }
  % \seq_log:N \l__my_split_seq
  \seq_use:Nn \l__my_split_seq { | }
}
\cs_new_protected:Npn \__my_split_fn:n #1 {   {  \color { red } #1  }   }
\ExplSyntaxOff

\begin{document}

\split{ABCD}

\split{1234}

\end{document}

Bildbeschreibung hier eingeben

Antwort4

Da keine LaTeX2e-Lösungen angeboten werden, gebe ich hier eine. Ich verwende einen Token-Zyklus, um Zeichen nacheinander aus dem Argument zu entnehmen. Diese Lösung setzt voraus, dass das Argument keine Makros und keine Gruppen enthält. Ich habe diese weggelassen, da keine Anleitung gegeben wurde, wie sie behandelt werden sollen, obwohl sie bei Bedarf behandelt werden können.

Wenn Unicode-Zeichen verarbeitet werden müssen, muss die Kompilierung unter xelatex oder lualatex erfolgen.

\documentclass{article}
\usepackage{tokcycle,xcolor}
\newcommand\formatchar[1]{\textcolor{red}{#1}}
\def\split#1{%
  \tokencycle{\formatchar{##1}\splitchar}
  {}{}{##1\splitchar}#1\endtokencycle}
\newcommand\splitchar{\tcpeek\z\ifx\empty\z\else$\mid$\fi}
\begin{document}
\split{ABCD}

\split{Å ÄÖ}
\end{document}

Bildbeschreibung hier eingeben

verwandte Informationen