1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MATLAB の figure に boldsymbol 風の文字を書き込む

Posted at

1. はじめに

 MATLAB の figure の中では $\rm\LaTeX$ 文字が使えます。しかし、その表現の自由度はかなり制限されています。これについては、すでに下記の Qiita 記事に詳細を投稿済です。
【MATLAB の figure で使用可能な数式の確認】と【Qiita の数式との相性】

 特に、斜体の太字コマンド「\boldsymbol」( $\boldsymbol{ABCabc}$ )が使えないのは非常に不便です。ベクトルを表すシンボルが $ABCabc$ だけでは、どうにも軽すぎて引き締まりません。さらに困ったことに、最後の切り札であるはずの簡易太字化コマンド「\pmb」( $\pmb{ABCabc}$ )さえも使えません。そこで、その解決策を考えてみることにしました。

利用環境: MATLAB R2019a

2. 太字化の結果

 前記の「\pmb」コマンドでは、位置を僅かに左右に移動して2重印字することで、太文字のように見せています(拡大してみれば分かります)。したがって、「\pmb」コマンドには非対応でも、MATLAB の text コマンドを使って、位置をずらせながら2回印字すれば代用できるはずです。しかし、1行で済むはずのプログラムを2行も書くことになるので気が進みません。

 しかし、これは私の誤解でした。どのような多重印字でも1行だけで書けるようです。長年 MATLAB を使ってきましたが、text コマンドの位置指定で、このような使い方ができることに今まで気づきませんでした。

 そんなわけで、この方法で太字化した結果を図1に示しています。上半分が3重印字によるもの、下半分は7重印字によるものです。1行で書けることが分かったため、多重数はかなり奮発してみました。

 拡大してみると、「\pmb」コマンドの2重印字ほどではありませんが、3重印字では、「文字の重なりのズレ」や「$\oplus$ の線の太さの不均一さ」が少々気になります。しかし、7重印字では殆ど目立ちません。Qiita の太字と完全一致ではないにしても、遜色はありません。手荒な扱いを受けて、MATLAB は悲鳴を上げているかもしれませんが、7重印字がお勧めです。

比較のための Qiita の MathJax 文字
(1,3行目: default、2,4行目: boldsymbol)
$$
\begin{align}
&ABCDEFGHIJKLMNOPQRSTUVWXYZ\\
&\boldsymbol{ABCDEFGHIJKLMNOPQRSTUVWXYZ}\hspace{20em}\\
&abcdefghijklmnopqrstuvwxyz\\
&\boldsymbol{abcdefghijklmnopqrstuvwxyz}
\end{align}
$$

図1 疑似太字化の結果
(上半: 3重印字、下半: 7重印字)

 しかし、図の右下にあるような「太文字と細文字が混じり合った式」を書くのは大変です。式の複雑さにもよりますが、プログラムの行数が増えるうえに、試行錯誤での太文字の位置合わせが大変です。やはり、「\boldsymbol」コマンドの登場が待たれるところです。

3. プログラム

 実は、1行で書けるというのは誇大表現です。次のような事前準備は必要です。

% 3重印字のとき
dd=0.3;          % 印字位置の微小ズレ単位
Xd=[0 dd dd];    % x方向の印字位置分布
Yd=[0 dd -dd];   % y方向   〃
% 7重印字のとき
dd=0.15;              % 印字位置の微小ズレ単位
th=linspace(0,360,7);
th(end)=[];
Xd=[0 dd*cosd(th)];   % x方向の印字位置分布
Yd=[0 dd*sind(th)];   % y方向   〃

 この後は、単一行の text コマンドの中の印字位置を、Xd,Yd を利用して次のように指定するだけで目的は達せられます。( (X0,Y0)は本来の印字希望位置 )

text(X0+Xd,Y0+Yd,'$$ABCabc$$', .... ,'Interpreter','latex');

 最後に、図1を描いたプログラムの全体も添付しておきます。

% font_weight01.m

% LaTeX文字の太字化(boldsymbol風の書体)

clear;
close all;

hf=figure(1);
set(hf,'InvertHardcopy','off');
plot([-100 100],[0 0]);
hold on;
axis equal;

moji1='ABCDEFGHIJKLMNOPQRSTUVWXYZ';
moji2='abcdefghijklmnopqrstuvwxyz';

% === 3重印字のアルファベット ===

dd=0.3;          % 印字位置の微小ズレ単位
Xd=[0 dd dd];    % x方向の印字位置分布
Yd=[0 dd -dd];   % y方向   〃

text(0,60,['$$' moji1 '$$'],'FontSize',15,'HorizontalAlign', ...
             'center','VerticalAlign','middle','Interpreter','latex');
text(0+Xd,45+Yd,['$$' moji1 '$$'],'FontSize',15,'HorizontalAlign', ...
             'center','VerticalAlign','middle','Interpreter','latex');
text(-96,30,['$$' moji2 '$$'],'FontSize',15,'HorizontalAlign', ...
               'left','VerticalAlign','middle','Interpreter','latex');
text(-96+Xd,15+Yd,['$$' moji2 '$$'],'FontSize',15, ...
     'HorizontalAlign','left','VerticalAlign','middle', ...
                                               'Interpreter','latex');
text(40,30,'$$\oplus$$','FontSize',20,'HorizontalAlign','center', ...
                      'VerticalAlign','middle','Interpreter','latex');
text(40+Xd,15+Yd,'$$\oplus$$','FontSize',20,'HorizontalAlign', ...
             'center','VerticalAlign','middle','Interpreter','latex');

% === 7重印字のアルファベット ===

dd=0.15;              % 印字位置の微小ズレ単位
th=linspace(0,360,7);
th(end)=[];
Xd=[0 dd*cosd(th)];   % x方向の印字位置分布
Yd=[0 dd*sind(th)];   % y方向   〃

text(0,-15,['$$' moji1 '$$'],'FontSize',15,'HorizontalAlign', ...
             'center','VerticalAlign','middle','Interpreter','latex');
text(0+Xd,-30+Yd,['$$' moji1 '$$'],'FontSize',15, ...
     'HorizontalAlign','center','VerticalAlign','middle', ...
                                               'Interpreter','latex');
text(-96,-45,['$$' moji2 '$$'],'FontSize',15,'HorizontalAlign', ...
               'left','VerticalAlign','middle','Interpreter','latex');
text(-96+Xd,-60+Yd,['$$' moji2 '$$'],'FontSize',15, ...
     'HorizontalAlign','left','VerticalAlign','middle', ...
                                               'Interpreter','latex');
text(40,-45,'$$\oplus$$','FontSize',20,'HorizontalAlign','center', ...
                      'VerticalAlign','middle','Interpreter','latex');
text(40+Xd,-60+Yd,'$$\oplus$$','FontSize',20,'HorizontalAlign', ...
             'center','VerticalAlign','middle','Interpreter','latex');

% === 7重印字(太文字/細文字 混合の数式) ===

text(96,-55, ...
     '$$\phantom{F}{=}m\frac{{\rm d}\phantom{v}}{{\rm d}\,t}$$', ...
     'FontSize',15,'HorizontalAlign','right','VerticalAlign', ...
                                      'middle','Interpreter','latex');
text(65+Xd,-56+Yd,'$$F$$','FontSize',15,'HorizontalAlign', ...
             'center','VerticalAlign','middle','Interpreter','latex');
text(93+Xd,-50+Yd,'$$v$$','FontSize',15,'HorizontalAlign', ...
             'center','VerticalAlign','middle','Interpreter','latex');

% === 図のファイル化 ===

basename=mfilename('fullpath');
print(gcf,'-dpng',[basename '.png'],'-r300');

4. おわりに

 添付したプログラムは、axis の幅が 200 で、x, y 軸が同スケールの状態(axis equal)での一例です。axis の幅や文字サイズに応じて、変数 dd(印字位置の微小ズレ単位)は適切な値に設定しなおす必要があります。また、x, y 軸のスケールが異なるときには相応の修正が必要です。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?