我想创建在环境之后立即定义的宏\item
。enumerate
这些宏必须是全局的,这样在另一个环境中重新定义相同的宏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}