这个问题导致了一个新的方案的出现:
matlab-prettifier
有人能快速轻松地排版附录中一些相对较长的 MATLAB 代码吗?我查了几种方法,发现这个mcode
包是可行的,但似乎无人维护……
我的代码中有很多方程式,因此我更喜欢一种避免使用$
表示方程式的解决方案。
此外,如果可能的话,如果有一种方法可以保留 MATLAB 的所有“自然”编码颜色(例如绿色表示注释),那就太好了……
任何想法?
答案1
这是我用于 matlab 代码的模板:
\documentclass{article}
\usepackage{listings}
\usepackage{color} %red, green, blue, yellow, cyan, magenta, black, white
\definecolor{mygreen}{RGB}{28,172,0} % color values Red, Green, Blue
\definecolor{mylilas}{RGB}{170,55,241}
\begin{document}
\lstset{language=Matlab,%
%basicstyle=\color{red},
breaklines=true,%
morekeywords={matlab2tikz},
keywordstyle=\color{blue},%
morekeywords=[2]{1}, keywordstyle=[2]{\color{black}},
identifierstyle=\color{black},%
stringstyle=\color{mylilas},
commentstyle=\color{mygreen},%
showstringspaces=false,%without this there will be a symbol in the places where there is a space
numbers=left,%
numberstyle={\tiny \color{black}},% size of the numbers
numbersep=9pt, % this defines how far the numbers are from the text
emph=[1]{for,end,break},emphstyle=[1]\color{red}, %some words to emphasise
%emph=[2]{word1,word2}, emphstyle=[2]{style},
}
\section*{Matlab Code}
\lstinputlisting{myfun.m}
\end{document}
这产生了以下输出(我没有把我的 matlab 文件放在这里,但从输出中应该可以清楚地看出):
答案2
对于在 LaTeX 中排版 Matlab 代码,请考虑使用matlab-prettifier
包裹。
它搭载在listings
软件包上,不需要太多配置,并且会跟踪上下文(在后台),以便在 Matlab 编辑器中突出显示代码。在这方面,可以说它比其他可用选项(、、minted
等)做得更好。listings
mcode
该包当前执行的语法突出显示matlab-prettifier
包括:
- 上下文不敏感的关键字(例如,,
for
),while
break
- 上下文相关的关键字(例如
end
,,properties
)events
, - (引用)字符串,
- 单行注释和块注释,
- 行继续符 (
...
), - 代码部分标题。
- 系统命令。
其他功能包括
- 三种预定义样式:标准、黑白和
MatlabLexer
模仿 Pygments (minted
) 输出的 -like 样式, listings
与环境和宏的无缝兼容性,- 手动突出显示具有共享范围的变量,
- 手动突出显示未加引号的字符串,
- 用于轻松排版代码片段中的占位符的宏,
- 根据周围环境自动缩放内联代码,
- 仅打印 Matlab 函数头的选项(参见这)。
matlab-prettifier
在 CTAN 以及 TeX Live 和 MiKTeX 上均可用。如果您愿意,可以从GitHub 存储库。
一些例子
为了进行比较,这里有一些由 Matlab 编辑器排版matlab-prettifier
并显示在 Matlab 编辑器中的代码示例。
代码
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{bigfoot} % to allow verbatim in footnote
\usepackage[numbered,framed]{matlab-prettifier}
\usepackage{filecontents}
\begin{filecontents*}{person.m}
classdef person
properties %(here, properties is a keyword)
mass=80;
height=1.80;
end
methods
function BMI = getBMI(height,weight)
BMI = person.mass/person.mass^2;
end
end
end
\end{filecontents*}
\begin{filecontents*}{sample.m}
%% Code sections are highlighted.
% System command are supported...
!gzip sample.m
% ... as is line continuation.
A = [1, 2, 3,... % (mimicking the ouput is good)
4, 5, 6]
fid = fopen('testFile.text', 'w')
for i=1:10
fprintf(fid,'%6.2f \n', i);
end
x=1; %% this is just a comment, though
% Context-sensitive keywords get highlighted correctly...
p = properties(mydate); %(here, properties is a function)
x = linspace(0,1,101);
y = x(end:-1:1)
% ... even in nonsensical code.
]end()()(((end end)end ))))end (function end
%{
block comments are supported
%} even
runaway block comments
are
\end{filecontents*}
\let\ph\mlplaceholder % shorter macro
\lstMakeShortInline"
\lstset{
style = Matlab-editor,
basicstyle = \mlttfamily,
escapechar = ",
mlshowsectionrules = true,
}
\begin{document}
\lstlistoflistings
\lstinputlisting[caption = {Some class definition}]{person.m}
Before you use any "for"~loop, refresh your memory on Matlab blocks.%
\footnote{Any occurence of "for" must have a matching "end".}
\lstinputlisting[caption = {Sample code from Matlab}]{sample.m}
\pagebreak
\begin{lstlisting}[caption = {For educational purposes}]
% example of while loop using placeholders
while "\ph{condition}"
if "\ph{something-bad-happens}"
break
else
% do something useful
end
% do more things
end
\end{lstlisting}
\end{document}
答案3
这mcode
包裹仍然支持 Matlab 代码格式,设置默认lstlisting
环境(从listings
) 格式与 Matlab 格式相同。它还提供\mcode{<code>}
内联 Matlab 代码。
\documentclass{article}
% http://www.mathworks.com/matlabcentral/fileexchange/8015-m-code-latex-package
\usepackage[framed,numbered,autolinebreaks,useliterate]{mcode}
\begin{document}
\begin{lstlisting}
function y = myfun(aa, sigma, options)
sigma
y = aa .* pdf('logn', aa, -0.5*sigma^2, sigma)
%y = 1/(sigma.*sqrt(2.*pi)) .* exp((-((log(aa)+0.5*sigma.^2)).^2) ./ (2.*sigma.^2));
\end{lstlisting}
\end{document}
类似参考:内联 MATLAB 代码
答案4
你试过了吗
\begin{verbatim}
Matlab code
\end{verbatim}