反转布尔值以创建替代项列表

反转布尔值以创建替代项列表

有人知道如何在 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无需使用etoolboxand 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}

相关内容