\foreach 循环中的条件

\foreach 循环中的条件

我使用下面的 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

(评论太长)

你的问题很明确,但我认为,这种重叠是无所谓的,避免这种重叠并不难,但代价就是代码的复杂性和可读性。

您的标尺图形让我想起了我画过的第一个tikzpictures。希望代码对某些人有帮助。

在此处输入图片描述

\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}

相关内容