Ich habe eine foreach-Anweisung erstellt, mitexpl3
UndTikZ/pgf
:
\documentclass{article}
\usepackage{tikz}
\setlength{\parindent}{0cm}
\usepackage{expl3}
\ExplSyntaxOn
\cs_new:Npn \Counter #1 \Stopper { \tl_length:n {#1} }
\ExplSyntaxOff
\pgfmathdeclarefunction{countarray}{1}{\edef\pgfmathresult{\Counter#1\Stopper}}
\begin{document}
%array with names
\def\names{{"Katie","Frank","Laura"}}
%find the last element index
\pgfmathtruncatemacro{\Last}{countarray(\names) - 1}
%print all the elements of array
\foreach \i in {0,...,\Last} {%
\i: \pgfmathparse{\names[\i]}\pgfmathresult\\
}
\end{document}
Druckt Folgendes:
Angenommen, ich möchte für verschiedene Namen verschiedene Farben verwenden (oder andere Parameter festlegen). Das Ergebnis könnte etwa so aussehen:
Katie\\
\textcolor{blue}{Frank}\\
Laura
In Perl hätte ich etwa Folgendes gemacht:
my @data = (
{"text" => "Katie"},
{"text" => "Frank", "color" => "blue"},
{"text" => "Laura"});
foreach(@data)
{
if(defined($_->{color}))
{
print "\textcolor\{$_->{color}\}\{$_->{text}\}";
}
else
{
print $_->{text};
}
print "\\\\";
}
Ist es möglich, dies in zu implementieren expl3
?
Antwort1
Ich weiß nicht, expl3
aber es ist innerhalb von TikZ möglich, oder besser gesagt innerhalb pgfkeys
. Da es ein Untermodul von LaTeX3 gibt l3keys
, gehe ich davon aus, dass dort im Grunde dasselbe Konzept funktioniert. Sie können Ihre Datenstruktur auf die gleiche Weise wie in Perl erstellen:
\pgfkeys{
/names/.cd,
make name/.style = {
#1/color/.initial = black
},
make name/.list = {Katie, Frank, Laura},
Frank/color = blue
}
Anschließend können Sie die Farbe eines Namens beispielsweise folgendermaßen extrahieren:
\newcommand\getcolor[1]{%
\pgfkeysgetvalue{/names/#1/color}%
}
das vollständig erweiterbar ist und überall dort verwendet werden kann, wo Sie die Farbe eines Namens benötigen. Für dieses Beispiel ist natürlich kein einzelner Unterschlüssel erforderlich Frank/color
(Sie könnten einfach festlegen Frank/.initial = blue
), aber wenn Sie weitere Eigenschaften wünschen, können Sie diese hinzufügen, indem Sie ihnen ebenfalls ihre eigenen benannten Unterschlüssel zuweisen.
Antwort2
Dies beantwortet letztlich nicht die Frage:
Ist es möglich, dies in zu implementieren
expl3
?
Daher wird es als Community-Wiki gekennzeichnet.
Abgesehen vom interessanten Aspekt des Umgangs mit expl3
ist diese Aufgabe perfekt machbar, nur mit der Standardsyntax von TikZ foreach in Kombination mitxstring
:
\documentclass{article}
\usepackage{tikz} % won't work just with pgffor
\setlength{\parindent}{0cm}
\usepackage{xstring}
\begin{document}
\foreach \name [count=\i from 0]in{Katie,Frank=>blue,Laura=>red}{
\IfSubStr{\name}{=>}{% true
\StrCut{\name}{=>}\xname\namecol
\i: \textcolor{\namecol}{\xname}\par%
}{% false
\i: \name\par%
}
}
\end{document}
Dies bietet:
Die Idee dahinter ist mehr oder weniger diese:
- Suchen Sie nach der Trennzeichenfolge (
=>
im Beispiel); - falls vorhanden, schneiden Sie die Schnur in zwei Teile (Name und Farbe) und verwenden Sie diese;
- wenn nicht vorhanden, verwenden Sie die Standardsyntax.
Natürlich ist es möglich:
- Trennzeichenfolge ändern;
- Machen Sie viel kompliziertere Dinge (z. B. fügen Sie weitere Eigenschaften hinzu: Verschachteln Sie einfach einige Bedingungen oder definieren Sie einfacher eine Trennzeichenfolge pro Eigenschaft).
Antwort3
Angenommen, unser Code soll zwei Texteigenschaften unterstützen: Farbe und Kursivschrift. Zuerst definieren wir die Plists:
%plist1 definition
\prop_new:N \l_list_a_prop
\prop_put:Nnn \l_list_a_prop { text } {Katie}
%plist2 definition
\prop_new:N \l_list_b_prop
\prop_put:Nnn \l_list_b_prop { text } {Frank}
\prop_put:Nnn \l_list_b_prop { color } {red}
%plist3 definition
\prop_new:N \l_list_c_prop
\prop_put:Nnn \l_list_c_prop { text } {Laura}
\prop_put:Nnn \l_list_c_prop { color } {blue}
\prop_put:Nnn \l_list_c_prop { italic } {yes}
Beachten Sie, dass expl3 keine Zahlen in den Namen unterstützt, deshalb habe ich _a
, _b
, verwendet _c
.
Bringen Sie dann alle Plists in eine Sequenz:
%putting plists to sequence
\seq_new:N \l_my_seq
\seq_push:Nn \l_my_seq { \l_list_c_prop }
\seq_push:Nn \l_my_seq { \l_list_b_prop }
\seq_push:Nn \l_my_seq { \l_list_a_prop }
Anschließend durchlaufen wir die Sequenz in einer Schleife und versehen den Text bei Bedarf mit der entsprechenden Auszeichnung:
\tl_new:N \__text
\seq_map_inline:Nn \l_my_seq
{
\prop_get:NnN #1 { text } \__text
\prop_get:NnNT #1 { color } \color_tl
{
\protected@edef \__text {\textcolor{\color_tl}{\__text}}
}
\prop_get:NnNT #1 { italic } \italic_tl
{
\protected@edef \__text {\textit{\__text}}
}
\__text\\
}
Insgesamt haben wir den folgenden Code:
\documentclass{article}
\usepackage{expl3}
\usepackage{color}
\setlength\parindent{0pt}
\begin{document}
\makeatletter
\ExplSyntaxOn
%plist1 definition
\prop_new:N \l_list_a_prop
\prop_put:Nnn \l_list_a_prop { text } {Katie}
%plist2 definition
\prop_new:N \l_list_b_prop
\prop_put:Nnn \l_list_b_prop { text } {Frank}
\prop_put:Nnn \l_list_b_prop { color } {red}
%plist3 definition
\prop_new:N \l_list_c_prop
\prop_put:Nnn \l_list_c_prop { text } {Laura}
\prop_put:Nnn \l_list_c_prop { color } {blue}
\prop_put:Nnn \l_list_c_prop { italic } {yes}
%putting plists to sequence
\seq_new:N \l_my_seq
\seq_push:Nn \l_my_seq { \l_list_c_prop }
\seq_push:Nn \l_my_seq { \l_list_b_prop }
\seq_push:Nn \l_my_seq { \l_list_a_prop }
\tl_new:N \__text
\seq_map_inline:Nn \l_my_seq
{
\prop_get:NnN #1 { text } \__text
\prop_get:NnNT #1 { color } \color_tl
{
\protected@edef \__text {\textcolor{\color_tl}{\__text}}
}
\prop_get:NnNT #1 { italic } \italic_tl
{
\protected@edef \__text {\textit{\__text}}
}
\__text\\
}
\ExplSyntaxOff
\makeatother
\end{document}
Dies wird gedruckt: