Wie verwende ich Datenstrukturen in TikZ?

Wie verwende ich Datenstrukturen in TikZ?

Ich habe eine foreach-Anweisung erstellt, mitexpl3UndTikZ/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:

Bildbeschreibung hier eingeben

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

Bildbeschreibung hier eingeben

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, expl3aber 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 expl3ist 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:

Bildbeschreibung hier eingeben

Die Idee dahinter ist mehr oder weniger diese:

  1. Suchen Sie nach der Trennzeichenfolge ( =>im Beispiel);
  2. falls vorhanden, schneiden Sie die Schnur in zwei Teile (Name und Farbe) und verwenden Sie diese;
  3. 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:

Bildbeschreibung hier eingeben

verwandte Informationen