我有几个相当长的文档,其中包含编号要点(教义问答),我希望能够使用使用范围参数的实用函数选择性地将它们包含在其他文档中。我遇到了麻烦,最终将其追溯到似乎\foreach
在某种私有范围内运行的方式。循环似乎可以正确迭代,但其中设置的内容(例如\newif
来自包的定义或切换)etoolbox
似乎没有坚持下去。
这彻底失败了:
\documentclass{scrartcl}
\usepackage{pgffor}
\usepackage{etoolbox}
\newcommand{\wkk}[1]{%
\foreach \x in {1,...,5}{%
\providetoggle{wkk\x}
}
\foreach \x in {#1}{%
\toggletrue{wkk\x}
}
% In a real example the following content would be \input here
\iftoggle{wkk1}{output 1 }{}
\iftoggle{wkk2}{output 2 }{}
\iftoggle{wkk3}{output 3 }{}
\iftoggle{wkk4}{output 4 }{}
\iftoggle{wkk5}{output 5 }{}
}
\begin{document}
\wkk{2,...,4}
\end{document}
但是,如果我将\foreach
循环替换为上面例子中它们应该执行的操作,它就可以正常工作:
\documentclass{scrartcl}
\usepackage{pgffor}
\usepackage{etoolbox}
\newcommand{\wkk}[1]{%
\providetoggle{wkk1}
\providetoggle{wkk2}
\providetoggle{wkk3}
\providetoggle{wkk4}
\providetoggle{wkk5}
\toggletrue{wkk2}
\toggletrue{wkk3}
\toggletrue{wkk4}
% In a real example the following content would be \input here
\iftoggle{wkk1}{output 1 }{}
\iftoggle{wkk2}{output 2 }{}
\iftoggle{wkk3}{output 3 }{}
\iftoggle{wkk4}{output 4 }{}
\iftoggle{wkk5}{output 5 }{}
}
\begin{document}
\wkk{2,...,4}
\end{document}
显然,这些都是笨拙的 MWE,我会从用正确的切换标记的外部源文件中包含内容。
我对这个包裹做错了什么pgffor
?或者从概念上来说,有没有更好的方法来做到这一点?
答案1
每个循环\pgffor
都是成组执行的,因此切换的定义和设置不会保留下来。
可以\toggletrue
通过编写来解决这个问题\global\toggletrue
,但没有“全局\providetoggle
”。但是你可以定义自己的:
\let\gprovidetoggle\providetoggle
\patchcmd{\gprovidetoggle}{\cslet}{\global\cslet}{}{}
例子:
\documentclass{scrartcl}
\usepackage{pgffor}
\usepackage{etoolbox}
\let\gprovidetoggle\providetoggle
\patchcmd{\gprovidetoggle}{\cslet}{\global\cslet}{}{}
\newcommand{\wkk}[1]{%
\foreach \x in {1,...,5}{%
\gprovidetoggle{wkk\x}%
\global\togglefalse{wkk\x}% set it to false
}%
\foreach \x in {#1}{%
\global\toggletrue{wkk\x}%
}%
% In a real example the following content would be \input here
\iftoggle{wkk1}{output 1 }{}%
\iftoggle{wkk2}{output 2 }{}%
\iftoggle{wkk3}{output 3 }{}%
\iftoggle{wkk4}{output 4 }{}%
\iftoggle{wkk5}{output 5 }{}%
}
\begin{document}
\wkk{2,...,4}
\end{document}