我正在尝试创建一个具有不同高度块的垂直部分,并使用以下代码用不同的图案填充每个块。
我的方法:我已将模式名称保存为变量中的字符串列表,并尝试在命令中以 的\names
形式访问其元素 ( \names[\i]
) 。我正在使用循环,在其第 i 次迭代中,它应该从列表中提供第 i 个模式。\draw
pattern= \pgfmathparse{\names[\i]}\pgfmathresult
\foreach
先前的解决方案被建议这个帖子和这个帖子然而这些并没有起到作用。
本质上,我在将图案传递给绘制命令时遇到了问题。或者,有没有办法按照给定的顺序自动更改填充图案?
该图应如下图所示。
\\documentclass[10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{patterns}
\begin{document}
\begin{tikzpicture}
\def\zthick{{1, 0.5, 0.8, 1.2, 0.7, 0.4, 1.1, 1.7, 0.5}}
\def\names{{"dots","horizontal lines","vertical lines","grid","north east lines","north west lines","bricks", "crosshatch"}}%
\def\width{1}
\coordinate (L) at (\width,0);
\foreach \i in {1,2,3}
{ \pgfmathsetmacro{\b}{\zthick[\i]};
\draw [pattern=\pgfmathparse{\names[\i]}\pgfmathresult ]
(L) ++(-\width,0) rectangle ++(\width,-\b) coordinate (L); }
\end{tikzpicture}
\end{document}
我知道这个任务可以通过为每个块明确写入来实现,但我想知道是否有任何方法可以让它与循环一起工作。
答案1
您可能不应该将选项\pgfmathparse
作为输入pattern
,而应该只输入其结果。您只需使用\pgfmathsetmacro
两次即可。
因此,你的方法可以如下实现:
\documentclass[10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{patterns}
\begin{document}
\begin{tikzpicture}
\def\zthick{{1, 0.5, 0.8, 1.2, 0.7, 0.4, 1.1, 1.7, 0.5}}
\def\names{{"dots","horizontal lines","vertical lines","grid","north east lines","north west lines","bricks", "crosshatch"}}
\def\width{1}
\coordinate (L) at (\width,0);
\foreach \i in {1,2,3} {
\pgfmathsetmacro{\b}{\zthick[\i]}
\pgfmathsetmacro{\p}{\names[\i]}
\draw [pattern=\p]
(L) ++(-\width,0) rectangle ++(\width,-\b) coordinate (L);
}
\end{tikzpicture}
\end{document}
请注意,这只能通过 的功能来实现\pgfmathparse
。一般来说,在 TeX 中,您无法像在其他编程语言中一样使用 来访问列表中的项目(\list[i]
其中i
表示项目的索引)。
解决这个问题的另一种方法是利用\foreach
宏允许同时循环两个列表的事实。如果您有项目,则只需一次循环a/b
即可访问a
和。您可以使用它来实现您想要的。b
此外,您还需要推进一个保存最后一个高度的计数器rectangle
。
也许这样的事情可以奏效:
\documentclass[10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{patterns}
\begin{document}
\begin{tikzpicture}
\def\bgrounds{
dots/1,
horizontal lines/0.5,
vertical lines/0.8,
grid/1.2,
north east lines/0.7,
north west lines/0.4,
bricks/1.1,
crosshatch/1.7
}
\newlength\bwidth
\setlength\bwidth{1cm}
\newlength\bheight
\setlength\bheight{0pt}
\foreach \i/\j in \bgrounds {
\draw [pattern=\i]
(-\bwidth,\bheight) rectangle ++(\bwidth,-\j);
\global\advance\bheight by -\j cm
}
\end{tikzpicture}
\end{document}