重新定义序言之外的现有命令

重新定义序言之外的现有命令

我有一个 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}等!

\输入

相关内容