отображать текст в окне сообщения с помощью интерпретатора Tex - PullRequest
2 голосов
/ 18 апреля 2019

Я хочу создать предупреждение с помощью окна сообщений 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 Ответ

3 голосов
/ 18 апреля 2019

Если вы посмотрите на код для msgbox.m, вы увидите, что стандартным поведением для окна сообщения является разделение любой текстовой строки длиной более 75 символов.Поскольку спецификации вашего формата встроены в вашу первую строку текста, они добавляют довольно много символов и запутывают количество отображаемых символов.

Есть несколько способов обойти это ограничение,Я подробно опишу 2 из них и просто быстро упомяну другие.

Обходное решение 1 (быстрое и грязное):

Пока вы сами пробовали, сохраняйте первую строку вашего сообщения только в форматеспецификации (пустые для отображения реального символа), а затем все ваши фактические строки сообщений.Так как он создает пустую строку вверху и портит центрирование, мы можем просто добавить пустую строку внизу, чтобы перецентрировать текст.

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, содержащего сообщение, затем изменяем его свойства FontName и FontSize напрямую (не через интерпретатор 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 )

enter image description here


Конечно, будет больно носить весь этот код, если у вас много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 и переименуйте его mymsgbox.m.Внутри измените соответствующую часть кода.Используйте эту пользовательскую функцию вместо стандартной.
  • innner title В решении, где вы сохраняете спецификатор формата текста в первой строке, вы можете добавить короткий текст, такой как «Предупреждение»,или «Ошибка», или что-либо, имеющее отношение к сообщению, поэтому первая строка на самом деле не пуста.
  • еще DIY-решения ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...