可重复使用方程库

可重复使用方程库

我想做一些听起来很简单的事情。我想创建一个外部文件来存储我的方程式。然后我希望能够将这些方程式输入到文档中,而无需重新编写它们。

例如我想要这样的东西:

方程式.tex

\begin{equation}
F = ma
\label{newton2ndLaw}
\end{equation}

\begin{equation}
det(A-\lambda I)=0
\label{eigValProb}
\end{equation}

等等。然后我会继续在文档中使用上述文件。

文档.tex

%other \usepackages ...
\usepackage{Magic package that does what I want}
\useeqlibrary{equations.tex} %I just made up this command

\begin{document}
Lorem Ipsum text

\begin{equation}
 \geteq{eigValProb} %made up this command also
 \label{anequationlabel}
\end{equation}

\end{document}

在编译过程中,方程式 TeX 代码会自动插入到文档中。类似这样的内容:“输入一次,多次使用,保持代码整洁”。你们有人有什么想法吗?

答案1

下面使用了一些概念是否可以将所有数学公式写在单独的文件中,然后根据需要将其添加到主文件中?实现你的目标。它专注于重新定义环境,equation

  1. 抓住给予\label;并且
  2. 将环境的内容存储equation在宏中\equation@<label>

可通过以下方式检索\geteqn{<label>}。由于存储的内容包括原文中\label,技术上没有必要重新\label计算方程,但这并不重要。

在此处输入图片描述

\documentclass{article}
\usepackage{filecontents,environ,etoolbox}% http://ctan.org/pkg/{filecontents,environ,etoolbox}
\robustify\label% To avoid premature expansion of \label when storing content

\let\oldequation\equation% Store \begin{equation}
\let\endoldequation\endequation% Store \end{equation}

\makeatletter
\def\eq@l@bel@gr@b#1\label#2#3\@nil{%
  \gdef\eq@gr@bbed@l@bel{#2}}% This macro extracts the \label inside \begin{equation}...\end{equation}
\providecommand{\env@equation@save@env}{}% To keep environ happy...
\providecommand{\env@equation@process}{}
\newcommand{\useeqlibrary}[1]{%
  \RenewEnviron{equation}{% Redefine equation environment to capture it's body
    \expandafter\eq@l@bel@gr@b\BODY\@nil% Extract \label
    \expandafter\protected@xdef\csname equation@\eq@gr@bbed@l@bel\endcsname{\BODY}% Store equation in macro
  }%
  \input{#1}% Parse input file
}

\AtBeginDocument{% Restore original equation environment
  \let\equation\oldequation% Restore \begin{equation}
  \let\endequation\endoldequation% Restore \end{equation}
}

\newcommand{\geteqn}[1]{\csname equation@#1\endcsname}% Extract macro based on label
\makeatother

\begin{filecontents*}{equations.tex}
\begin{equation}
  F = ma \label{newton2ndLaw}
\end{equation}

\begin{equation}
  \mathrm{det}(A - \lambda I) = 0 \label{eigValProb}
\end{equation}
\end{filecontents*}

\useeqlibrary{equations.tex} %I just made up this command

\begin{document}

\begin{equation}
  \geteqn{eigValProb} %made up this command also
  \label{anequationlabel}
\end{equation}

See~(\ref{eigValProb}) or~(\ref{anequationlabel}).

\end{document}

如上所述,这仅适用于equation环境。可以以类似的方式扩展到其他环境。此外,它只提取第一的 \label(如果存在多个)。

相关内容