我想使用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);
我还尝试使用\ fontsize和\ fontname命令添加一个额外的空字符串(按内容)。然后,Matlab不会拆分我的实际行,而是将其移至第二行。似乎不是次优的解决方案,因为它并没有真正居中。
答案 0 :(得分:3)
如果您查看msgbox.m
的代码,则会看到消息框的默认行为是拆分任何超过75个字符的文本行。由于您的格式规范嵌入在您的第一行文本中,因此它们会添加很多字符并弄乱了可显示字符的数量。
有几种方法可以解决该限制。我将详细介绍其中的两个,然后快速提及其他两个。
尝试时,请仅在消息的第一行中保留格式说明(要显示的实际字符为空),然后再保留所有实际的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 )
此方法包括向消息框发送纯消息(不带格式)。然后,我们检索消息框的句柄,查找包含消息的text
对象的句柄,然后直接修改其FontName
和FontSize
属性(而不是通过{{1} }解释器。
它是这样的:
tex
如果要修改许多% 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
。在内部,修改代码的相关部分。用这个
自定义功能,而不是标准功能。