whiledo 中的小于或等于比较

whiledo 中的小于或等于比较

我正在清理代码tikz 中的埃拉托斯特尼筛法,但我发现当我最初编写代码时,我无法弄清楚如何<=在 内进行比较\whiledo,因此不得不使用<比所需数字多一个的数字进行比较。我觉得这像是黑客行为,而且由于@StefanKottwitz 正在考虑在另一个网站上发布此tikz示例,我宁愿不诉诸这种黑客行为。

问题:

如何实现诸如以下的<=比较\whiledo

\whiledo{\value{MyCounter} <= \MaxValue}{

笔记:

  • 尽管我很想,但我无法使用\foreachfrom pgf

代码:

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

相关内容