![\foreach 循环中的条件](https://linux22.com/image/469317/%5Cforeach%20%E5%BE%AA%E7%8E%AF%E4%B8%AD%E7%9A%84%E6%9D%A1%E4%BB%B6.png)
我使用下面的 MWE 绘制了一把尺子,然后我意识到它在小尺子(1 毫米步长)上绘制了每条中等(5 毫米步长)垂直线,并在中尺子和小尺子上绘制了每条大(编号)垂直线。所以,我的问题是:如何使用条件来防止重叠?
\documentclass[tikz, border=10pt]{standalone}
\begin{document}
\begin{tikzpicture}[{x=(1mm,0)},{y=(0,1mm)}]
\tiny
\draw
(0,0)
rectangle(150,-15)
;
\foreach \x in {5, 6, ..., 145}{
\draw (\x, 0)--(\x, -2);
}
\foreach \y in {5, 10, ..., 145}{
\draw (\y, 0)--(\y, -4);
}
\foreach \z in {5, 15, ..., 145}{
\pgfmathsetmacro{\d}{(\z - 5)/10}
\draw (\z, 0)--(\z, -6) node[below]{\pgfmathprintnumber[fixed,precision=0]{\d}};
}
\end{tikzpicture}
\end{document}
答案1
也许这是一个更简单的方法:
我们使用一个循环遍历所有刻度并检查每个刻度是否可以被 10 和 5 整除并选择适当的长度。
该函数mod(<x>, <n>)
返回余数,<x>/<n>
但0
将被解释ifthenelse
为假,而所有其他结果将被解释为真。
当然,你可以将整个函数\ticklength
直接放入路径中:
\draw (\x, 0) -- +(down:{ifthenelse(mod(\x, 10), ifthenelse(mod(\x, 5), 2, 4), 6)};
但如果你需要它不止一次,evaluate
关键是一个好的工具。
对于数字,我们可以以各种方式将同一个循环与另一个条件测试结合使用,但似乎更容易的是只使用第二个循环直接对整数进行迭代。(我们实际上可以写成\x0
而不是,10*\x
但我想后者在语法上更正确。)
代码
\documentclass[tikz, border=10pt]{standalone}
\begin{document}
\begin{tikzpicture}[x=1mm, y=1mm]
\tiny
\draw (-5 ,0) rectangle (145, -15);
\foreach[
evaluate={
\ticklength=
ifthenelse(mod(\x, 10),
ifthenelse(mod(\x, 5), 2, 4), 6);}] \x in {0, ..., 140}
\draw (\x, 0) -- +(down:\ticklength);
\foreach \x in {0, ..., 14}
\node[below] at (10*\x, -6) {$\x$};
\end{tikzpicture}
\end{document}
答案2
(评论太长)
你的问题很明确,但我认为,这种重叠是无所谓的,避免这种重叠并不难,但代价就是代码的复杂性和可读性。
您的标尺图形让我想起了我画过的第一个tikzpicture
s。希望代码对某些人有帮助。
\documentclass[tikz,border=3mm]{standalone}
\begin{document}
\begin{tikzpicture}[line cap=round,line join=round,x=1mm,y=1mm]
% a ruler
\fill[gray!20] (0,-2) rectangle (100,0);
\foreach \i in {0,...,100}
\draw (\i,0)--+(0,-2);
\foreach \i in {0,...,20}
\draw (5*\i,0)--+(0,-4);
\foreach \i in {0,...,10}
\draw (10*\i,0)--++(0,-6) node[below]{\i};
\draw (0,-12) node[align=left]{cm};
\draw[thick,rounded corners] (-5,-20) rectangle (105,0);
% a pink pencil
\begin{scope}[yshift=4pt]
\fill[red!60] (0,0) rectangle (85,1.5);
\fill[red!40] (0,1.5) rectangle (85,3.5);
\fill[red!20] (0,3.5) rectangle (85,5);
\fill[black!50] (95,2.5) circle(1pt);
\fill[draw=black,left color=white,right color=black!20] (85,0)--(95,2.5)--(85,5);
\draw[black!50,opacity=.5] (0,0) rectangle (85,5);
\end{scope}
\end{tikzpicture}
\end{document}