数式モードの内側と外側で異なるフォント

数式モードの内側と外側で異なるフォント

単純なファイルを処理する場合:

\documentclass{report}

\begin{document}
1234567890

$1234567890$
\end{document}

1 つを選択すると、pdflatex1 つのフォント (CMR10) のみを含む PDF が取得されますが、どちらか一方xelatexまたはlualatex生成された PDF を処理する場合は、数式モードの外側では Latin Modern Roman 10 を使用し、内側では CMR10 を使用します。

その理由は何でしょうか?

答え1

TeX Live 2018 以降、LaTeX はデフォルトで UTF-8 を使用するようになりました。これは、「Unicode 革命」が完了したためです1。これにより、pdfLaTeX を使用するときに追加する必要がなくなりました\usepackage[utf8]{inputenc}

ただし、pdfLaTeX の UTF-8 サポートは偽物であり、基盤となる pdfTeX エンジンは本質的に 8 ビット エンコーディングに制限されているため、任意の UTF-8 文字を入力に貼り付けても意味のある出力が得られるとは期待できません。

これは、Xe/LuaTeX ではまったく異なります。これらのエンジンは、デフォルトで UTF-8 をサポートしています2。従来の TeX フォントは、提供されるグリフが非常に限られています3。これは明らかに UTF-8 を記述するのに十分ではないため、フォントは UTF-8 の全範囲をカバーする必要もあります4。この目的のために、TU エンコーディングが導入されました。

デフォルトでは、LaTeX は Computer Modern (CM) フォント ファミリを読み込みます。CMR10 フォントは TU エンコーディングでは使用できず (今後も使用できなくなる予定)、代わりに最も近い Latin Modern Roman 10 が読み込まれます。

ここで疑問が残ります。なぜ Latin Modern は数式モードで使用されないのでしょうか。これは、数式モードでは状況が少し複雑になるためです。従来の設定では、 、 などの異なるファミリとコマンドを別のファミリに切り替えていました\mathbf\mathcalこれは、すべてのシンボルが単一のフォントから取得されるため、Unicode ではもはや不可能です。したがって、ファミリ切り替えアプローチはもはや機能せず、数式コードを前後に交換するはるかに複雑なシステムに置き換える必要があります。これはパッケージに実装されていますunicode-math。また、パッケージを使用すると、何千もの数式コードを常に再割り当てする必要があるため、TeX が突然大幅に遅くなるため、これが問題になる理由もわかりますunicode-math。これが、現在標準の OML/OMS エンコーディングが保持される理由です。


1今では誰もがファイルを UTF-8 で保存しており、ほとんどのソフトウェアは UTF-8 を理解します。絵文字を考えてみてください (絵文字はどこにでもあります)。絵文字は UTF-8 の一部なので、絵文字を表示できるものはすべて UTF-8 をサポートする必要があります。
2実際、LuaTeX はファイルが UTF-8 でない場合、そのファイルを拒否します。
3 T1 エンコーディングは 256 グリフしかエンコードできません。
4フォントに必要なグリフがあるかどうかは別の問題です。

答え2

TeX では、テキストと数式のフォント設定は完全に分離されたタスクです。テキスト フォントではアクセント付き文字やハイフネーションなどを考慮する必要があり、数式フォントでは多数の記号や上付き文字と下付き文字の正しい配置を考慮する必要があります。

あなたの例では、pdftex で同じフォントから取得できるグリフがいくつか使用されているだけです。ただし、たとえばマイナス (-) や文字 (abc) を追加すると、使用されるフォントは数式の内部と外部で異なります。また、テキストを推奨される T1 エンコーディングに切り替えると、\usepackage[T1]{fontenc}数字にも違いが生じます。

Unicodeエンジンの場合、アクセント付き文字とハイフネーションを正しくするために、Unicodeフォントをテキストフォントとして使用することがほぼ必須であるため、デフォルトの設定でも違いがあります(例を参照)。https://tex.stackexchange.com/a/470987/2388)。そこで、2017 年の初めに LaTeX カーネルはこのエンジンのデフォルトを変更し、ユーザーが fontspec をロードする必要がなくなりました。

数式ではハイフンとアクセント付き文字は実際には関係がないので、従来の数式設定は Unicode エンジンで機能します。ただし、数式設定が Unicode フォントを使用するように変更された場合でも、テキストフォント (例: ラテン現代数式) と同じにはなりません。

関連情報