![通过包 mcode 包含 MATLAB 代码](https://linux22.com/image/240532/%E9%80%9A%E8%BF%87%E5%8C%85%20mcode%20%E5%8C%85%E5%90%AB%20MATLAB%20%E4%BB%A3%E7%A0%81.png)
我正在尝试使用一个非常方便的包 mcode.sty 将 MATLAB 代码包含到我的论文中,http://www.mathworks.com/matlabcentral/fileexchange/8015-m-code-latex-package
这个包本身运行得很好,但我无法让它与我的论文一起工作。我怀疑我加载的包一定存在某种冲突。我得到的错误是:
./chapter1/source/section1-4.tex:8: LaTeX Error: \begin{document} ended by \end{figure}.
请使用我创建的 MWE 进行尝试,您可以从我的 Dropbox 下载它:http://dl.dropbox.com/u/6275106/MWE.zip
在 dissertation-bec-mwe.sty 文件中,有一个部分我已确定与问题相关。只需对第 783-819 行的这一部分进行注释即可使文档通过编译,尽管我的图标题间距会加倍。
编辑:我发现 xcolor 包与 sty 文件中对 xfloat 的定义相冲突是根本原因。mcode 需要 Xcolor,如果只启用此包而不启用 mcode 包,则会导致上述行为。这就是为什么普通列表包可以工作而 mcode 不行的原因。仍在尝试弄清楚如何让两者(xfloat 和 xcolor)很好地配合。
论文中的任何图都会发生这种情况,只要它是第一个图即可。如果我注释掉 mcode usepackage 和 mcode content 部分,文档就可以正常编译。
答案1
因此我解决了这个问题并想记录下来以防其他人遇到同样的问题。
关键的启示来自于这个有类似问题的论坛帖子:http://www.latex-community.org/forum/viewtopic.php?f=45&t=4766&start=10
问题源于我的dissertation.sty
工作表xcolor
和xfloat
。工作.sty
表在浮动和脚注中定义了自定义行距,单倍,而不是使用 的 2 基线。它以一种特别糟糕的方式做到了这一点,据我所知,xfloat
它在全球范围内进行了重新定义。xfloat
解决方案是保留内核xfloat
,并创建一个新的xfloat
调用myxfloat
以供在图中使用。这允许间距命令按预期工作,同时保留与的兼容性xcolor
。 这里是原始xfloat
定义,
\def\@xfloat#1[#2]{\ifhmode \@bsphack\@floatpenalty -\@Mii\else
\@floatpenalty-\@Miii\fi\def\@captype{#1}\ifinner
\@parmoderr\@floatpenalty\z@
\else\@next\@currbox\@freelist{\@tempcnta\csname ftype@#1\endcsname
\multiply\@tempcnta\@xxxii\advance\@tempcnta\sixt@@n
\@tfor \@tempa :=#2\do
{\if\@tempa h\advance\@tempcnta \@ne\fi
\if\@tempa t\advance\@tempcnta \tw@\fi
\if\@tempa b\advance\@tempcnta 4\relax\fi
\if\@tempa p\advance\@tempcnta 8\relax\fi
}\global\count\@currbox\@tempcnta}\@fltovf\fi
\global\setbox\@currbox\vbox\bgroup
\def\baselinestretch{1}
\ifx\undefined\selectfont
\small\normalsize
\else
\@newbaseline
\fi
\boxmaxdepth\z@
\hsize\columnwidth \@parboxrestore}
\long\def\@footnotetext#1{\insert\footins{\def\baselinestretch{1}\footnotesize
\interlinepenalty\interfootnotelinepenalty
\splittopskip\footnotesep
\splitmaxdepth \dp\strutbox \floatingpenalty \@MM
\hsize\columnwidth \@parboxrestore
\edef\@currentlabel{\csname p@footnote\endcsname\@thefnmark}\@makefntext
{\rule{\z@}{\footnotesep}\ignorespaces
#1\strut}}}
和这里是新的定义:
% Save LaTeX kernel version of \@xfloat
\makeatletter
\let\my@xfloat\@xfloat
\makeatother
% Create a modified copy of \@xfloat using the kernel definition
\makeatletter
\def\@xfloat#1[#2]{
\my@xfloat#1[#2]%
\def\baselinestretch{1}%
% I COMMENTED THIS PART BELOW.
% \@normalsize \normalsize
%}
%\makeatother
%
%%%
%%% Reset baselinestretch within footnotes and floats. Originally stolen
%%% from Stanford thesis style.
%%%
%\def\@xfloat#1[#2]{\ifhmode \@bsphack\@floatpenalty -\@Mii\else
% \@floatpenalty-\@Miii\fi\def\@captype{#1}\ifinner
% \@parmoderr\@floatpenalty\z@
% \else\@next\@currbox\@freelist{\@tempcnta\csname ftype@#1\endcsname
% \multiply\@tempcnta\@xxxii\advance\@tempcnta\sixt@@n
% \@tfor \@tempa :=#2\do
% {\if\@tempa h\advance\@tempcnta \@ne\fi
% \if\@tempa t\advance\@tempcnta \tw@\fi
% \if\@tempa b\advance\@tempcnta 4\relax\fi
% \if\@tempa p\advance\@tempcnta 8\relax\fi
% }\global\count\@currbox\@tempcnta}\@fltovf\fi
% \global\setbox\@currbox\vbox\bgroup
% \def\baselinestretch{1}
% OLD SPACING TWEAK CONTINUES BELOW
\ifx\undefined\selectfont
\small\normalsize
\else
\@newbaseline
\fi
\boxmaxdepth\z@
\hsize\columnwidth \@parboxrestore}
\long\def\@footnotetext#1{\insert\footins{\def\baselinestretch{1}\footnotesize
\interlinepenalty\interfootnotelinepenalty
\splittopskip\footnotesep
\splitmaxdepth \dp\strutbox \floatingpenalty \@MM
\hsize\columnwidth \@parboxrestore
\edef\@currentlabel{\csname p@footnote\endcsname\@thefnmark}\@makefntext
{\rule{\z@}{\footnotesep}\ignorespaces
#1\strut}}}
希望这能帮助到其他人,我知道这确实让我困惑了好几天。感谢上帝保佑我本科物理专业学习的所有编程,我甚至看不懂 TeX,但我肯定能把互联网上的一些随机样本拼凑起来!