如何在 tikz 图片中创建和中断循环?

如何在 tikz 图片中创建和中断循环?

我想画一个数字半群 S(p,q) 的图像 - 画出所有小于 p*q 的属于它的点。我不知道如何打破循环。我的代码不起作用:

\documentclass{amsart} 
\usepackage{ifthen}
\usepackage{pgfplots} 
\usepackage{pgf} 

\pgfmathsetmacro{\pvar}{4} 
\pgfmathsetmacro{\qvar}{5} 
\pgfmathsetmacro{\helpend}{\pvar*\qvar}

\begin{document}

\resizebox{300 pt}{5 pt}{
\begin{tikzpicture}
\foreach \i in {0,...,\qvar}
      \foreach \l in {0,...,\pvar}
      {     
          \pgfmathsetmacro{\leftsside}{\pvar*\i+\qvar*\l}     
          \ifthenelse{\leftsside<\helpend}
            {\filldraw[blue] (\pvar*\i+\qvar*\l + \pvar*\qvar,0) circle (5pt);  }
            {}          
      }
\end{tikzpicture}
}
\end{document}

如果我在循环\leftsside<\helpend中用替换1<\helpend,效果很好,但不是所需的结果。我该如何修复它?

我已经尝试了\breakforeachtex.stackexchange.com/questions/39476/while-loops-in-tikz 中的建议,但无法使其工作。我喜欢 John Kormylo 在 tex.stackexchange.com/questions/187482/if-then-else-inside-tikz-graph/187514 中提出的解决方案(预先计算数组)的想法,但我不得不承认,我了解的知识还不足以成功实现它。

答案1

您需要删除尾随.0,这可以通过替换\pgfmathsetmacro\pgfmathtruncatemacro使用来实现int

\documentclass{amsart} 
\usepackage{ifthen}
\usepackage{tikz} 

\pgfmathsetmacro{\pvar}{4} 
\pgfmathsetmacro{\qvar}{5} 
\pgfmathsetmacro{\helpend}{\pvar*\qvar}

\begin{document}

\resizebox{300 pt}{5 pt}{
\begin{tikzpicture}
\foreach \i in {0,...,\qvar}
      \foreach \l in {0,...,\pvar}
      {     
          \pgfmathtruncatemacro{\leftsside}{\pvar*\i+\qvar*\l}     
          \ifthenelse{\leftsside<\helpend}
            {\filldraw[blue] (\pvar*\i+\qvar*\l + \pvar*\qvar,0) circle (5pt);  }
            {}          
      }
\end{tikzpicture}
}
\end{document}

在此处输入图片描述

你不需要ifthen这里。

\documentclass{amsart} 
\usepackage{tikz} 

\pgfmathsetmacro{\pvar}{4} 
\pgfmathsetmacro{\qvar}{5} 
\pgfmathtruncatemacro{\helpend}{\pvar*\qvar}

\begin{document}

\resizebox{300 pt}{5 pt}{
\begin{tikzpicture}
\foreach \i in {0,...,\qvar}
      \foreach \l in {0,...,\pvar}
      {     
          \pgfmathtruncatemacro{\leftsside}{\pvar*\i+\qvar*\l}     
          \ifnum\leftsside<\helpend
            \filldraw[blue] (\pvar*\i+\qvar*\l + \pvar*\qvar,0) circle[radius=5pt];  
          \fi
      }
\end{tikzpicture}
}
\end{document}

并且还可以摆脱\pgfmathtruncatemacros。

\documentclass{amsart} 
\usepackage{tikz} 

\pgfmathsetmacro{\pvar}{4} 
\pgfmathsetmacro{\qvar}{5} 

\begin{document}

\resizebox{300 pt}{5 pt}{
\begin{tikzpicture}
\foreach \i in {0,...,\qvar}
      \foreach \l in {0,...,\pvar}
      {     
          \pgfmathtruncatemacro{\leftsside}{\pvar*\i+\qvar*\l}     
          \ifnum\numexpr\pvar*\i+\qvar*\l<\numexpr\pvar*\qvar
            \filldraw[blue] (\pvar*\i+\qvar*\l + \pvar*\qvar,0) circle[radius=5pt];  
          \fi
      }
\end{tikzpicture}
}
\end{document}

相关内容