有人知道如何在 LaTeX 中反转布尔值吗?看起来一旦你进入逻辑测试,重置逻辑值就没有效果了。使用 etoolbox 包,我尝试了
\foreach \n in {1,2,3,4,5,5,6,7,8,9,e}{
\iftoggle{pauper}{
True
\togglefalse{pauper}
}{
False
\toggletrue{pauper}
}
}
它应该产生 True False True False True False True False True False,但只产生一串十个 True。我怎样才能让它变成 True False True False ....
如果这个问题解决了,我就可以解决一个更大的问题。也许这个更大的问题有一个我还没有想到的更优雅的解决方案,所以我也这样说:
上下文是一本教科书,我把作业和答案写在一起,然后调用作业文件两次。第一次布尔值赋值是 true,第二次是 false。
\begin{enumerate}
\item \ifthenelse{assignment}{$2+2$}{$4$}
...
\end{enumerate}
现在,我希望答案部分只包含奇数问题的答案,除了教师版包含所有问题的答案。因此 \item 理想情况下应该是这样的
% if assignment=false, then ...
% if item counter is odd:
\item \ifthenelse{assignment}{$2+2$}{$4$}
% but if item counter is odd:
\stepcounter{enumi}
% if assignment=true, then, regardless of counter:
\item \ifthenelse{assignment}{$2+2$}{$4$}
我努力了
\ifthenelse{\boolean{assignment}}{$2+2$}{
\ifthenelse{\boolean{oddItem}}{
\item $4$ \setboolean{oddItem}{false}
}{
\stepcounter{enumi} \setboolean{oddItem}{true}
}
}
但布尔值保持不变。我尝试了几种组合,也尝试了在内部 ifthenelse 之外设置它,如下所示,
\setboolean{oddItem}{\not\boolean{oddItem}}
但无济于事。使用切换而不是布尔值也是一样。
答案1
首先,的主体\foreach
位于组中,因此本地命令的效果仅限于单个迭代。对于您的第一个示例,这意味着\toggletrue
/\togglefalse
仅在同一个迭代内有效。要解决这个问题,如etoolbox
手册中所建议的,您可以在它们前面加上前缀,\global
以将其效果扩展到组之外:
\foreach \n in {1,2,3,4,5,5,6,7,8,9,e}{
\iftoggle{pauper}{
True
\global\togglefalse{pauper}
}{
False
\global\toggletrue{pauper}
}
}
应该会给出期望的结果。
无需进一步了解,就可以通过使用 LaTeX 来提供更简单的解决方案,\newif
而\ifodd
无需使用etoolbox
and ifthenelse。
首先,您可以使用创建一个新的条件,\newif\ifassignment
并使用将其设置为 true 或 false \assignmenttrue
\assignmentfalse
。然后,如果您有一个计数器(\theenumi
或\n
在您的中\foreach
),您可以使用检查它是否为奇数\ifodd
。
\begin{itemize}
\foreach\n in {1,...,10}{
\item Problem \n
\ifassignment%
\ifodd\n%
\relax%
\else%
-- Solution \n%
\fi
\else%
-- Solution \n%
\fi%
}
\end{itemize}
最难的部分是解决方案必须重复两次。有多种方法可以解决这个问题,但我介绍的方法是引入一个\printproblem
封装此逻辑的宏:
\newcommand{\printproblem}[2]{
\item #1%
\ifassignment%
\ifodd\n%
-- #2%
\else%
\relax%
\fi
\else%
-- #2%
\fi%
}
然后你可以做
\begin{itemize}
\foreach\n in {1,...,10}{
\printproblem{Problem \n}{Solution \n}
}
\end{itemize}
如果您没有使用实际循环,则\foreach
可以使用:\theenumi
\n
\newcommand{\solution}[1]{
\ifassignment%
\ifodd\theenumi%
-- #1%
\else%
\relax%
\fi
\else%
-- #1%
\fi%
}
在正文中:
\begin{enumerate}
\item Problem 1 \solution{Solution 1}
\item Problem 2 \solution{Solution 2}
\item Problem 3 \solution{Solution 3}
\item Problem 4 \solution{Solution 4}
\item Problem 5 \solution{Solution 5}
\end{enumerate}