我目前正在与我的团队合作撰写毕业论文报告。我们需要使用 MATLAB 代码,而且由于我们使用 LaTeX 编写报告,因此我们还将代码发布到 LaTeX 并将其包含在附录中。
我们的教授希望我们的 MATLAB 代码中有大量的注释。如果我们在 MATLAB 中使用方程,我们必须在报告正文中引用方程编号。
问题是:有没有办法在我们的报告中使用现有方程的标签(在我们的 MATLAB 代码中使用 \ref{eq:some_equation})来自动引用所使用的方程编号?这是一个 MWE:
LaTeX 文档
\documentclass[12pt,letterpaper]{article}
\begin{document}
This is an equation that I will reference in MATLAB hopefully.
\begin{equation}
\label{eq:relativity}
E = mc^2
\end{equation}
\end{document}
MATLAB 代码
function test()
%% Appendix
% This is a test of referencing equations. See Equation
% \ref{eq:relativity}.
m = 1;
c = 3.0e8;
e = m*c^2;
上述原始文档中使用的 MATLAB LaTeX Publish
\documentclass[12pt,letterpaper]{article}
%\usepackage{amsmath}
\begin{document}
This is an equation that I will reference in Matlab hopefully.
\begin{equation}
\label{eq:relativity}
E = mc^2
\end{equation}
\subsection*{Appendix}
\begin{par}
This is a test of referencing equations. See Equation \ensuremath{\backslash}ref\{eq:relativity\}.
\end{par} \vspace{1em}
\begin{verbatim}
m = 1;
c = 3.0e8;
E = m*c^2;
\end{verbatim}
\begin{verbatim}
end
\end{verbatim}
\end{document}
显然,我希望显示方程编号,而不是\ref{eq:relativity}
更新:我尝试了<latex>\ref{eq:relativity}</latex>
哪个发布到
\begin{verbatim}latex\end{verbatim}\ensuremath{\backslash}ref\{eq:relativity\}\ensuremath{<}/latex\ensuremath{>}
答案1
为了使转换正常工作,您需要小心放置<latex>
/</latex>
标签的位置:该行之前或之后都不能有任何文本。当然,如果您只想将 放置\ref
在该标签中,那么这会带来问题,因为您必须这样做
% This is a test of referencing equations. See Equation
%
% <latex>
% \ref{eq:relativity}.
% </latex>
%
这将输出
This is a test of referencing equations. See Equation
\ref{eq:relativity}.
因此,请在latex
标签中写入整个段落:
function test()
%% Appendix
%
% <latex>
% This is a test of referencing equations. See Equation~\ref{eq:relativity}.
% </latex>
%
m = 1;
c = 3.0e8;
e = m*c^2;
再次强调,它之前的空行(注释行)非常重要,下面两个行都不起作用:
% foo
% <latex>
% This is a test of referencing equations. See Equation~\ref{eq:relativity}.
% </latex>
%
%
% <latex>
% This is a test of referencing equations. See Equation~\ref{eq:relativity}.
% </latex>
% foo
附录
我注意到默认情况下每个段落都会被这样标记:
\begin{par}
Text in the paragraph.
\end{par} \vspace{1em}
和可能旨在与HTML 中的 和 相对应,而 则\begin{par}
用于分隔段落,但这很奇怪。\end{par}
<p>
</p>
\vspace
幸运的是,可以自定义 Matlab 生成的代码类型。决定这一点的模板位于.xsl
名为 的文件中mxdom2latex.xsl
。在我的系统上,它位于
/usr/local/MATLAB/R2015b/toolbox/matlab/codetools/private/mxdom2latex.xsl
我假设其他系统上的路径会类似。您可以复制并编辑它。然后在发布选项中,您可以选择此.xsl
文件:
那么应该做什么样的编辑呢?\begin{par}
上面提到的内容定义在第 105-109 行(至少在我的版本中)。将这些行修改为
<xsl:template match="p">
<xsl:apply-templates/><xsl:text>
</xsl:text>
</xsl:template>
从您的问题来看,我认为您将此代码包含在不同的文档中,因此这意味着您不需要\documentclass
、 序言和document
环境。 序言逐字逐句地写在第 24-32 行和\end{document}
第 82 行,所有这些都可以从自定义文件中删除.xsl
。
Matlab 还会生成内容列表,如果您不想要,可以删除第 90-98 行(第 90 行有\subsection*{Contents}
,第 98 行有\end{itemize}
)。
删除所有这些后,如果您已发布somefunc.m
到somefunc.tex
,那么您可以\input{somefunc}
在主文档中执行此操作。
(我会发布整个编辑后的.xsl
文件,但我不确定从许可证角度来看这样做是否可以。话虽如此,尽管我对 XSL 一无所知,但像这样的简单修改还是很容易弄清楚的。)