Wie erstelle ich ein Makro
\split{ABC}
das gibt aus
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:Nnn
funktioniert ein Ansatz möglicherweise nicht.
Ich habe den Namen in geändert, \splitchars
weil \split
von 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}
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}
Antwort2
Hier ist eine LuaLaTeX-basierte Lösung, die die integrierten Funktionen von Lua gsub
und verwendet . Tatsächlich verwendet der Code Versionen der und Funktionen, die UTF-8-codierte Zeichen direkt verarbeiten können.sub
gsub
sub
Das Hauptmakro auf Benutzerebene wird \splitstring
anstelle von aufgerufen \split
, da dasAbonnierenDas Paket definiert eine Umgebung namens split
zusammen mit Makros namens \split
und \endsplit
.
Beachten Sie, dass (a) das Argument \splitstring
Leerzeichen enthalten kann und (b) formatchar
als Lua-Funktion und nicht als LaTeX-Makro implementiert ist.
% !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}
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}