如何在多个枚举环境中动态定义全局宏?

如何在多个枚举环境中动态定义全局宏?

我想创建在环境之后立即定义的宏\itemenumerate这些宏必须是全局的,这样在另一个环境中重新定义相同的宏enumerate必然会产生错误。

我在以下 MWE 中未能做到这一点,因为仍然可以重新定义现有的宏。你能解决这个问题吗?

\documentclass{article}
\newcommand\factory[2]{\expandafter\gdef\csname#1\endcsname{#2}}

\begin{document}
\begin{enumerate}
    \item \factory{foo}{This is foo.}
    \foo
    \item \factory{boo}{This is boo.}
    \boo
\end{enumerate}

\begin{enumerate}
    \item \factory{foo}{This is foo.}% this line should produce error!
    \foo
    \item \factory{goo}{This is goo.}
    \goo
\end{enumerate}
\end{document}

答案1

使用\@ifdefinable

\documentclass{article}

\makeatletter
\newcommand\factory[2]{%
  \expandafter\@ifdefinable\csname#1\endcsname{%
    \global\@namedef{#1}{#2}%
  }%
}
\makeatother

\begin{document}
\begin{enumerate}
    \item \factory{foo}{This is foo.}
    \foo
    \item \factory{boo}{This is boo.}
    \boo
\end{enumerate}

\begin{enumerate}
    \item \factory{foo}{This is foo.}
    \foo
    \item \factory{boo}{This is boo.}
    \boo
\end{enumerate}
\end{document}

相关内容