12

textプロパティ 'Interpreter' を値 'latex' に設定することで、LaTeX 形式のテキストと方程式を Matlab プロットに埋め込むことができます。

text(0.1, 0.5, 'Einstein: $E = m c^2$', ...
    'Interpreter', 'latex', 'FontSize', 32)

これらの方程式は、画面だけでなく、eps ファイルにエクスポートされたイラストにも表示されます。

適切な LaTeX コマンドを使用して、フォントをデフォルトの Computer Modern Serif から Computer Modern Typewriter などに変更することもできます。

text(0.1, 0.5, '\fontfamily{cmtt}\selectfont Einstein: $E = m c^2$', ...
    'Interpreter', 'latex', 'FontSize', 32)

私の質問は次のとおりです:追加のフォントを Matlab インストールに挿入して、これらのフォントを「インタープリター」「ラテックス」で使用できるようにして、画面上でレンダリングしたり、eps ファイルを生成したりすることは可能ですか? はいの場合、どのように?

バックグラウンド

/opt/MATLAB/R2013a(私の Linux システムでは、Matlab インストールに関連するすべてのパス。)

Matlab には、(La)TeX インタープリターのカスタマイズされたバージョンが含まれています。これは、引数として LaTeX コードを取り、その出力引数内で dvi データを返すtex.minと呼ばれるフロントエンド m-file を介して呼び出されます。toolbox/matlab/graphicsカスタマイズされた LaTeX インストールは にsys/texあり、TeX フォント メトリック ファイルが含まれていますsys/tex/tfm

この dvi をレンダリングする Matlab の部分に関する情報はありません。ただし、レンダリング用のフォント データは と の下にsys/fonts/ttfありsys/fonts/type1ます。

したがって、追加フォントを使用可能にすることは、LaTeX インタープリターで使用できるようにすることと、レンダリング機能で使用できるようにすることの 2 つの部分で構成されます。tex.m最初の部分は、LaTeX の独立した通常のインストールを通じて dvi を生成し、通常の方法 (フォント パッケージなど) でこの LaTeX にフォントをインストールするように を操作することで取り組むことができます。undocumentedmatlabを参照してください。

したがって、質問の 2 番目の部分が重要です。追加のフォントを に挿入して、Matlab の dvi レンダラー コンポーネントで使用できるようにする方法sys/fonts/ttfですsys/fonts/type1

コンクリートケース

特別なケースで 2 番目の問題を具体的に解決しようとしました。Computer Modern Sans フォントは を介し​​て Matlab-LaTeX インストールに含まれていますtex/tfm/cmss10.tfmが、対応する ttf ファイルと pfb ファイルが見つからsys/fontsないため、レンダリングされません。

Matlab の ttf ファイルのコレクションには、ある種のインベントリがないようです。したがって、存在する他のファイルのファイルとフォルダーの命名規則に従って、ファイルcmss10.ttfを matplotlib のインストールから に単純にコピーしました。sys/fonts/ttf/cm/mwa_cmss10.ttfこの手順は、Max OS X 上の Matlab 2011bの Alec の Web ログで機能すると報告されていますが、私のシステムでは、画面表示にも eps エクスポートにも効果がありません。

fonts.dirMatlab の type1 フォントのコレクションには、ファイル、fonts.scale、およびenc ファイルでいっぱいのencodings.dirフォルダーに分散された複雑なインベントリがあります。encodings今回も TeXlive インストールから cmss10.pfb を見つけ、名前を変更してコピーし、リストされている他のフォントの例に従ってインベントリ ファイルにエントリを作成しました。繰り返しますが、この手順はまったく効果がありません。

Matlab が ttf ファイルと pfb ファイルをどのように使用するかについて詳しく知っている人はいますか?また、cmss10 ファイルを Matlab レンダリングにアクセスできるようにする方法についてヒントを教えてもらえますか? または、これをデバッグして、Matlab の LaTeX サポートの内部動作について詳しく知る方法を提案する人はいますか?

4

3 に答える 3

4

私は自分の質問に何時間もかけてさらに調査し、いくつかの興味深い新しい洞察を思いつきましたが、実際の解決策はありませんでした. それでも、これを調査する可能性のある他の人が開始できるように、ここに結果を投稿しています. 私はそれを「答え」として投稿し、すでに長い質問をさらに長くしません。

Matlabの旧(R2010a)と現行(R2013a)texfontsインフラの比較

標準フォント Computer Modern Roman の場合、古いインフラストラクチャには次のものが含まれます。

sys/tex/tfm/cmr10.tfm
sys/fonts/ttf/cm/cmr10.ttf
sys/fonts/type1/cm/cmr10.pfb
sys/fonts/type1/cm/cmr10.pfm

そして現在

sys/tex/tfm/cmr10.tfm
sys/fonts/ttf/cm/mwa_cmr10.ttf
sys/fonts/ttf/cm/mwb_cmr10.ttf
sys/fonts/type1/cm/mwa_cmr10.pfb
sys/fonts/type1/cm/mwb_cmr10.pfb

TeX フォント メトリック ファイルは同一です。truetype ファイルと type1 ファイルには同じグリフ データが含まれているように見えますが、ラテン文字 (mwa) とギリシャ文字 (mwb) を含むファイルに分割されています。pfm ファイルは単純に消えてしまいました。古い type1 ファイルには 1997 年に AMS による著作権表示があり、新しいものには 2011 年に MW による著作権表示があります。

これは、古い Matlab の Computer Modern Sans を現在の Matlab で動作させるには、 と をコピーするだけで十分であることを示していますcmss10.ttfcmss10.pfbこれは、tfm ファイルがまだ存在するためです (質問を参照)。mwa_cmss10.ttfmwa_cmss10.pfb

R2013a で使用されるファイルはどれですか?

の追加の dir および enc ファイルはsys/fonts/type1使用されていないようです。これらを削除すると、画面のレンダリングと eps 生成が完全に機能するようになるためです。

ttf ファイルは画面のレンダリングに使用され、pfb ファイルは生成された eps ファイルに含めるために使用されていると思われます。すべてのttfファイルを削除すると、画面のレンダリングとepsの生成も完全に機能するため、前者は当てはまらないようです。ただし、フォルダーsys/fonts/ttf/cmが存在しない場合、Matlab は文句を言います。

これは、a) dir および enc ファイルをわざわざ変更する必要がないこと、および b) ttf ファイルをコピーする必要がないことを示しています。

新しい pfb ファイルを挿入するだけで十分ですか?

cmss10.pfb古い Matlab から にコピーした後sys/fonts/type1/cm/mwa_cmss10.pfb、方程式で Computer Modern Sans を使用すると、Matlab は「cmss10 はサポートされていません」と警告し、画面のレンダリングは正しくありません。さらに、生成された eps ファイルは正しくレンダリングされません。

ただし、生成された eps ファイルには の内容が含まれてmwa_cmss10.pfbおり、それが機能しない理由は、含まれている pfb ファイルが「CMSS10」という名前のフォントを定義しているのに対し、eps は「mwa_cmss10」という名前のフォントを参照しているためです。epsの参照を変更する@Daniel E. Shubのソリューションの代わりに、ファイルを編集して「mwa_cmss10」にmwa_cmss10.pfb変更できます。\FontNameこれは、pfb に適用された単純なテキスト エディターで行うことができます。ただし、より良い方法は、 を使用して pfb ファイルを PostScript に逆アセンブルし、PostScript をt1disasm変更してから、 を使用して再アセンブルすることt1asmです。これらのツールは CTAN のt1utilsパッケージに含まれています。

ただし、結果の eps はまだ正しく機能しません。特に大きなフォント サイズの場合、文字が正しく配置されません。

これは、pfb ファイルだけでは Matlab に正しいフォント メトリックが提供されず、Matlab の LaTeX によって生成された dvi ファイルは文字を明示的に配置せず、それらのメトリックを持つレンダラーに依存していることを示しています。

2 番目の点の回避策に関する質問については、tex.seを参照してください。

既存のフォントを「ハッキング」することはできますか?

Daniel E. Shub は、彼の回答で、フォントを追加するのではなく、Matlab インストールに存在するものを上書きすることを提案しました。これには 2 つの問題があります。

– 正しいフォント メトリックは、Matlab ではまだ利用できません。したがって、フォントの上書きは、元のフォントのメトリックと新しいフォントのメトリックが類似している場合にのみ機能します。

例:
ここに画像の説明を入力

– 画面のレンダリングが一部のケースでのみ機能します。私の場合、パッチを適用した cmss10 で mwa_cmr10 を上書きして使用すると、\rmComputer Modern Sans が画面と eps ファイルにレンダリングされましたが、位置がわずかに間違っていました。ただし、mwa_cmtt10 を上書きして使用\ttしても、Computer Modern Sans が画面にレンダリングされることはありませんでした。代わりに、Computer Modern Typewriter がレンダリングされました。

これは、a) Matlab のレンダラーのフォント メトリックの別の独立したソースがあることを意味します。私が知る限り、それらはsys/texまたはsys/fonts. b) フォント アウトラインは、場合によっては の pfb ファイルからのみ読み込まれますsys/fonts/type1/cm

結論

したがって、最近の Matlab における dvi レンダラーの内部動作は謎のままです。不足している情報が隠されている可能性のある候補は、toolbox/matlab/graphics/hardcopy.pおよび/またはcom/mathworks/hg/uij/TextRasterizer.classにありjava/jar/hg.jarます。

当分の間、調査を中止します (そして、psfrag を見ていきます ;)

于 2013-10-19T18:53:47.707 に答える
3

あなたが参照している文書化されていないMatlabについてコメントしました。どうやら、Matlab DVI ビューアをフォントで動作させることの難しさを大幅に過小評価していたようです。誰かがそれが生成する警告を理解できることを期待して、機能しない解決策を含めました。また、かなり大きなハックである実用的なソリューションもあります。Linux で Matlab R2013a と TexLive 2013 を使用しています。Mac や Windows で何が起こるかはわかりません。

機能しないソリューション

私の最初のアプローチは、Matlab 関数をオーバーロードすることでした。これにより、LaTeX で簡単に作業を行うことができ、ファイルtex.mのことだけを気にするだけで済みます。dvi

function [dviout,errout,auxout] = tex(varargin)
    fid = fopen('matlab.dvi');
    dviout = fread(fid, 'uint8');
    dviout = uint8(dviout);
    fclose(fid);
    errout = [];
    auxout = [];
end

matlab.dviその後、加工して作成しました

\documentclass{article}
\setlength\topmargin{-0.5in}
\setlength\oddsidemargin{0in}
\DeclareFontFamily{T1}{myfont}{}
\DeclareFontShape{T1}{myfont}{m}{n}{<-> [1.2] AuriocusKalligraphicus}{}
\begin{document}%
\setbox0=\hbox{\usefont{T1}{myfont}{m}{n}Some text with a distinct font $\alpha$}%
\copy0\special{bounds: \the\wd0 \the\ht0 \the\dp0}%
\end{document}%

次に、TexLive フォントを Matlab にコピーしました

# cp $TEXLIVEROOT/texmf-dist/fonts/type1/public/aurical/AuriocusKalligraphicus.pfb $MATLABROOT/sys/fonts/AuriocusKalligraphicus.pfb

「予想される」警告を受け取ります

>> text(0.0, 0.5, 'DOES NOT MATTER', 'Interpreter', 'LaTeX', 'FontSize', 20)
Warning: Font AuriocusKalligraphicus10 is not supported. 
Warning: Font AuriocusKalligraphicus10 is not supported. 

Figure を (不足しているフォントを含む)pdf経由でファイルにエクスポートしようとするとalt+f alt+r、潜在的に有用な

警告: /usr/local/matlab/R2013a/sys/fonts/type1/cm/mwa_auriocuskalligraphicus10.pfb がありません

実用的なハック ソリューション

ファイルの名前がわからないことにpfbうんざりした後、既に動作しているファイル (cmr10) を上書きすることにしました。

CLI で

# cp $MATLABROOT/sys/fonts/mwa_cmr10.pfb $MATLABROOT/sys/fonts/mwa_cmr10.pfb.bak
# cp $TEXLIVEROOT/texmf-dist/fonts/type1/public/aurical/AuriocusKalligraphicus.pfb $MATLABROOT/sys/fonts/mwa_cmr10.pfb

そしてMatlabプロンプトで

>> text(0.0, 0.5, 'Some text with a distinct font $\alpha$', 'Interpreter', 'LaTeX', 'FontSize', 20)

私にくれます

マトラブ図.

Figure を with にエクスポートするには、ファイル内のwithepsのすべてのインスタンスを置き換える必要があります。おそらくこれは、このソリューションがハックであるためです。理想的には、ファイルだけでなく、およびファイルも置き換える必要があります。ほとんどの図を作成できるように、おそらく十分な数のフォントが用意されています。/mwa_cmr10/AuriocusKalligraphicusepspfbfdtfmpfb

于 2013-10-18T15:27:47.703 に答える
0

これは非常に大まかな解決策ですが、テキスト エディターを使用して結果の .eps ファイルを編集し、目的のフォントを取得することができます。たとえば、次のように置き換えることができます。

%%IncludeResource: フォント mwa_cmr10 /mwa_cmr10 /WindowsLatin1Encoding 120 FMSR

次のように:

%%IncludeResource: フォント Helvetica /Helvetica /WindowsLatin1Encoding 120 FMSR

結果の .eps ファイルを開き、任意のフォントを任意のフォントに置き換える簡単なスクリプトを作成することもできます。これが役立つことを願っています!

于 2015-07-28T09:26:51.593 に答える