
Ich muss eine Reihe einfacher Muster mit wenigen Farben zeichnen, wie im folgenden Beispiel.
\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}
Dies ist jedoch eindeutig eine ineffiziente Methode zum Erstellen des Bildes. Idealerweise hätte ich gerne eine Funktion rowpatternmaker coords string
, die
rowpatternmaker (-2,0) rgyb
eine Reihe farbiger Quadrate erstellt, die bei (-2,0) beginnen und von links nach rechts rot, grün, gelb und blau sind. Auf diese Weise könnte ich dann das obige Muster erstellen mit
rowpatternmaker (-2,1) grby
rowpatternmaker (-2,0) rgyb
rowpatternmaker (-2,-1) ybrg
rowpatternmaker (-2,-2) brgy
Was ich natürlich wirklich gerne hätte, wäre eine Funktion square pattern maker
, bei der
squarepatternmaker (-2,1) grby rgyb ybrg brgy
würde das obige Muster erstellen.
Ich habe zwar ein paar Figuren mit TikZ erstellt, bin mir aber nicht sicher, wie man eine solche Funktion erstellt, geschweige denn eine, die den String „grby“ lesen und als Liste von Farben interpretieren kann.
rowpatternmaker
Vorausgesetzt, es ist möglich, wie würde ich bei der Erstellung (oder ) vorgehen squarepatternmaker
?
Antwort1
Die Verwendung von bloßen Wörtern als Befehle ist in LaTeX unnötig kompliziert. Deshalb führe ich
\rowpatternmaker (-2,1) grby;
\rowpatternmaker (-2,0) rgyb;
\rowpatternmaker (-2,-1) ybrg;
\rowpatternmaker (-2,-2) brgy;
Ich hoffe, das ist okay. Das erste Argument ist die Startkoordinate und das zweite die Farbfolge. Wenn Sie die Farbfolge leer lassen, wird standardmäßig verwendet rgby
. Die Zeilenlänge wird durch die Länge der Farbfolge bestimmt, also rgbrgb
sechs.
Der quadratische Mustermacher ist auch möglich
\squarepatternmaker (-2,1) grby rgyb ybrg brgy;
Die Implementierung erfolgt im Hinblick auf den Zeilenmustergenerator.
\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}