很多工程师第一次在Matlab里输入数学公式时都会遇到这样的尴尬:想写个简单的积分符号∫,结果发现默认的TeX解释器根本不支持;好不容易找到替代方案,又发现公式排版歪歪扭扭。这就像拿着螺丝刀拧螺母,不是不能用,但总感觉哪里不对劲。
Matlab默认的'tex'解释器确实能处理基础的希腊字母和上下标,比如我们常用的α、β、γ这些希腊字母,或者x²这样的上标。但当我需要写矩阵方程、多重积分或者联立方程组时,就明显感觉到力不从心了。有次我在论文配图中需要插入一个带条件概率的贝叶斯公式,折腾了半天都没法完美呈现。
LaTeX引擎就像是专为数学公式打造的排版系统。举个例子,下面这段代码展示了两种解释器的差异:
matlab复制% 使用默认tex解释器
title('\int_0^1 x^2 dx') % 会显示错误或乱码
% 使用latex解释器
title('$$\int_0^1 x^2 dx$$','Interpreter','latex') % 完美显示积分符号
刚开始切换时,我发现TeX和LaTeX的语法有80%是相通的。比如输入希腊字母π,两种解释器都接受\pi的写法。但LaTeX提供了更丰富的数学符号库,比如:
\cup(∪)、\cap(∩)\Rightarrow(⇒)、\Leftrightarrow(⇔)\otimes(⊗)、\oplus(⊕)有个实用的技巧是:在Matlab命令窗口输入doc latex,可以查看完整的支持列表。我经常把这个页面开着当速查手册用。
设置解释器有几种不同的方式,适用于不同场景:
matlab复制set(gca,'TickLabelInterpreter','latex') % 坐标轴刻度
set(gca,'TitleInterpreter','latex') % 标题
matlab复制text(0.5,0.5,'$$\frac{a}{b}$$','Interpreter','latex')
matlab复制figure('DefaultTextInterpreter','latex') % 新建图形窗口时设置
在写技术报告时,经常需要展示推导过程。LaTeX的aligned环境可以完美解决这个问题:
matlab复制str = {'$$\begin{aligned}',...
'f(x) &= (a+b)^2 \\',...
' &= a^2 + 2ab + b^2 \\',...
'\end{aligned}$$'};
text(0.3,0.5,str,'Interpreter','latex')
注意几个细节:
&符号对齐等号\\要放在Matlab字符串的单引号内aligned环境包裹神经网络相关的论文中经常需要表示权重矩阵。下面这个例子展示了如何排版3×3矩阵:
matlab复制matrix_example = ['$$\begin{bmatrix}'...
'1 & 2 & 3 \\'...
'4 & 5 & 6 \\'...
'7 & 8 & 9'...
'\end{bmatrix}$$'];
title(matrix_example,'Interpreter','latex')
如果想加省略号,可以用\cdots(横向)、\vdots(纵向)、\ddots(对角)这些命令。我最近在可视化卷积核时就用到了这个技巧。
混合使用普通文本和公式时,经常遇到字号不统一的问题。我的解决方案是:
matlab复制title(['\fontsize{14}{16}\selectfont 普通文本 '...
'$$\fontsize{16}{18}\selectfont \sum_{n=1}^\infty$$'],...
'Interpreter','latex')
这里\fontsize{14}{16}表示14磅字号,16磅行距。注意数学环境内外的字号设置要分开。
Matlab字符串中的反斜杠\本身是转义字符,当遇到\sin这样的LaTeX命令时,可能会被错误解析。我通常采用这三种解决方法:
matlab复制text(0.5,0.5,'$$\sin(x)$$','Interpreter','latex') % 错误
text(0.5,0.5,'$$\\sin(x)$$','Interpreter','latex') % 正确
matlab复制function str = latexstr(s)
str = ['$$' strrep(s,'\','\\') '$$'];
end
matlab复制text(0.5,0.5,['$$' rawstring('\sin(x)') '$$'],'Interpreter','latex')
在撰写中文论文时,需要特别注意编码问题。推荐的做法是:
matlab复制title(['\fontsize{12}{0}\selectfont\宋体 能量方程:'...
'$$\nabla \cdot (\rho \mathbf{u}) = 0$$'],...
'Interpreter','latex','FontName','SimSun')
这里的关键点:
\mathbf等命令处理粗体在做参数敏感性分析时,我经常需要根据计算结果动态更新公式。这个技巧特别有用:
matlab复制a = 2.5;
b = 1.8;
formula = sprintf('$$y = %.2f\\sin(%.2fx)$$',a,b);
text(0.5,0.7,formula,'Interpreter','latex')
注意%.2f控制浮点数精度,同时要确保转义字符正确处理。
虽然Matlab不是化学软件,但用LaTeX引擎也能排版漂亮的化学式:
matlab复制chem_eq = ['$$\ce{2H2 + O2 ->[\text{点燃}] 2H2O}$$'];
text(0.3,0.5,chem_eq,'Interpreter','latex')
需要先加载mhchem宏包(通过\usepackage命令),这在论文配图中特别实用。
在标注曲线极值点时,可以结合LaTeX的\boxed命令突出显示:
matlab复制[x,y] = meshgrid(-2:0.1:2);
z = x.*exp(-x.^2-y.^2);
surf(x,y,z)
text(0,0,max(z(:)),...
'\boxed{\text{局部最大值}}',...
'Interpreter','latex')
这个技巧让我的毕业论文图表专业度直接提升了一个档次。
当图形中包含大量LaTeX公式时,渲染速度会明显变慢。经过多次测试,我总结出这些优化方法:
matlab复制set(gcf,'Renderer','painters') % 矢量渲染器
matlab复制if ~exist('formula_cache','var')
formula_cache = latex(sym('sin(x)/x'));
end
text(0.5,0.5,['$$' formula_cache '$$'],'Interpreter','latex')
\frac\mathrm替代不必要的数学字体$...$替代行间公式$$...$$虽然Matlab自带的导出功能不错,但有时需要更精细的控制:
matlab复制matlab2tikz('figurehandle',gcf,'filename','plot.tikz',...
'extraAxisOptions','ticklabel style={font=\tiny}')
这样导出的文件可以直接嵌入LaTeX文档,保持风格一致。
通过Matlab Engine API,可以在Python中调用Matlab的LaTeX渲染:
python复制import matlab.engine
eng = matlab.engine.start_matlab()
latex_code = eng.eval("latex(sym('sin(pi*x)'))",nargout=1)
这个工作流在我参与的跨语言项目中发挥了重要作用。