マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

埋め込めないフォントを埋め込むとどうなるか

OpenType フォントのメタ情報の中には、「そのフォントを文書中に埋め込むことがライセンス上で許可されているか」という情報を表す“fsType”という値が存在する。

上掲の資料によると、fsType の値の意味は次のようである(抜粋)。*1

  • 0 : Installable Embedding (インストール可能)*2
  • 2 : Restricted License embedding (埋込禁止)
  • 4 : Preview & Print embedding (編集禁止の場合のみ埋込可能)
  • 8 : Editable embedding (埋込可能)

dvipdfmx および PDF 出力の TeX エンジンは OpenType フォントを埋め込む機能を持っている。このとき、fsType が 2 または 4 であるフォントについては、無条件に埋込処理を行うのは好ましくないはずである。そこで、このような場合に何が起こるのかを実際に調べてみた。

dvipdfmx の -E オプション
  • ヘルプ画面を見れば判るように、(x)dvipdfmx には「fsType の指定を無視する」ことを指示する「-E」オプションが存在する。
      -E            Always try to embed fonts, regardless of licensing flags.
  • 周知のとおり、XeTeX エンジンで TeX 文書をコンパイルした場合、既定では自動的に xdvipdfmx が起動される。実は、この場合の xdvipdfmx のオプション指定は「-q -E」((-q はメッセージ出力を抑止するオプション。))となっている。つまり、XeTeX では「fsType 無視」が既定になっていると推定される。

実験内容

  • fsType の値が 2 であるフォントファイルと 4 であるフォントファイルを用意する。
  • 以下の plain TeX 文書ファイルを用意する。
    [test.tex]
    \ifdefined\XeTeXversion
      \message{[[XeTeX]]}
      \font\ftest="[TestFont.ttf]"
    \else\ifdefined\luatexversion
      \message{[[LuaTeX]]}
      \input luaotfload.sty
      \font\ftest="[TestFont.ttf]"
    \else\ifnum\ifdefined\pdfoutput\pdfoutput\else0\fi>0
      \message{[[pdfTeX]]}
      \pdfmapline{=cmtt10 TestFont "TeXBase1Encoding ReEncodeFont" <TestFont.ttf <[8r.enc}
      \font\ftest=cmtt10
    \else
      \message{[[dvipdfmx]]}
      \special{pdf:mapline cmtt10 8r TestFont.ttf}
      \font\ftest=cmtt10
    \fi\fi\fi
    \nopagenumbers
    \ftest What the TeX? \bye
    
    この文書は
    • etex + dvipdfmx
    • pdftex
    • xetex
    • luatex
    の何れのエンジンでもコンパイルできて、TestFont.ttf という名前のフォントの埋込を指示する。
  • fsType = 2 のフォントファイルを TestFont.ttf として置いて、test.tex を上記の 4 つのエンジンでコンパイルすることを試みる。
  • fsType = 4 のフォントファイルを TestFont.ttf として置いて、同様の試行を行う。
  • dvipdfmx については、「-E」オプションを付けた場合も試す。
  • XeTeX については、「-E」オプション付が既定なので、逆に「-E」を外した場合も試す。xetex 起動時に「-output-driver="xdvipdfmx -q"」のようなオプションを付けると、xdvipdfmx の起動オプションを変えられる。

実験結果

埋込禁止(fsType = 2)が指定されている場合
  • dvipdfmx(既定): 次のエラーが出て、PDFは生成されない。
    test -> test.pdf
    [1
    dvipdfmx:fatal: Font file="TestFont.ttf" can't be embedded due to liscence restr
    ictions.
    
    Output file removed.
  • dvipdfmx、オプション「-E」付: エラー・警告なしで、フォント埋込済のPDFが生成される。
  • pdfTeX: エラー・警告なしで、フォント埋込済のPDFが生成される。
  • XeTeX(既定((先述の通り、この場合は xdvipdfmx で「-E」が有効になっている。))): エラー・警告なしで、フォント埋込済のPDFが生成される。
  • XeTeX、オプション「-output-driver="xdvipdfmx -q"」付((つまり、xdvipdfmx の「-E」オプションを外した場合。)): エラー・警告なしでPDFファイルが生成されるが、その中の当該フォントの情報は異常になっている
    • Adobe Reader で開くと、『「TestFont」フォントが検出または作成できません。』というエラーダイアログ が出て、文字が全部「・」に化けている。
    • フォントが非埋込になっている状況*3ともまた違うようである。
  • LuaTeX: エラー・警告なしで、フォント埋込済のPDFが生成される。
Preview & Print 埋込」(fsType = 4)が指定されている場合
  • dvipdfmx(既定): エラー・警告なしで、フォント埋込済のPDFが生成される。
  • dvipdfmx、オプション「-v」付: 次の警告が出るが、フォント埋込済のPDFが生成される。
    dvipdfmx:warning: Font "TestFont" permits "Preview & Print" embedding only **
  • pdfTeX: エラー・警告なしで、フォント埋込済のPDFが生成される。
  • XeTeX(既定): エラー・警告なしで、フォント埋込済のPDFが生成される。
  • XeTeX、オプション「-output-driver="xdvipdfmx -q"」付: エラー・警告なしで、フォント埋込済のPDFが生成される。
  • XeTeX、オプション「-output-driver="xdvipdfmx -v"」付: エラー・警告なしで、フォント埋込済のPDFが生成される。
    • つまり、警告は決して出ない。
  • LuaTeX: エラー・警告なしで、フォント埋込済のPDFが生成される。

まとめ

どうやら、TeX エンジンはユーザの良心を全面的に信用しているようである。というわけで、フォントのライセンスの確認を怠らないようにしよう。

*1:もちろん、このメタ情報がある種の埋込の許可を示していたとしても、それが“無制限に許可”されているとは限らず、ライセンスで制限が加わっていることもある。飽くまで、ソフトウェアに対して、禁止している処理を実行しないよう指示するためのものだと考えられる。

*2:説明内容がよく解らないのであるが、恐らく「もし文書データ中に単体で使用可能なフォントデータが埋め込まれていた場合、文書を受け取った人がそれを抽出して自分のデバイスに永続的にインストールして構わない」という意味だと思う。だから自由なライセンスのフォントだと該当し、またそれ以外の場合に該当することは少ないように思われる。これに対して fsType = 4 および 8 の場合は抽出したフォントを永続インストールすることは禁止されている。

*3:この場合は、Reader で開いた場合にエラーは出ずに適当なフォントで代替されるはずである。