Octave绘图中为字符串添加制表符(空格)的问题求助
我来帮你搞定这个在Ubuntu 18.04上用Octave 4.2.2绘图时制表符失效的问题~
问题回顾
你尝试用char(9)给注释文本加制表符,结果不仅没显示出预期的缩进,还收到了警告:
warning: text_renderer: skipping missing glyph for character '9'
warning: called from annotation>update_textbox at line 1080 column 11
annotation at line 248 column 7
你的代码如下:
clf plot(0:0) var=456 t1='Signal '; t2=[char(9), 'Max Freq']; t3=[char(10), 'nextline',num2str(var)]; str=strcat(t1,t2,t3); annotation('textbox',... [0.15 0.65 0.3 0.15],... 'String',{str},... 'FontSize',14,... 'FontName','Arial',... 'LineStyle','--',... 'EdgeColor',[1 1 0],... 'LineWidth',2,... 'BackgroundColor',[0.9 0.9 0.9],... 'Color',[0.84 0.16 0]);
问题原因
主要是Octave 4.2.2这个旧版本的文本渲染器,在Linux环境下对Arial这类字体的制表符(ASCII码9)支持不完善。系统字体的字符映射里没有为这个字符提供对应的渲染图形,导致渲染器直接跳过它,就出现了警告和制表符失效的情况。
几个可行的解决办法
1. 用空格模拟制表符(最简单快速)
如果不需要严格的制表符对齐效果,直接用几个空格代替就行,比如4个或6个空格,效果相近:
t2=[' ', 'Max Freq']; % 把char(9)换成4个空格
这种方法不用改字体也不用升级,兼容性拉满。
2. 更换支持制表符的字体
试试Linux系统原生支持更好的字体,比如DejaVu Sans或者Ubuntu Mono,这些字体对特殊字符的渲染更完善,修改代码里的FontName参数即可:
annotation('textbox',... [0.15 0.65 0.3 0.15],... 'String',{str},... 'FontSize',14,... 'FontName','DejaVu Sans', % 替换为该字体 'LineStyle','--',... 'EdgeColor',[1 1 0],... 'LineWidth',2,... 'BackgroundColor',[0.9 0.9 0.9],... 'Color',[0.84 0.16 0]);
3. 拆成多行字符串手动对齐
如果需要精确对齐,不如把文本拆成多行,用空格手动调整位置,再设置文本框左对齐:
% 把字符串拆成多行数组,用空格对齐Max Freq str = { 'Signal Max Freq', % 空格数量可自行调整 ['nextline ', num2str(var)] }; annotation('textbox',... [0.15 0.65 0.3 0.15],... 'String',str,... % 直接传入多行数组 'FontSize',14,... 'FontName','Arial',... 'LineStyle','--',... 'EdgeColor',[1 1 0],... 'LineWidth',2,... 'BackgroundColor',[0.9 0.9 0.9],... 'Color',[0.84 0.16 0],... 'HorizontalAlignment','left'); % 左对齐保证位置准确
4. 升级Octave版本(最推荐的长期方案)
Octave 4.2.2是2018年的老版本,后续的5.x、6.x版本对文本渲染器做了大量修复,字符支持问题基本都得到解决。你可以通过Ubuntu的PPA来升级:
sudo add-apt-repository ppa:octave/stable sudo apt update sudo apt install octave
升级完成后再使用char(9),制表符应该就能正常显示了。
小提示
建议先试试前两种方法快速解决当前问题,要是以后经常遇到这类字符渲染问题,升级Octave绝对是一劳永逸的办法~
内容的提问来源于stack exchange,提问作者Rick T

