我定义了两个盒子:
\documentclass{article}
\usepackage[most]{tcolorbox}
\newtcolorbox{one}{}
\newtcolorbox{two}{}
\begin{document}
\begin{one}
The new command works fine
\end{one}
\begin{two}
The new command works fine
\end{two}
\end{document}
但\foreach
结果错误:
\foreach \i in {one,two}{
\newtcolorbox{\i}{}
}
方法:
\foreach \i in {one,two}{
\expandafter\newtcolorbox{\csname\i\endcsname}{ }}
任何提示都将不胜感激。
答案1
循环中的每个循环都\foreach
在一个组内完成,因此\newtcolorbox
一旦组结束,声明就会丢失。
您可能会欣赏不需要组的通用循环:
\documentclass{article}
\usepackage{tcolorbox}
\ExplSyntaxOn
\NewDocumentCommand{\lforeach}{mm}
{% #1 = list, #2 = template
\cs_set:Nn \__lforeach_temp:n { #2 }
\clist_map_function:nN { #1 } \__lforeach_temp:n
}
\ExplSyntaxOff
\lforeach{one,two}{\newtcolorbox{#1}{}}
\begin{document}
\begin{one}
The new command works fine
\end{one}
\begin{two}
The new command works fine
\end{two}
\end{document}
如果您运行的 LaTeX 的发布日期早于 2020-10-01,那么您还需要\usepackage{xparse}
。
其思想与 相同\foreach
,但是您不需要使用诸如 之类的临时宏来\i
表示当前项目(这是使用分组的主要原因\foreach
),而是使用#1
。
您可以在各种情况下使用此循环。
答案2
\foreach
创建群组,我不确定其\csname...\endcsname
用途是什么,但以下有效。
\documentclass{article}
\usepackage[most]{tcolorbox}
\pgfkeys{new tcolorbox/.code=\newtcolorbox{#1}{},
new tcolorbox/.list={one,two}}
\begin{document}
\begin{one} The new command works fine \end{one}
\begin{two} The new command works fine \end{two}
\end{document}
答案3
一种仅使用 s 的方法\expandafter
。它有助于定义\addto
和\xaddto
。在这里,\foreach
只是将未来的命令串在一起放入全局 中\tmp
,该命令在退出组后执行。
\documentclass{article}
\usepackage[most]{tcolorbox}
\def\addto#1#2{\expandafter\gdef\expandafter#1\expandafter{\tmp#2}}
\def\xaddto#1#2{\expandafter\addto\expandafter#1\expandafter{#2}}
\def\tmp{}
\foreach \i in {one,two}{
\addto\tmp{\newtcolorbox}
\xaddto\tmp{\expandafter{\i}{}}
}\tmp
\begin{document}
\begin{one}
The new command works fine
\end{one}
\begin{two}
The new command works fine
\end{two}
\end{document}