目的
你好Hello123哦豁 → <华文中宋>你好<Times New Roman>Hello123<华文中宋>哦豁
MATLAB画图——设置轴标签不同字体_matlab怎么更改坐标轴字体_BinHeon的博客
上面这篇文章已经给出了分别设置字体字号的方式,比如:
xlabel('\fontname{宋体}\fontsize{8}时间\fontname{Times New Roman}\fontsize{8}/s');
关键点在于 在字符标签前加<\fontname{宋体}\fontsize{8}>、<\fontname{Times New Roman}\fontsize{8}>。上面是在创建标签的时候就直接手动加上这些关键代码,那么在字符已经创建完的情况下,如何用代码自动检测并修改呢?
方案
解决思路:
步骤一:获取需要修改的标签对象
步骤二:识别标签对象字符中的中文和其它字符
步骤三:在中文和其它字符前分别添加关键代码
关键步骤二的实现方式请参见本人的另一篇文章
matlab如何分割中文与其它字符_tgf.E=mc²的博客
下面是针对修改.fig文件中标签字体所写的一个函数:
%% 分别设置中/英字体
function fontSet(FigNum)
% FigNum 数值数组类型,输入.fig文件的标号
% 交互获取用户选择
chiOptsout = uisetfont('请选择中文字体(样式/字号选择无效)'); % 打开字体选择对话框
engOptsout = uisetfont('请选择英文字体(样式/字号选择无效)');
chiFontname = chiOptsout.FontName;
engFontname = engOptsout.FontName;
for i = 1:length(FigNum) % 遍历图
figureNum = FigNum(i);
figure(figureNum);
% ---标签/图例字体属性调整
textObjs1 = findall(figure(figureNum), 'Type', 'text'); % 获取图形中的所有文本对象:刻度标签、标题
textObjs2 = findobj(figure(figureNum),'-property','String'); % 图例、其它人为增加的标签
textObjs = [textObjs1;textObjs2];
for j = 1:numel(textObjs)
textCont = string(textObjs(j).String);
if textCont == ""
continue;
end
set(textObjs(j), 'Interpreter', 'tex'); % 设置解释器为 TeX (LaTeX解析式,关键代码"\fontname{}"不会生效)
if ~contains(textCont, '\fontname') % 只处理还没有处理的字段
% 中英字段分割
result = splitChinese(textCont);
% 设置中文字段字体
result.Data(result.flag == 1) = strcat(['\fontname{',chiFontname,'}'],result.Data(result.flag == 1));
% 设置英文字段字体
result.Data(result.flag == 0) = strcat(['\fontname{',engFontname,'}'],result.Data(result.flag == 0));
% 重新连接字符
textObjs(j).String = [result.Data{:}];
end
end
end
% 分割中英文字符函数
function result = splitChinese(label)
% 确定汉字的位置
label = char(label);
log = arrayfun(@(x) (x >= '一' && x <= '龥'),label);
Indxs = find(diff(log) ~= 0);
result.Data = arrayfun(@(x,y) extractBetween(label,x,y),[0 Indxs]'+1,[Indxs length(label)]');
result.flag = [log(Indxs),log(end)];
end
end
直接上案例:
处理前:
fontSet([8 9 10]) % 对应fig图窗上的标号,如Figure 8 → 8
处理过程:
处理后:
over...