Newtcolorbox 和 foreach

Newtcolorbox 和 foreach

我定义了两个盒子:

\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}

相关内容