You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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排版公式,可通过以下方式尝试保留文本可搜索性:

  1. 先将图形保存为PDF,再通过第三方工具(如Ghostscript的pdftops)批量转换为EPS
  2. 批量脚本化流程示例:
% 生成图形后保存为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 07:43:12