문자열을 분해하고 해석할 수 있는 TikZ의 함수 생성

문자열을 분해하고 해석할 수 있는 TikZ의 함수 생성

아래 예와 같이 몇 가지 색상을 사용하여 여러 가지 간단한 패턴을 그려야 합니다.

\begin{tikzpicture}[scale=1.5]
\draw[style=help lines,step=1cm] (-2.3,-2.3) grid (2.3,2.3);
\draw[fill=green] (-2,1) rectangle (-1,2);
\draw[fill=red] (-1,1) rectangle (0,2);
\draw[fill=blue] (0,1) rectangle (1,2);
\draw[fill=yellow] (1,1) rectangle (2,2);

\draw[fill=red] (-2,0) rectangle (-1,1);
\draw[fill=green] (-1,0) rectangle (0,1);
\draw[fill=yellow] (0,0) rectangle (1,1);
\draw[fill=blue] (1,0) rectangle (2,1);    

\draw[fill=yellow] (-2,-1) rectangle (-1,0);
\draw[fill=blue] (-1,-1) rectangle (0,0);
\draw[fill=red] (0,-1) rectangle (1,0);
\draw[fill=green] (1,-1) rectangle (2,0);    

\draw[fill=blue] (-2,-2) rectangle (-1,-1);
\draw[fill=red] (-1,-2) rectangle (0,-1);
\draw[fill=green] (0,-2) rectangle (1,-1);
\draw[fill=yellow] (1,-2) rectangle (2,-1);
\end{tikzpicture}

산출

이것은 분명히 그림을 만드는 비효율적인 방법이며 이상적으로는 (-2,0)부터 시작하여 왼쪽에서 오른쪽으로 빨간색, 녹색, 노란색인 컬러 사각형 행을 만드는 rowpatternmaker coords string함수 를 갖고 싶습니다. rowpatternmaker (-2,0) rgyb, 파란색. 이런 식으로 위의 패턴을 만들 수 있습니다.

rowpatternmaker (-2,1) grby
rowpatternmaker (-2,0) rgyb
rowpatternmaker (-2,-1) ybrg
rowpatternmaker (-2,-2) brgy

물론, 제가 정말로 원하는 것은 square pattern maker다음과 같은 기능을 만드는 것입니다.

squarepatternmaker (-2,1) grby rgyb ybrg brgy

위의 패턴을 만들 것입니다.

TikZ로 몇 가지 그림을 만들었지만 "grby" 문자열을 읽고 이를 색상 목록으로 해석할 수 있는 함수는 물론이고 이와 같은 함수를 만드는 방법도 잘 모르겠습니다.

rowpatternmaker가능하다고 가정하면 (또는 )을 어떻게 생성합니까 squarepatternmaker?

답변1

LaTeX에서는 단순한 단어를 명령으로 사용하는 것이 불필요하게 어렵습니다. 그렇기 때문에 소개합니다

\rowpatternmaker (-2,1) grby;
\rowpatternmaker (-2,0) rgyb;
\rowpatternmaker (-2,-1) ybrg;
\rowpatternmaker (-2,-2) brgy;

괜찮기를 바랍니다. 첫 번째 인수는 시작 좌표이고 두 번째 인수는 색상 순서입니다. 색상 순서를 비워 두면 기본값은 입니다 rgby. 선 길이는 색상 순서의 길이에 따라 결정됩니다. 즉, rgbrgb길이는 6입니다.

사각패턴메이커도 가능합니다

\squarepatternmaker (-2,1) grby rgyb ybrg brgy;

행 패턴 메이커 측면에서 구현됩니다.

\documentclass{article}
\pagestyle{empty}
\usepackage{tikz,xparse}

\ExplSyntaxOn

\seq_new:N \l_cookie_rows_seq
\int_new:N \l_cookie_rowcount_int
\seq_new:N \l_cookie_colors_seq
\int_new:N \l_cookie_count_int

\cs_new_protected:Npn \cookie_map_colors:Nn #1#2
 {
  \seq_clear:N #1
  \seq_set_split:Nnn \l_tmpa_seq { } { #2 }
  \seq_map_inline:Nn \l_tmpa_seq
   {
    \str_case:nn { ##1 }
     {
      { r } { \seq_put_right:Nn #1 { red } }
      { g } { \seq_put_right:Nn #1 { green } }
      { b } { \seq_put_right:Nn #1 { blue } }
      { y } { \seq_put_right:Nn #1 { yellow } }
     }
   }
 }

\cs_new_protected:Npn \cookie_row_pattern_maker:nnn #1#2#3
 {
  \cookie_map_colors:Nn \l_cookie_colors_seq { #3 }
  \int_zero:N \l_cookie_count_int
  \seq_map_inline:Nn \l_cookie_colors_seq
   {
    \draw[fill=##1] (#1+\int_use:N \l_cookie_count_int,#2) rectangle +(1,1);
    \int_incr:N \l_cookie_count_int
   }
 }

\cs_new_protected:Npn \rowpatternmaker (#1,#2) #3;
 {
  \tl_if_empty:nTF { #3 }
   { \cookie_row_pattern_maker:nnn { #1 } { #2 } { rgby } }
   { \cookie_row_pattern_maker:nnn { #1 } { #2 } { #3 } }
 }

\cs_generate_variant:Nn \seq_set_split:Nnn { Nnx }

\cs_new_protected:Npn \cookie_square_pattern_maker:nnn #1#2#3
 {
  \seq_set_split:Nnx \l_cookie_rows_seq { ~ } { \tl_trim_spaces:n { #3 } }
  \int_zero:N \l_cookie_rowcount_int
  \seq_map_inline:Nn \l_cookie_rows_seq
   {
    \cookie_row_pattern_maker:nnn { #1 } { #2 - \int_use:N \l_cookie_rowcount_int } { ##1 }
    \int_incr:N \l_cookie_rowcount_int
   }
 }

\cs_new_protected:Npn \squarepatternmaker (#1,#2) #3;
 {
  \cookie_square_pattern_maker:nnn { #1 } { #2 } { #3 }
 }

\ExplSyntaxOff

\begin{document}
\begin{tikzpicture}
  \draw[style=help lines,step=1cm] (-2.3,-2.3) grid (2.3,2.3);
  \rowpatternmaker (-2,1) grby;
  \rowpatternmaker (-2,0) rgyb;
  \rowpatternmaker (-2,-1) ybrg;
  \rowpatternmaker (-2,-2) brgy;
\end{tikzpicture}

\begin{tikzpicture}
  \draw[style=help lines,step=1cm] (-2.3,-2.3) grid (2.3,2.3);
  \squarepatternmaker (-2,1) grby rgyb ybrg brgy;
\end{tikzpicture}
\end{document}

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

관련 정보