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

잘 모르겠지만 expl3TikZ 내에서 또는 오히려 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. 문자열이 있는 경우 문자열을 두 부분(이름과 색상)으로 잘라서 사용합니다.
  3. 존재하지 않는 경우 표준 구문을 사용하십시오.

물론 다음이 가능합니다.

  • 구분자 문자열을 변경합니다.
  • 훨씬 더 복잡한 작업을 수행합니다(예: 더 많은 속성 추가: 일부 조건문을 중첩하거나 더 간단한 방법으로 속성당 하나의 구분 문자열을 정의).

답변3

코드에서 텍스트의 두 가지 속성인 색상과 기울임꼴을 지원한다고 가정해 보겠습니다. 먼저 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}

그러면 다음이 인쇄됩니다:

여기에 이미지 설명을 입력하세요

관련 정보