我正在清理代码tikz 中的埃拉托斯特尼筛法,但我发现当我最初编写代码时,我无法弄清楚如何<=
在 内进行比较\whiledo
,因此不得不使用<
比所需数字多一个的数字进行比较。我觉得这像是黑客行为,而且由于@StefanKottwitz 正在考虑在另一个网站上发布此tikz
示例,我宁愿不诉诸这种黑客行为。
问题:
如何实现诸如以下的<=
比较\whiledo
:
\whiledo{\value{MyCounter} <= \MaxValue}{
笔记:
- 尽管我很想,但我无法使用
\foreach
frompgf
。
代码:
\documentclass{article}
\usepackage{ifthen}
\newcounter{MyCounter}
\def\StartValue{5}
\def\MaxValue{10}
\begin{document}
Note that 10 is missing when comparing to MaxValue:
\setcounter{MyCounter}{\StartValue}
\whiledo{\value{MyCounter} < \MaxValue}{
\theMyCounter
\stepcounter{MyCounter}
}
\bigskip
\textbf{Hack:} Comparing to MaxValuePlusOne does the job:
\newcounter{MaxValuePlusOne}
\setcounter{MaxValuePlusOne}{\MaxValue}
\stepcounter{MaxValuePlusOne}
%
\setcounter{MyCounter}{\StartValue}
\whiledo{\value{MyCounter} < \value{MaxValuePlusOne}}{
\theMyCounter
\stepcounter{MyCounter}
}
\end{document}
答案1
我们可以\newwhiledo
用 LaTeX3 宏来定义或者使用\numexpr
技巧,随你选择:
\documentclass{article}
\usepackage{ifthen}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\newwhiledo}{m m}
{
\bool_while_do:nn { \int_compare_p:n {#1} } { #2 }
}
\ExplSyntaxOff
\newcounter{MyCounter}
\def\StartValue{5}
\def\MaxValue{10}
\begin{document}
Note that 10 is missing when comparing to MaxValue:
\setcounter{MyCounter}{\StartValue}
\newwhiledo{\value{MyCounter} <= \MaxValue}{
\theMyCounter
\stepcounter{MyCounter}
}
\bigskip
\textbf{Hack:} Using \verb|\numexpr|
\setcounter{MyCounter}{\StartValue}
\whiledo{\numexpr\value{MyCounter}-1 < \MaxValue}{
\theMyCounter
\stepcounter{MyCounter}
}
\end{document}
答案2
<=
相当于not >
\documentclass{article}
\usepackage{ifthen}
\newcounter{MyCounter}
\begin{document}
Note that 10 is not missing when comparing to MaxValue:
\def\StartValue{5}
\def\MaxValue{10}
\setcounter{MyCounter}{\StartValue}
\whiledo{\not{\value{MyCounter}>\MaxValue}}{%
\theMyCounter
\stepcounter{MyCounter}
}
\end{document}