我有一个 Latex 文档,其中很多文本和图形都是由程序自动生成的。在一个最小的示例中,最终文档如下所示:
\documentclass{memoir}
%% This file is generated automatically, and is full of
%% \newcommand definitions
\input{variables}
\begin{document}
\input{text} % makes heavy use of commands defined in variables.tex
\end{document}
生成文件的程序variables.tex
有多个选项,可以更改其定义的 Latex 命令的返回值。这意味着我始终可以使用与结构相同的文档,但可以控制实际内容variables.tex
。
现在我想text.tex
在同一个文档中执行两次,每次使用variables-X.tex
以不同选项构建的文件。但是,它们都定义了具有相同名称的不同命令。
我会怎么做?我脑子里会想:
\documentclass{memoir}
\begin{document}
\input{variables-1}
\input{text}
\input{variables-2}
\input{text}
\end{document}
但是它失败了,并显示“命令 \SequencesDate 已定义。”(这是 中定义的命令之一)。如果我使用variables.tex
而不是,则会收到“\SequencesDate 未定义”错误。\newcommand
\renewcommand
我的实际情况有点复杂。我希望这不会给问题增加额外的噪音,但我猜它可能会对可以做的事情产生一些影响。 中定义的命令variables.tex
主要是带有灰色背景的数字。但这些命令仍然用于涉及fp
包的操作,这是通过重新定义控制背景的命令来完成的。像这样:
文件variables.tex
\newcommand{\Foo}{\ScriptValue{5.3}}
\newcommand{\Bar}{\ScriptValue{5.6}}
文件text.tex
\FPmin{\MinFooBar}{\Foo}{\Bar}
The smallest foobar is \MinFooBar
文件document.tex
\documentclass{memoir}
\usepackage{color}
\usepackage{fp}
\input{variables}
%% Color automatic values with grey background
\newcommand{\ScriptValue}[1]{\setlength{\fboxsep}{0pt}\colorbox[gray]{0.8}{\strut #1}}
%% We also want to make operations with those values in LaTeX
%% using FPeval but FPeval fails because ScriptValue gets expanded into
%% something non-numeric. So we use the following trick: we store the
%% original ScriptValue and FPeval macros, and then replace FPeval with
%% something that temporarily disables ScriptValue while we call the
%% original FPeval.
%% See https://tex.stackexchange.com/questions/159155/identify-pieces-of-text-automatically-generated-from-input-and-new-command
%% and https://tex.stackexchange.com/questions/283655/overloading-functions-of-the-fp-package
\let\RealScriptValue\ScriptValue
\let\RealFPmin\FPmin
\renewcommand{\FPmin}[3]{%
\renewcommand{\ScriptValue}[1]{##1}%
\RealFPmin{\UnmarkedResult}{#2}{#3}%
\edef#1{\noexpand\ScriptValue{\UnmarkedResult}}%
\renewcommand{\ScriptValue}{\RealScriptValue}%
}
\begin{document}
\input{text}
\end{document}
答案1
让你的‘variables.tex’生成器做一个循环并针对每个定义的命令\foo
等等说出来\let\foo\relax
。
这样,它在每个输入的顶部都是未定义的variables.tex
另一种方法:使用\undef{\foo}
或\csundef{foo}
来自etoolbox
包。
变量.tex
\let\foo\relax
\let\foobar\relax
\newcommand{\foo}{Foo}
\newcommand{\foobar}{Foobar}
司机
\documentclass{memoir}
%% This file is generated automatically, and is full of
%% \newcommand definitions
\begin{document}
\input{variables}
\input{text} % makes heavy use of commands defined in variables.tex
\input{variables}% It will do here too with the same file
\input{text} % makes heavy use of commands defined in variables.tex
\end{document}
文本.tex
\foo\ and \foobar\ are nice commands
更新
另一种没有繁琐语句的方法\let\foo\relax
:
使用
\begingroup
\input{variables-1}
\input{text}
\endgroup
对于每个相关情况。在这种情况下,之前一定不能出现任何\input{variables}
等!
\输入