在循环中应用不同的填充图案

在循环中应用不同的填充图案

我正在尝试创建一个具有不同高度块的垂直部分,并使用以下代码用不同的图案填充每个块。

我的方法:我已将模式名称保存为变量中的字符串列表,并尝试在命令中以 的\names形式访问其元素 ( \names[\i]) 。我正在使用循环,在其第 i 次迭代中,它应该从列表中提供第 i 个模式。\drawpattern= \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}

在此处输入图片描述

相关内容