matlab如何自动检测标签中的中文和其它字符,并分别设置字体

目的

你好Hello123哦豁 → <华文中宋>你好<Times New Roman>Hello123<华文中宋>哦豁

MATLAB画图——设置轴标签不同字体_matlab怎么更改坐标轴字体_BinHeon的博客-CSDN博客

上面这篇文章已经给出了分别设置字体字号的方式,比如:

xlabel('\fontname{宋体}\fontsize{8}时间\fontname{Times New Roman}\fontsize{8}/s');

关键点在于 在字符标签前加<\fontname{宋体}\fontsize{8}>、<\fontname{Times New Roman}\fontsize{8}>。上面是在创建标签的时候就直接手动加上这些关键代码,那么在字符已经创建完的情况下,如何用代码自动检测并修改呢?

方案

解决思路:

步骤一:获取需要修改的标签对象

步骤二:识别标签对象字符中的中文和其它字符

步骤三:在中文和其它字符前分别添加关键代码

关键步骤二的实现方式请参见本人的另一篇文章

matlab如何分割中文与其它字符_tgf.E=mc²的博客-CSDN博客

下面是针对修改.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...

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值