我想画一个数字半群 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}