我发布这个信息是因为它可能对任何人都有用;这实际上不是一个问题。
在环境内定义的命令(如 enumerate)自动变得脆弱,并且在环境之外丢失。这通常很不方便。但是,可以将定义设为全局的。在我之前的问题中如何制作一个命令来自动处理命令列表,@Skillmon 帮我解决了这个问题,我想知道如何针对指定的(已定义的)命令名称列表自动执行全局化过程。这比您想象的要棘手。
虽然这是一个很好的解决方案,但如果您在大型文档中执行大量此类操作,则必须确保所有全局定义都有不同的名称。
但是,如果您以后需要命令在其定义环境之外使用时,它们仅在文档的本地部分中需要,那么将这些定义存储在文件中并在需要时重新导入它们可能更有意义。这样,不同的定义集就不必赋予互斥的名称集。与以前一样,自动化这一点很棘手。这是一个可行的示例。它包括由于以下@Skillmon、@egreg 和@David Carlisle 的评论而做出的改进。
\documentclass{article}
\usepackage{fp}
\usepackage{ifthen}
\usepackage{etoolbox}
\makeatletter % These "\makeat"s must be outside the newcommand
\newwrite\defsout
\newcommand{\WriteDefsToFile}[2]{%
\immediate\openout\defsout=#1_defs.tex
\@for\cs:={\unexpanded{#2}}\do{%
\immediate\write\defsout{%
\def\expandafter\unexpanded\expandafter{\cs}{\cs}%
}%
}%
\immediate\write\defsout{\unexpanded{ }}%
\immediate\closeout\defsout
}
\makeatother
\begin{document}
\def\RandSeed{\the\year}
Start an enumerate.
\begin{enumerate}
\item
Define some commands related to what this item's about.
\FPeval{\RnSd}{clip(\RandSeed*9876)} % It's not important what coomands are being defined
\FPseed\RnSd
\FPrandom{\rndA}
\FPrandom{\rndB}
\FPrandom{\rndC}
\FPeval{\uu}{trunc(11*\rndA, 0)}
\FPeval{\vv}{trunc(- 30 - 61*\rndB, 0)}
\FPeval{\ww}{trunc(101*\rndC + 100, 0)}
Some of the text involves these commands: \uu, \vv\ \& \ww.
\WriteDefsToFile{UVW}{\uu,\vv,\ww}
\end{enumerate}
%%% Following would give and "Undefined control sequence" error
%More text involving \uu, \vv\ \& \ww.
\input{UVW_defs}
After the enumerate, there's more text involving these commands: \uu, \vv\ \& \ww.
\end{document}