在改进我的一个类文件时,我发现我multido
只在一行代码中使用了该包,自然而然地,我着手删除这种依赖关系。
我的类使用多个计数器和数组来计算和排版由相对较少的用户输入生成的大量信息。因此,在下文中,我不能简单地更改我的最小示例的变量结构。此外,我想保留数学模式来输出数字,以与文档的其余部分保持一致。
此外,实际的循环体比这个例子要复杂得多。
\documentclass{article}
\usepackage{etoolbox}%
\usepackage{multido}%
\usepackage{arrayjobx}%
\newcounter{RUNNER}%
\newcounter{THISOFTEN}%
\setcounter{THISOFTEN}{3}%
\newarray{SHOWME}%
\readarray{SHOWME}{Item1&Item2&Item3}%
\newarray{SHOWMORE}%
\readarray{SHOWMORE}{-3&-10&55}%
\newcommand*\PrintOLD{%
\multido{\i=1+1}{\value{THISOFTEN}}{%
\SHOWME(\i)($\SHOWMORE(\i)$)~}}%
\newcommand*\PrintNEW{%
\setcounter{RUNNER}{0}%
\whileboolexpr{test{\ifnumless{\value{RUNNER}}{\value{THISOFTEN}}}}{%
\stepcounter{RUNNER}%
\SHOWME(\value{RUNNER})($\SHOWMORE(\value{RUNNER})$)~}}%
\begin{document}
Hello World: \PrintOLD
Hello World: \PrintNEW
\end{document}
生成的输出
我的解决方案使用了etoolbox
添加的空白,但我似乎无法摆脱它。
pdflatex
和xelatex
(我通常使用)生成相同的输出。
whileboolexpr
到目前为止,我尝试通过添加新的boolean
或来绕过布尔表达式中的 if 子句toggle
,并将 if 子句移到循环体的末尾。我也尝试了unlessboolexpr
以及其他几个if…
版本。此外,我玩过expansion order
,但我肯定不是这方面的专家。
在更绝望的尝试中,我将宏缩小到一行,没有任何空格 - 只是为了确保万无一失。
我目前不太愿意尝试递归,因为我发现对于复杂、不断演化的循环体来说,递归更难维护。此外,我还有一些关于使用该whileboolexpr
构造来实现一些仍在待办事项列表中的功能的想法,这些功能到目前为止让我很头疼。
因此,我将非常感谢关于whileboolexpr
在这种情况下开展工作的想法或任何其他类似于经典循环的解决方案(最好不要引入新的包依赖关系)。
答案1
问题似乎出在解析数字的方式上,arrayjobx
例如
\SHOWME(\value{RUNNER})($\SHOWMORE(\value{RUNNER})$)~%%
\value{RUNNER}
返回 LaTeX 内部表示的数字,而不是可打印的数字,这是arrayjobx
预期的结果
尝试以下宏,一切正常:
\newcommand*\PrintNEWer{%
\def\aecnt{0}%\setcounter{RUNNER}{0}%
\whileboolexpr{
test { \ifnumcomp{\aecnt}{<}
{\value{THISOFTEN}}
}}
{%%
\edef\aecnt{\number\numexpr\aecnt+1\relax}%%
\SHOWME(\aecnt)($\SHOWMORE(\aecnt)$)~%%
}}%%
\SHOWME
但同样,只需稍微改写一下就足够了
任何一个
\SHOWME(\number\value{RUNNER})
或者
\SHOWME(\theRUNNER)
将工作。