TikZ でデータ構造を使用するにはどうすればいいですか?

TikZ でデータ構造を使用するにはどうすればいいですか?

私はforeach文を作成しました。expl3そしてTikZ/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}

これを印刷します:

ここに画像の説明を入力してください

名前ごとに異なる色を使用したい(または他のパラメータを設定したい)とします。次のようになります。

Katie\\
\textcolor{blue}{Frank}\\
Laura

ここに画像の説明を入力してください

Perl では、次のようなことをします。

my @data = (
  {"text" => "Katie"},
  {"text" => "Frank", "color" => "blue"},
  {"text" => "Laura"});

foreach(@data)
{
      if(defined($_->{color}))
      {
            print "\textcolor\{$_->{color}\}\{$_->{text}\}";
      }
      else
      {
            print $_->{text};
      }
      print "\\\\";
}

これを で実装することは可能ですかexpl3?

答え1

については知りませんexpl3が、TikZ 内、または 内では可能ですpgfkeys。LaTeX3 のサブモジュールがあるのでl3keys、基本的に同じ考え方がそこでも機能すると思います。Perl とほぼ同じ方法でデータ構造を作成できます。

\pgfkeys{
 /names/.cd,
 make name/.style = {
  #1/color/.initial = black
 },
 make name/.list = {Katie, Frank, Laura},
 Frank/color = blue
}

次に、次のようにして名前の色を抽出できます。

\newcommand\getcolor[1]{%
 \pgfkeysgetvalue{/names/#1/color}%
}

これは完全に拡張可能で、名前の色が必要な場所であればどこでも使用できます。もちろん、この例では単一のサブキーは必要ありませんFrank/color( を設定するだけで済みますFrank/.initial = blue)。ただし、より多くのプロパティが必要な場合は、独自の名前付きサブキーを指定して追加することもできます。

答え2

これは結局のところ、次の質問に対する答えにはなりません。

これを で実装することは可能ですかexpl3?

したがって、コミュニティ ウィキとしてマークされます。

を扱うという興味深い側面に加えてexpl3、この作業はTikZ foreachの標準構文との組み合わせだけで完璧に実行可能です。xstring:

\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}

これにより、次のことが実現されます。

ここに画像の説明を入力してください

背後にある考え方は、おおよそ次のようになります。

  1. 区切り文字列(=>例では)を探します。
  2. 存在する場合は、文字列を 2 つの部分 (名前と色) に分割して使用します。
  3. 存在しない場合は、標準の構文を使用します。

もちろん、次のことが可能です。

  • 区切り文字列を変更します。
  • もっと複雑なことを行います (つまり、プロパティを追加します。条件をいくつかネストするか、もっと簡単な方法として、プロパティごとに 1 つの区切り文字列を定義します)。

答え3

コードでテキストの 2 つのプロパティ (色と斜体) をサポートするとします。まず、plist を定義します。

%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}

expl3 は名前に数字をサポートしていないことに注意してください。そのため、、、を使用しまし_a_b_c

次に、すべての plist をシーケンスに配置します。

%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\\
}

全体として、次のコードになります。

\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}

次のように印刷されます:

ここに画像の説明を入力してください

関連情報