我想编写一个包含例如问题集合的单独文件,但我想生成包含所有问题的不同子集的各种输出。
因此,在我的文件开头,我想说明应该打印哪个子集,然后我只得到相应的输出。
我找到了这个有用的问题并得出了以下 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
\togglefalse
etoolbox
\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}