![如何在 tikz 图片中创建和中断循环?](https://linux22.com/image/415349/%E5%A6%82%E4%BD%95%E5%9C%A8%20tikz%20%E5%9B%BE%E7%89%87%E4%B8%AD%E5%88%9B%E5%BB%BA%E5%92%8C%E4%B8%AD%E6%96%AD%E5%BE%AA%E7%8E%AF%EF%BC%9F.png)
我想画一个数字半群 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
,效果很好,但不是所需的结果。我该如何修复它?
我已经尝试了\breakforeach
tex.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}
并且还可以摆脱\pgfmathtruncatemacro
s。
\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}