以下の内容はhttps://ho-tori.hateblo.jp/entry/2025/03/26/043359より取得しました。


モリサワの可変フォント(バリアブルフォント)であるDriveFluxをLuaLaTeXにて試す:LaTeX

[2025/06/04追記]本記事は、LaTeXにおけるMORISAWA Fontsのフォントの使い方を説明することを目的とはしておらず、あくまで主眼はバリアブルフォントを使ってみることにあった。しかしながらおそらくMORISAWA FontsのフォントをLaTeXにて使いたいと思った人々がこの記事に流れ着いているようである。バリアブルフォントとか興味がなく、MORISAWA Fontsのフォントの使い方を知りたいという人は、本記事ではなく以下の記事を参照されたい。

ho-tori.hateblo.jp

[追記終わり]

モリサワが提供するDriveFluxフォントは、モリサワ初の可変フォント(バリアブルフォント)である。

可変フォントとは、文字の太さ、傾き、さまざまな形状などを連続的なパラメータ(軸)でもって指定できるようなフォントである。モリサワ社は同社初の可変フォントとして、DriveFluxフォントを開発し、Morisawa Fontsなどのサブスクリプションサービスにて提供している。

new.morisawafonts.com

note.morisawa.co.jp

他方でLuaLaTeXは、日本語組版が可能な組版システムの一つである。LuaLaTeXは、fontspecパッケージを介することで可変フォントを容易に扱うことができる。LuaLaTeXにて日本語フォントを指定する場合、fontspecではなくluatexja-fontspecを使うのが定石だが、luatexja-fontspec自体も内部でfontspecを読み込むので、luatexja-fontspecから可変フォントを取り扱うことが可能になっている。

というわけでDriveFluxフォントをLuaLaTeX上で試してみる。

モリサワのDriveFlux

DriveFluxフォントのフォントファミリ名はA P-OTF DriveFlux Min2 VF、PostScript名はPDriveFluxMin2VF-Hである。

モリサワの公式サイトによれば、DriveFluxフォントにおいて指定可能な可変軸パラメータは次の通りである。

それぞれのデザイン軸を横断的かつ無段階に選択できるため、表現したいイメージに調整ができます。

  • Weight(ウエイト)軸:太さを100~900の間で調整

  • Smoothness(スムースネス)軸:エレメントに流線型のカーブデザインを0~100の間で調整

  • Contrast(コントラスト)軸:主に横画の太さを0~100の間で調整

  • Italic(イタリック)軸:傾斜角を-36~0の間で調整

さらに、ユーザーが使いやすいように、可変軸パラメータに関するプリセットがあらかじめいくつか定義されている。

あらかじめ各軸の値が設定された36スタイルの中から選択することもできます。

36スタイルの各軸の値については、以下PDFをご覧ください。

DriveFlux_presetstyle.pdf

これらの情報について、otfinfoを使って確認してみると次の通り。

PS C:\Users\USERNAME> otfinfo --variable "AppData\Local\Microsoft\Windows\Fonts\MorisawaFonts\AP-OTF-DriveFluxMin2-VF.otf"
Axis 0:                 wght
Axis 0 name:            Weight
Axis 0 range:           100 900
Axis 0 default:         900
Axis 1:                 CNTR
Axis 1 name:            Contrast
Axis 1 range:           0 100
Axis 1 default:         0
Axis 2:                 SMTH
Axis 2 name:            Smoothness
Axis 2 range:           0 100
Axis 2 default:         0
Axis 3:                 slnt
Axis 3 name:            Italic
Axis 3 range:           -36 0
Axis 3 default:         0
Instance 0 name:        UL
Instance 0 position:    100 0 0 0
Instance 1 name:        UL Italic
Instance 1 position:    100 0 0 -16
Instance 2 name:        UL Smooth
Instance 2 position:    100 0 100 0
Instance 3 name:        UL Smooth Italic
Instance 3 position:    100 0 100 -16
Instance 4 name:        EL
Instance 4 position:    200 0 0 0
Instance 5 name:        EL Italic
Instance 5 position:    200 0 0 -16
Instance 6 name:        EL Smooth
Instance 6 position:    200 0 100 0
Instance 7 name:        EL Smooth Italic
Instance 7 position:    200 0 100 -16
Instance 8 name:        L
Instance 8 position:    300 0 0 0
Instance 9 name:        L Italic
Instance 9 position:    300 0 0 -16
Instance 10 name:       L Smooth
Instance 10 position:   300 0 100 0
Instance 11 name:       L Smooth Italic
Instance 11 position:   300 0 100 -16
Instance 12 name:       R
Instance 12 position:   400 0 0 0
Instance 13 name:       R Italic
Instance 13 position:   400 0 0 -16
Instance 14 name:       R Smooth
Instance 14 position:   400 0 100 0
Instance 15 name:       R Smooth Italic
Instance 15 position:   400 0 100 -16
Instance 16 name:       R Contrast
Instance 16 position:   400 80 0 0
Instance 17 name:       R Contrast Italic
Instance 17 position:   400 80 0 -16
Instance 18 name:       R Contrast Smooth
Instance 18 position:   400 80 100 0
Instance 19 name:       R Contrast Smooth Italic
Instance 19 position:   400 80 100 -16
Instance 20 name:       B
Instance 20 position:   700 0 0 0
Instance 21 name:       B Italic
Instance 21 position:   700 0 0 -16
Instance 22 name:       B Smooth
Instance 22 position:   700 0 100 0
Instance 23 name:       B Smooth Italic
Instance 23 position:   700 0 100 -16
Instance 24 name:       B Contrast
Instance 24 position:   700 80 0 0
Instance 25 name:       B Contrast Italic
Instance 25 position:   700 80 0 -16
Instance 26 name:       B Contrast Smooth
Instance 26 position:   700 80 100 0
Instance 27 name:       B Contrast Smooth Italic
Instance 27 position:   700 80 100 -16
Instance 28 name:       H
Instance 28 position:   900 0 0 0
Instance 29 name:       H Italic
Instance 29 position:   900 0 0 -16
Instance 30 name:       H Smooth
Instance 30 position:   900 0 100 0
Instance 31 name:       H Smooth Italic
Instance 31 position:   900 0 100 -16
Instance 32 name:       H Contrast
Instance 32 position:   900 90 0 0
Instance 33 name:       H Contrast Italic
Instance 33 position:   900 90 0 -16
Instance 34 name:       H Contrast Smooth
Instance 34 position:   900 90 100 0
Instance 35 name:       H Contrast Smooth Italic
Instance 35 position:   900 90 100 -16

axis 0からaxis 3はそれぞれウエイト軸、コントラスト軸、スムースネス軸、イタリック軸に対応している。それぞれの名前、範囲、デフォルト値が確認できる。

Instance 0からinstance 35はそれぞれデフォルトで定義されたプリセット値である。それぞれのプリセットについて、名前とパラメータ値が確認できる。

fontspecにおける可変フォントの取り扱い

LuaLaTeXで手軽に日本語フォントを扱えるパッケージとしてluatexja-fontspecがある。以下では日本語フォントの設定にluatexja-fontspecを使うことにする。

luatexja-fontspecの使い方についてはググって出てくる他の適当な記事を参照されたいが、念の為記述しておくと、同パッケージを使って日本語フォントを設定する場合は以下のようにするのであった。

\setmainjfont[SOME OPTIONS...]{FONT NAME}  % 明朝体を設定
\setsansjfont[SOME OPTIONS...]{FONT NAME}  % ゴシック体を設定
\setmonojfont[SOME OPTIONS...]{FONT NAME}  % 等幅体を設定

また、文書中でオプションを追加的に指定する(上書き含む)場合、次のようにするのであった。

\addjfontfeatures{SOME OPTIONS...}

luatexja-fontspecパッケージは、fontspecパッケージをベースとして、日本語フォント用にいくつか機能を追加したものである(と認識している)。したがってluatexja-fontspecにおける可変フォントの取り扱いは、fontspecのそれとまったく同一である。

というわけで、以下ではfontspec(ならびにluatexja-fontspec)における可変フォントの取り扱いならびにluatexja-fontspecにおいてDriveFluxフォントをどのように設定するのかを述べる。fontspecのドキュメントの7節では可変フォントの取り扱い方が説明されているので、これの順序に沿って説明する。

最適な大きさ

可変フォントにおいては、最適な大きさ(Optical Size)という軸パラメータが設定されていることが多い。これは文字の大きさによって字形を変えるために用意されている。fontspecではOpticalSizeというオプションによってこれを設定することが可能である。

ただしモリサワのDriveFluxの場合、この最適な大きさというパラメータはどうも設定されていないようである。というわけで今回はこれは使わない。

ウエイト

可変フォントにおいては、ウエイトというパラメータが設定されていることが多い。これは文字の画の太さを指定するものであり、fontspecではWeightというオプションによってこれを指定することが可能である。

モリサワのDriveFluxの場合、既述の通りウエイトを100から900の範囲で指定することが可能である。

以下、Weight=100Weight=300Weight=500Weight=700Weight=900の5パターンで組んでみる。

\documentclass[jafontsize=20bp,jafontscale=1.0]{jlreq}

% 欧文フォントの設定
\usepackage[no-math]{fontspec}
\setmainfont{STIX Two Text}

% 和文フォントの設定
\usepackage{luatexja-fontspec}
\setmainjfont{PDriveFluxMin2VF-H}

\begin{document}

\addjfontfeatures{Weight=100}
デジタル文字は美しく進化する。

\addjfontfeatures{Weight=300}
デジタル文字は美しく進化する。

\addjfontfeatures{Weight=500}
デジタル文字は美しく進化する。

\addjfontfeatures{Weight=700}
デジタル文字は美しく進化する。

\addjfontfeatures{Weight=900}
デジタル文字は美しく進化する。

\end{document}

ウエイトを上から順に100、300、500、700、900としたもの。

見事に文字のウエイトが変わっていることがわかる。

可変フォントによく搭載されている軸に幅というものもあり、fontspecにおいてはWidthオプションにて指定する。ただしこれもDriveFluxフォントがサポートしていないので、今回は使わない。

斜体

一部の可変フォントにおいては、斜体という軸が設定されていることがある。これは文字の傾け方を指定するものであり、fontspecにおいてはSlantオプションによってこれを指定することが可能である。

DriveFluxの場合、モリサワが「イタリック」と呼んでいるものがこれに該当する*1。DriveFluxの場合は-36から0の範囲で指定可能である。

以下、Slant=0Slant=-9Slant=-18Slant=-27Slant=-36の5パターンで組んでみる。

\documentclass[jafontsize=20bp,jafontscale=1.0]{jlreq}

% 欧文フォントの設定
\usepackage[no-math]{fontspec}
\setmainfont{STIX Two Text}

% 和文フォントの設定
\usepackage{luatexja-fontspec}
\setmainjfont{PDriveFluxMin2VF-H}

\begin{document}

\addjfontfeatures{Slant=0}
デジタル文字は美しく進化する。

\addjfontfeatures{Slant=-9}
デジタル文字は美しく進化する。

\addjfontfeatures{Slant=-18}
デジタル文字は美しく進化する。

\addjfontfeatures{Slant=-27}
デジタル文字は美しく進化する。

\addjfontfeatures{Slant=-36}
デジタル文字は美しく進化する。

\end{document}

イタリックを上から順に0、-9、-18、-27、-36としたもの。

見事に文字の傾きが変わっていることがわかる。

それ以外の軸

fontspecがデフォルトでサポートしているのは以上の軸である。それ以外の軸については、RawAxisオプションを介して指定することができる。

例えばDriveFluxには、ウエイト、イタリック以外の軸として0から100の範囲で指定できるcntrコントラスト)、同じく0から100の範囲で指定できるsmth(スムースネス)という軸がある*2。これらの軸の値はRawAxis={}のなかで指定することができる。

cntrコントラスト)を試してみる。以下、RawAxis={cntr=0}RawAxis={cntr=25}RawAxis={cntr=50}RawAxis={cntr=75}RawAxis={cntr=100}の5パターンで組んでみる。

\documentclass[jafontsize=20bp,jafontscale=1.0]{jlreq}

% 欧文フォントの設定
\usepackage[no-math]{fontspec}
\setmainfont{STIX Two Text}

% 和文フォントの設定
\usepackage{luatexja-fontspec}
\setmainjfont{PDriveFluxMin2VF-H}

\begin{document}

\addjfontfeatures{RawAxis={cntr=0}}
デジタル文字は美しく進化する。

\addjfontfeatures{RawAxis={cntr=25}}
デジタル文字は美しく進化する。

\addjfontfeatures{RawAxis={cntr=50}}
デジタル文字は美しく進化する。

\addjfontfeatures{RawAxis={cntr=75}}
デジタル文字は美しく進化する。

\addjfontfeatures{RawAxis={cntr=100}}
デジタル文字は美しく進化する。

\end{document}

コントラストを上から順に0、25、50、75、100としたもの。

見事に画のコントラストが変わっていることがわかる。

最後にsmth(スムースネス)を試してみる。以下、RawAxis={smth=0}RawAxis={smth=25}RawAxis={smth=50}RawAxis={smth=75}RawAxis={smth=100}の5パターンで組んでみる。

\documentclass[jafontsize=20bp,jafontscale=1.0]{jlreq}

% 欧文フォントの設定
\usepackage[no-math]{fontspec}
\setmainfont{STIX Two Text}

% 和文フォントの設定
\usepackage{luatexja-fontspec}
\setmainjfont{PDriveFluxMin2VF-H}

\begin{document}

\addjfontfeatures{RawAxis={smth=0}}
デジタル文字は美しく進化する。

\addjfontfeatures{RawAxis={smth=25}}
デジタル文字は美しく進化する。

\addjfontfeatures{RawAxis={smth=50}}
デジタル文字は美しく進化する。

\addjfontfeatures{RawAxis={smth=75}}
デジタル文字は美しく進化する。

\addjfontfeatures{RawAxis={smth=100}}
デジタル文字は美しく進化する。

\end{document}

スムースネスを上から順に0、25、50、75、100としたもの。

若干わかりにくいが、画の角などが変わっていることがわかる。

既定のプリセット値を使用する

軸の値について、フォント側であらかじめ定義されている値を利用することもできる。fontspecパッケージにおいてはInstanceオプションにてプリセット名を指定することができる。

DriveFluxにおいては、既述の通り36のプリセットが定義されている。プリセット一覧は上のotfinfo表や、すでにリンクしたモリサワのサイトのpdfファイルにて確認できる。

以下、Instance=EL Smooth ItalicInstance=RInstance=R Contrast SmoothInstance=B ContrastInstance=H Contrast Italicの5パターンで組んでみる。

\documentclass[jafontsize=20bp,jafontscale=1.0]{jlreq}

% 欧文フォントの設定
\usepackage[no-math]{fontspec}
\setmainfont{STIX Two Text}

% 和文フォントの設定
\usepackage{luatexja-fontspec}
\setmainjfont{PDriveFluxMin2VF-H}

\begin{document}

\addjfontfeatures{Instance=EL Smooth Italic}
デジタル文字は美しく進化する。

\addjfontfeatures{Instance=R}
デジタル文字は美しく進化する。

\addjfontfeatures{Instance=R Contrast Smooth}
デジタル文字は美しく進化する。

\addjfontfeatures{Instance=B Contrast}
デジタル文字は美しく進化する。

\addjfontfeatures{Instance=H Contrast Italic}
デジタル文字は美しく進化する。

\end{document}

上から順にEL Smooth Italic、R、R Contrast Smooth、B Contrast、H Contrast Italicとしたもの。

使用例

以上、モリサワのDriveFluxフォントにおけるさまざまな可変軸の設定方法をみてきた。以上でみた4軸を組み合わせることによって、自由自在にフォントの表情を変化させることができるだろう。

例えば、以下のようである。例文は、明らかにDriveFluxフォントと調和していないが、フランツ・カフカ『変身』(原田義人訳、青空文庫)より。軸の設定はWeight=600,Slant=-9,RawAxis={cntr=70,smth=60}としている。

\documentclass[jafontsize=12bp,jafontscale=1.0]{jlreq}

% 欧文フォントの設定
\usepackage[no-math]{fontspec}
\setmainfont{STIX Two Text}

% 和文フォントの設定
\usepackage{luatexja-fontspec}
\setmainjfont[Weight=600,Slant=-9,RawAxis={cntr=70,smth=60}]{PDriveFluxMin2VF-H}

\begin{document}

ある朝、グレゴール・ザムザが気がかりな夢から目ざめたとき、自分がベッドの上で一匹の巨大な毒虫に変ってしまっているのに気づいた。
彼は甲殻のように固い背中を下にして横たわり、頭を少し上げると、何本もの弓形のすじにわかれてこんもりと盛り上がっている自分の茶色の腹が見えた。
腹の盛り上がりの上には、かけぶとんがすっかりずり落ちそうになって、まだやっともちこたえていた。
ふだんの大きさに比べると情けないくらいかぼそいたくさんの足が自分の眼の前にしょんぼりと光っていた。

「おれはどうしたのだろう?」と、彼は思った。
夢ではなかった。
自分の部屋、少し小さすぎるがまともな部屋が、よく知っている四つの壁のあいだにあった。
テーブルの上には布地の見本が包みをといて拡げられていたが――ザムザは旅廻りのセールスマンだった――、そのテーブルの上方の壁には写真がかかっている。
それは彼がついさきごろあるグラフ雑誌から切り取り、きれいな金ぶちの額に入れたものだった。
写っているのは一人の婦人で、毛皮の帽子と毛皮のえり巻とをつけ、身体をきちんと起こし、肘まですっぽり隠れてしまう重そうな毛皮のマフを、見る者のほうに向ってかかげていた。

\end{document}

実行時の注意

LuaLaTeXにて日本語OpenTypeフォントを取り扱う場合、コンパイルに非常に時間がかかることがある。新規にOpenTypeフォントを読み込ませる場合には、フォントのキャッシュが存在せずコンパイル時に新規にキャッシュを生成するため、特に時間がかかる。さらに、可変フォントの場合は、軸の値が異なっていると事実上異なるフォントとして処理されているようで、キャッシュやフォントの読み込みもその分ますます時間がかかる。長いコンパイルは非常に苛立つものであるが、Lua(La)TeXの構造上仕方がないようである。キーボードを叩き割ったりせず、カップラーメンでも作って気長に待つことが肝要である。

おわりに

可変フォントは、ここ数年で盛り上がってきた新しい技術らしい。従来のようにウエイト等ごとにフォントファイルが存在するという状況よりは、単一のフォントファイルにてさまざまなウエイト等を統一的に扱えたほうが良さそうである。表現の幅も大きく広がってくるのかもしれない。

TeXという組版システムは、かなり昔からあるソフトであるから、すでに過去のものと思う人もあるかもしれない。組版システムの新しい変化に追従できていないと思われるかもしれない。しかしながら、こうした先入見は、Lua(La)TeXにはあまり妥当しないと思われる。本記事でもみた可変フォントの対応に見られるように、Lua(La)TeXは最新の機能を積極的に取り入れている組版システムの一つである。

可変フォントが広く使われるようになるとともに、可変フォントに限らずOpenTypeフォントの優れた機能がLua(La)TeXにおいても積極的に使われるようになることを望むばかりである。

※2025/03/27追記

脚注でも若干触れたが、RawAxis={}内で用いる軸名は(少なくともDriveFluxの場合は)すべて小文字でないとうまくいかなかった。また、最初に一度大文字でコンパイルしてしまうと、その後小文字に変えてコンパイルしても大文字でコンパイルしたときに生成されたフォントキャッシュが使われ、うまくいかなくなる。こういう場合は一度DriveFluxフォントのキャッシュを削除するとうまくいく。

加えて、コンパイル後のPDFを眺めていると、画同士が重なり合っているところが白抜きで表示されることがあるということに気がついた。これはAdobe AcrobatやPDF.jsなどの一部のPDFビューワーで、特に拡大倍率を低く表示した際に発生する。LuaTeXの問題なのか、フォントの問題なのか、PDFビューワーの問題なのかはわからないため、要調査。

PDF.jsで表示させた例。

*1:上記のotfinfo表において、axis 3がslntに割り当てられており、これが「Italic」と名付けられていることに注意せよ。fontspecのSlantオプションも内部的にはslnt軸を参照しているので、両者は一致する。

*2:otfinfoからえられる情報ではそれぞれの軸は大文字であるが、fontspecのRawAxisオプション内では大文字で記すとうまくいかないことがあった。したがって以下では軸名は両方とも小文字で表記している。




以上の内容はhttps://ho-tori.hateblo.jp/entry/2025/03/26/043359より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14