在matlab中为绘图中的中英文字符串使用不同的字体
废话不多说,直接上代码
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