ifboolexpr 带有切换列表 - 如果任何切换为真则为真

ifboolexpr 带有切换列表 - 如果任何切换为真则为真

我想编写一个包含例如问题集合的单独文件,但我想生成包含所有问题的不同子集的各种输出。

因此,在我的文件开头,我想说明应该打印哪个子集,然后我只得到相应的输出。

我找到了这个有用的问题并得出了以下 MWE:

\documentclass{article}

\usepackage{etoolbox}

%% toggles
\newtoggle{A}
\newtoggle{B}
\newtoggle{C}

%% chosen toggle
\toggletrue{C}

\newcommand{\question}[2]{%
\ifboolexpr { #1 } { #2 }{}
}

\begin{document}

\question { togl {A} or togl {B} } {
    Question is part of subset A or subset B!
    }{}%
\question { togl {A} or togl {C} } {
    Question is part of subset A or subset C!
    }{}%    

\end{document}

问题和子集​​越多,就越显得笨拙。所以我实际上只想写

\question { A,B } {Question is part of subset A or subset B!}%

这能做到吗?


似乎有可能使用any来扩展宏,但我无法让它与切换一起工作,或者至少它不能缩短代码。

答案1

简短而甜蜜,用递归完成。

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{etoolbox}
%% toggles
\newtoggle{A}
\newtoggle{B}
\newtoggle{C}
\newtoggle{D}
%% chosen toggle
\toggletrue{C}

\newcommand{\Question}[3]{%
 \def\toggletmp{F}%
 \Togl #1,\relax\relax%
 \if T\toggletmp #2\else#3\fi%
}
\def\Togl#1,#2\relax{\ifboolexpr {togl #1}%
  {\def\toggletmp{T}}%
  {\if \relax#2\relax\else\Togl#2\relax\fi}}
\begin{document}
\Question {A,B} {
    Question is part of subset A or subset B!}{Neither A nor B}\par
\Question {A,C} {
    Question is part of subset A or subset C!}{Neither A nor C}\par
\Question {C} {
    Question is part of subset C!}{Not C}\par
\Question {A,B,C,E} {
    Question is part of subset A or subset B,C,E!}{Neither A nor B, C, E}\par    
\Question {A,B,D} {
    Question is part of subset A or subset B,D!}{Neither A nor B, D}%
\end{document}

在此处输入图片描述

答案2

您可以使用 来完成此操作。如果您打算使用 ,则需要xparse重命名。\newtoggle\toggletrue\togglefalseetoolbox

\documentclass{article}

\usepackage{xparse}

\ExplSyntaxOn
% emulate \newtoggle
\NewDocumentCommand{\newtoggle}{m}
 {
  \bool_new:c { l_twww_toggle_#1_bool }
 }
\NewDocumentCommand{\toggletrue}{m}
 {
  \bool_set_true:c { l_twww_toggle_#1_bool }
 }
\NewDocumentCommand{\togglefalse}{m}
 {
  \bool_set_false:c { l_twww_toggle_#1_bool }
 }
% evaluate booleans 
\NewDocumentCommand{\question}{mm}
 {
  \bool_if:xT { \c_false_bool \clist_map_function:nN { #1 } \twww_add_boolean:n } { #2 }
 }
\cs_generate_variant:Nn \bool_if:nT { x }
\cs_new:Nn \twww_add_boolean:n
 {
  || \use:c { l_twww_toggle_#1_bool }
 }
\ExplSyntaxOff


\newtoggle{A}
\newtoggle{B}
\newtoggle{C}

%% chosen toggle
\toggletrue{C}

\begin{document}

\question{A,B}{Question is part of subset A or subset B!}

\question{A,C}{Question is part of subset A or subset C!}

\question{A,B,C}{Question is part of subset A or subset B or subset C!}

\end{document}

在此处输入图片描述

相关内容