使用Tex解释器在消息框中显示文本

时间:2019-04-17 21:14:40

标签: matlab

我想使用Matlab的消息框创建警告消息,同时通过内置的Tex解释器指定我自己的字体大小和字体名称。插入的命令\ fontsize和\ fontname添加了它们在该行上占用的所有额外空间(但隐藏在已编译的消息框中),因此拆分了我的第一行(出于视觉原因)并使该消息框显得难看。是否有不使用Tex解释器拆分第一行的解决方法?

FontSize=10;
FontName='Times New Roman'
CreateStruct.Interpreter = 'tex';
CreateStruct.WindowStyle = 'modal';     
msgbox({['\fontsize{',num2str(FontSize),'}\fontname{',FontName,'}\rmSplines were not created to perform group speed analysis']; 'return to SWs propagation tab and select wall''s boundaries'},'','none',CreateStruct);

enter image description here

我还尝试使用\ fontsize和\ fontname命令添加一个额外的空字符串(按内容)。然后,Matlab不会拆分我的实际行,而是将其移至第二行。似乎不是次优的解决方案,因为它并没有真正居中。

enter image description here

1 个答案:

答案 0 :(得分:3)

如果您查看msgbox.m的代码,则会看到消息框的默认行为是拆分任何超过75个字符的文本行。由于您的格式规范嵌入在您的第一行文本中,因此它们会添加很多字符并弄乱了可显示字符的数量。

有几种方法可以解决该限制。我将详细介绍其中的两个,然后快速提及其他两个。

解决方法1(快速又脏):

尝试时,请仅在消息的第一行中保留格式说明(要显示的实际字符为空),然后再保留所有实际的msg行。由于它在顶部形成一个空行并弄乱了居中位置,因此我们可以在底部添加一个空行来重新居中文本。

msgformat   = ['\fontsize{',num2str(FontSize),'}\fontname{',FontName,'}\rm'] ;
msg         = {'Splines were not created to perform group speed analysis';...
               'return to SWs propagation tab and select wall''s boundaries'};

msgformated = [ msgformat ; msg ; {''} ] ;
msgbox( msgformated , '', 'none', CreateStruct )

enter image description here

解决方法2(手动设置属性):

此方法包括向消息框发送纯消息(不带格式)。然后,我们检索消息框的句柄,查找包含消息的text对象的句柄,然后直接修改其FontNameFontSize属性(而不是通过{{1} }解释器。

它是这样的:

tex

enter image description here


如果要修改许多% Define your message without format specifier msg = {'Splines were not created to perform group speed analysis';... 'return to SWs propagation tab and select wall''s boundaries'}; % create the message box, taking care of saving its handle "h" h = msgbox( msg , '','none',CreateStruct ) ; % Get the handle of the text object hax = findobj(h,'Type','Axes') ; % handle of the [axes] conataining the [text] object htxt = hax.Children ; % handle of the [text] object % measure width of text message at this fontsize textExtentBefore = get(htxt, 'Extent') ; % set the Font properties set( htxt , 'FontName',FontName , 'FontSize',FontSize , 'Interpreter' , 'tex' ) % adjust msgbox width if new font smaller/larger textExtentAfter = get(htxt, 'Extent') ; stretch = textExtentAfter(3) / textExtentBefore(3) ; pos = h.Position ; pos(3) = pos(3) * stretch ; set( h , 'Position',pos ) ,那么随身携带所有代码当然很痛苦,因此可以将其打包在一个辅助函数中。 msgbox的代码:

pimp_msgbox.m

然后变得像以下一样容易

function pimp_msgbox(hmsgbox, FontName, FontSize)

% Get the handle of the text object
hax  = findobj(hmsgbox,'Type','Axes') ;
htxt = hax.Children ;

% measure width of text message at this fontsize
textExtentBefore = get(htxt, 'Extent') ;
% set the Font properties
set( htxt , 'FontName',FontName , 'FontSize',FontSize , 'Interpreter' , 'tex' )
% adjust msgbox width if new font smaller/larger
textExtentAfter = get(htxt, 'Extent') ;
stretch = textExtentAfter(3) / textExtentBefore(3) ;
pos    = hmsgbox.Position ;
pos(3) = pos(3) * stretch ;
set( hmsgbox , 'Position',pos )

其他方式:

  • 自定义消息框:复制msg = {'Splines were not created to perform group speed analysis';... 'return to SWs propagation tab and select wall''s boundaries'}; hmsg = msgbox( msg , '','none',CreateStruct ) ; pimp_msgbox( hmsg , FontName , FontSize ) ; 并将其重命名 msgbox.m。在内部,修改代码的相关部分。用这个 自定义功能,而不是标准功能。
  • 在解决方案中,
  • 内部标题(将文本格式说明符保留在第一行中)中,您可以添加诸如“警告”之类的简短文本, 或“错误”,或与邮件相关的任何内容,因此第一行是 实际上不是空的。
  • 更多DIY解决方案...