我想做一些听起来很简单的事情。我想创建一个外部文件来存储我的方程式。然后我希望能够将这些方程式输入到文档中,而无需重新编写它们。
例如我想要这样的东西:
方程式.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
以
- 抓住给予
\label
;并且 - 将环境的内容存储
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
(如果存在多个)。