如何在Matlab中用LaTeX解释器生成带特殊字体的可选中文字EPS图?
解决MATLAB生成带可搜索文字的特殊字体EPS文件问题
问题描述
希望将MATLAB生成的图形保存为使用特殊字体(如Adobe Garamond Pro)的EPS文件,目前通过设置LaTeX作为解释器能满足字体需求,但生成的EPS中文字会被渲染为矢量路径,无法选中或搜索。需要保留文字的可编辑/搜索属性,且需批量处理约100张图,拒绝手动方案。
当前实现代码如下:
% 选择要应用到所有相关对象的字体名称和解释器 setfontname = ('Adobe Garamond Pro'); setinterpreter = ('latex'); % 将所有解释器从tex改为latex list_factory = fieldnames(get(groot,'factory')); index_interpreter = find(contains(list_factory,'Interpreter')); for i = 1:length(index_interpreter) default_name = strrep(list_factory{index_interpreter(i)},'factory','default'); set(groot, default_name,setinterpreter); end % 将所有字体名称设置为目标字体 set(groot,'DefaultAxesFontName', setfontname) set(groot,'defaultUicontrolFontName', setfontname,'defaultUitableFontName', setfontname,'defaultAxesFontName', setfontname,'defaultTextFontName', setfontname,'defaultUipanelFontName', setfontname) clabelfont = setfontname; clabelinterpreter = (setinterpreter); % 设置数据 ix = [0 50 100 140]; rpmx = [0 1000/6 1000/3 500 2000/3 5000/6 1000]; Qw = [ 0 0 0 0 0 2.97 4.04 4.91 0 7.60 10.92 13.16 0 12.46 17.45 21.02 0 17.56 25.64 30.58 0 24.92 34.42 41.92 0 28.48 41.30 49.57]; % 生成图形 close all figure('Position', [500, 100, 250, 250]) [C,h] = contourf(ix,rpmx,Qw,[0 1 5 10 15 20 25 30 40],'ShowText','on'); xlabel('Current [A]') ylabel('Speed [rpm]') title('Core losses [W]') caxis([0 40]) clabel(C,h,'FontName',clabelfont,'interpreter',clabelinterpreter) % 保存为EPS文件 print(['forstackof'],'-depsc')
解决方案
核心原因:使用LaTeX解释器时,MATLAB会将文字渲染为矢量路径(而非可编辑文本),导致无法选中搜索。以下是两种批量可行的方案:
方案一:直接使用系统字体(无需LaTeX解释器)
如果仅需特殊字体而非LaTeX的公式排版能力,这是最优解:
- 确保目标字体(如Adobe Garamond Pro)已安装在系统中,可通过
listfonts命令查看MATLAB识别的字体列表 - 取消全局LaTeX解释器设置,改用MATLAB默认的
tex解释器(或不指定,默认即为tex),直接通过全局字体设置应用目标字体 - 生成的EPS文件会嵌入字体,文字保持可编辑/搜索属性
修改后的示例代码:
% 选择目标字体名称 setfontname = 'Adobe Garamond Pro'; % 全局设置所有对象的默认字体(无需切换LaTeX解释器) set(groot, ... 'DefaultAxesFontName', setfontname, ... 'DefaultTextFontName', setfontname, ... 'DefaultUicontrolFontName', setfontname, ... 'DefaultUitableFontName', setfontname, ... 'DefaultUipanelFontName', setfontname); % 设置数据(与原代码一致) ix = [0 50 100 140]; rpmx = [0 1000/6 1000/3 500 2000/3 5000/6 1000]; Qw = [ 0 0 0 0 0 2.97 4.04 4.91 0 7.60 10.92 13.16 0 12.46 17.45 21.02 0 17.56 25.64 30.58 0 24.92 34.42 41.92 0 28.48 41.30 49.57]; % 生成图形(无需指定LaTeX解释器) close all figure('Position', [500, 100, 250, 250]) [C,h] = contourf(ix,rpmx,Qw,[0 1 5 10 15 20 25 30 40],'ShowText','on'); xlabel('Current [A]') ylabel('Speed [rpm]') title('Core losses [W]') caxis([0 40]) clabel(C,h,'FontName',setfontname) % 保存为EPS文件(推荐用exportgraphics,批量处理更稳定) exportgraphics(gcf, 'forstackof.eps', 'ContentType', 'vector')
方案二:必须使用LaTeX时的折中方案(适用于复杂公式场景)
如果需要LaTeX排版公式,可通过以下方式尝试保留文本可搜索性:
- 先将图形保存为PDF,再通过第三方工具(如Ghostscript的
pdftops)批量转换为EPS - 批量脚本化流程示例:
% 生成图形后保存为PDF(保留LaTeX解释器) exportgraphics(gcf, 'temp.pdf', 'ContentType', 'vector', 'Interpreter', 'latex') % 调用系统命令转换为EPS(需提前安装Ghostscript) system('pdftops -eps temp.pdf forstackof.eps'); delete('temp.pdf');
注意:此方法依赖第三方工具,且部分场景下仍可能出现文字转路径的情况,需测试验证。
批量处理建议
将图形生成、字体设置、保存的逻辑封装为函数,遍历数据列表或文件路径即可实现批量处理,示例框架:
function batch_generate_eps(data_list, output_dir) setfontname = 'Adobe Garamond Pro'; % 全局字体设置 set(groot, ... 'DefaultAxesFontName', setfontname, ... 'DefaultTextFontName', setfontname); mkdir(output_dir); for idx = 1:length(data_list) % 加载当前数据(根据实际场景修改) ix = data_list{idx}.ix; rpmx = data_list{idx}.rpmx; Qw = data_list{idx}.Qw; % 生成图形 figure('Position', [500, 100, 250, 250]) [C,h] = contourf(ix,rpmx,Qw,[0 1 5 10 15 20 25 30 40],'ShowText','on'); xlabel('Current [A]') ylabel('Speed [rpm]') title('Core losses [W]') caxis([0 40]) clabel(C,h,'FontName',setfontname) % 保存EPS filename = fullfile(output_dir, sprintf('figure_%03d.eps', idx)); exportgraphics(gcf, filename, 'ContentType', 'vector'); close(gcf); end end
内容的提问来源于stack exchange,提问作者Samuel Estenlund
相关产品推荐
相关产品推荐

