在matlab中为绘图中的中英文字符串使用不同的字体

  |   0 评论   |   178 浏览

废话不多说,直接上代码

 1function out = texWrap(inputStr, options)
 2% 包装字符串,为英文和中文(非英文)分别指定字体,可用于默认的tex解释器,以免出现口口口
 3% 默认的字体为宋体/Times New Roman
 4% 例如:
 5%   xlabel(texWrap("拉力/kN"))
 6%   xlabel(texWrap("拉力/kN", cnFontName = "黑体", enFontName = "Tahoma"))
 7% 实践时可以用函数包装目标函数或者wrap函数本身,例如:
 8%   xlbl = @(x) xlabel(texWrap(x));
 9%   或者
10%   p = @(x) texWrap(x, cnFontName = "黑体", enFontName = "Tahoma")
11%   xlabel(p("拉力/kN"))
12
13arguments
14    inputStr {mustBeNonzeroLengthText}
15    options.cnFontName {mustBeTextScalar} = "宋体"
16    options.enFontName {mustBeTextScalar} = "Times New Roman"
17end
18if ~isstring(inputStr)
19    inputStr = string(inputStr);
20end
21
22cnFontName = options.cnFontName;
23enFontName = options.enFontName;
24
25    function out = texWrapInternal(str)
26        % 使用正则表达式分割字符串
27        letterRange = "\x00-\x7F\x370-\x3FF";
28        pattern = "((\s*[^"+ letterRange +"]+)+)|(["+ letterRange +"]+)";
29        tokens = regexp(str, pattern, "tokens");
30        segments = string(tokens);
31
32        delims = ["\fontname{" + cnFontName + "}", "\fontname{" + enFontName + "}"];
33
34        if isempty(regexp(segments(1), "(["+ letterRange +"]+)", "tokens"))
35            delims = fliplr(delims);
36        end
37
38        % 使用两次join拼接最终输出的字符串
39        pairLen = floor(length(segments)/2);
40        pairs = strings(pairLen, 1);
41
42        for i = 1:pairLen
43            start = 2*i - 1;
44            pairs(i) = segments(start:start+1).join(delims(1));
45        end
46
47        if mod(length(segments), 2)
48            pairs(end+1) = segments(end);
49        end
50
51        out = delims(2) + (pairs.join(delims(2)));
52    end
53
54out = arrayfun(@texWrapInternal, inputStr);
55end

标题:在matlab中为绘图中的中英文字符串使用不同的字体
作者:joyqat
地址:https://joyqat.top/articles/2024/09/24/1727184333724.html

评论

发表评论


取消