我想使用该etoolbox
包来管理计数索引上的一些循环意外事件。特别是,我想在循环的第一次和最后一次执行时执行不同的操作。
现在我可以制定方法来实现这一点,例如在这个 MWE 中。在第一种情况下,我使用嵌套,\ifboolexpr
而在第二种示例中,我为 s 设置了一个神秘的切换系统toggle
。这两种方法都实现了根本目标……
\documentclass{article}
\usepackage{etoolbox}
\newcounter{index}%
\begin{document}
\def\LAST{10}
\noindent%
\setcounter{index}{0}%
\whileboolexpr{test {\ifnumcomp{\theindex}<{\LAST}}}{%
\stepcounter{index}%
\ifboolexpr{test {\ifnumcomp{\theindex}{=}{1}}}%
{NOT\\}%
{\ifboolexpr{test {\ifnumcomp{\theindex}{=}{\LAST}}}%
{NOT\\}%
{\theindex\\}%
}%
}
\newtoggle{flag}
\noindent%
\setcounter{index}{0}%
\togglefalse{flag}%
\whileboolexpr{test {\ifnumcomp{\theindex}<{\LAST}}}{%
\stepcounter{index}%
\ifboolexpr{test {\ifnumcomp{\theindex}{=}{\LAST}}}{%
\togglefalse{flag}}{}%OFF FOR LAST COLUMN
\iftoggle{flag}{\theindex\\}{NOT\\}%
\toggletrue{flag}% ON FOR COLUMNS 2 TO \LAST-1
}%
\end{document}
但是,文档让我相信我应该能够使用布尔值and
或or
用单个 来实现这种偶然性\ifboolexpr
。但是,我无法构造这样的语法来做到这一点。有没有办法使用语法etoolbox
执行单个“if”检查来确定这是\LAST
循环中的“第一次偏移或偏移”,或者换句话说,这是循环中的“不是第一次偏移也不是偏移\LAST
”?
答案1
以下是组合条件的一种方法:
\documentclass{article}
\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox
\newcounter{index}%
\begin{document}
\def\LAST{10}
First: \par
\noindent%
\setcounter{index}{0}%
\whileboolexpr{test {\ifnumcomp{\theindex}<{\LAST}}}{%
\stepcounter{index}%
\ifboolexpr{test {\ifnumcomp{\theindex}{=}{1}}}%
{NOT\ }%
{\ifboolexpr{test {\ifnumcomp{\theindex}{=}{\LAST}}}%
{NOT}%
{\theindex\ }%
}%
}
Second: \par
\newtoggle{flag}
\noindent%
\setcounter{index}{0}%
\togglefalse{flag}%
\whileboolexpr{test {\ifnumcomp{\theindex}<{\LAST}}}{%
\stepcounter{index}%
\ifboolexpr{test {\ifnumcomp{\theindex}{=}{\LAST}}}{%
\togglefalse{flag}}{}%OFF FOR LAST COLUMN
\iftoggle{flag}{\theindex\ }{NOT\ }%
\toggletrue{flag}% ON FOR COLUMNS 2 TO \LAST-1
}%
Third: \par
\noindent%
\setcounter{index}{0}%
\whileboolexpr{test {\ifnumcomp{\value{index}}<{\LAST}}}{%
\stepcounter{index}%
\ifboolexpr{
test {\ifnumgreater{\value{index}}{1}}%
and
test {\ifnumless{\value{index}}{\LAST}}}%
{\theindex\ }%
{NOT\ }%
}
\end{document}
“First” 和 “Second” 与您原来的循环相匹配,而“Third” 使用and
子句来合并两个test
s。