チケット #26516

\fontfamily{} の挙動が \DeclareFontFamily の位置で変化する

登録: 2011-10-12 21:12 最終更新: 2011-10-16 11:26

報告者:
担当者:
チケットの種類:
状況:
完了
コンポーネント:
(未割り当て)
マイルストーン:
(未割り当て)
優先度:
5 - 中
重要度:
5 - 中
解決法:
修正済み
ファイル:
なし

詳細

以下のソースにおいて,欧文フォントファミリ hoge の定義(\HOGE)を luatexja.sty 読み込みの前(Aの位置)か読み込みの後(Bの位置)で実行するかによって 最後の「abc」の書体が変わってしまいます:

%#!lualatex
\documentclass{article}
\def\HOGE{\DeclareFontFamily{OT1}{hoge}{}\DeclareFontShape{OT1}{hoge}{m}{n}{<-> pagk7t}{}}
%\HOGE %<== A
\usepackage{luatexja}%#!lualatex
\DeclareKanjiFamily{JY3}{hoge}{}\DeclareFontShape{JY3}{hoge}{m}{n}{<-> IPAGothic:jfm=ujis}{}
\HOGE %<== B
\begin{document}
あいうabc \fontfamily{hoge}\selectfont あいうabc
\end{document}

具体的には,Aの位置だと \fontfamily の効果は和文側にしか効かず, Bの位置だと(pLaTeX2e の実装通りに)和文・欧文の両方に効いています.

チケットの履歴 (5 件中 3 件表示)

2011-10-12 21:12 更新者: h7k
  • 新しいチケット "\fontfamily{} の挙動が \DeclareFontFamily の位置で変化する" が作成されました
2011-10-12 23:17 更新者: h7k
コメント

lltjfont.sty や,その元になった plfonts.dtx を読んでみると, だいたいこのような挙動になっているようです:

  • \ffam@list に定義された欧文フォントファミリの一覧が書かれている.
  • \notffam@list に「欧文フォントファミリではない」フォントファミリの一覧が書かれている.
  • \DeclareFontFamily は,内部で \ffam@list が更新されるように定義が変更されている.
  • \fontfamily{<fam>} によって欧文フォントファミリが <fam> に設定されるのは,大まかに言うと
    • <fam> が \ffam@list 内にあるとき.
    • <fam> が \notffam@list 内になく,またある「欧文エンコーディング」を<enc>に対して,<enc><fam>.fd が存在したとき.

ここでは欧文について述べましたが,和文も同様に(\kfam@list)なっています.

pLaTeX では,\DeclareFontFamily へのパッチがカーネル段階で行われていたのでこの実装で問題なかったようですが, LuaTeX-ja を読み込む前に \DeclareFontFamily をする(上コメントの「Aの位置」)と,\ffam@list に反映されなくなってしまい, 本コメントに述べた \fontfamily が意図しない動作になっているようです.

上の「欧文エンコーディング」の判定も,「欧文エンコーディングのリスト」\fenc@list を用いて行っているため,(単なる予想ですが) 欧文エンコーディングを \usepackage{luatexja} の前で定義した場合も同じような問題がおこるかもしれません.

2011-10-13 14:09 更新者: h7k
  • 担当者(未割り当て) から h7k に更新されました
コメント

実装はまだまだですが,こういう案を考えてみました.

\fontfamily{<fam>} が実行されたとき,

  • その時点での欧文エンコーディングを <enc> とおく.(簡単のため欧文側についてのみ話す)
  • (1) もしも \<enc>+<fam> が定義されていれば(つまり,ソース中で \DeclareFontFamily{<enc>}{<fam>}... があれば)欧文側のフォントファミリを <fam> に変更する.
  • (2) ↑でなければ,基本的にはフォント定義ファイル <enc><fam>.fd が存在するかどうか調べるが,高速化のため cache を使う.
    • \ffam@list@<enc>: <enc><fam'>.fd の存在が証明されているファミリ <fam'> のリスト.
    • \notffam@list@<enc>: <enc><fam'>.fd の非存在が証明されているファミリ <fam'> のリスト.
    • (a) もし <fam> が \ffam@list@<enc> 内にあれば,欧文側のフォントファミリを <fam> に変更する.
    • (b) もし <fam> が \notffam@list@<enc> 内にあれば,欧文側に対しては何もしない.
    • (c) 上のどれでもなければ,<enc><fam'>.fd の存在を実際にチェックし,<fam> を2リストのうちのどちらかに追加しつつ,(a)(b)のどちらかの処理をする.
  • <fam> が和文フォントファミリでも欧文フォントファミリでもない場合は,代用フォントを使用させる為に強制的に両方のファミリを <fam> に変更する.(ここは pLaTeX の実装と同じ)

結果的には,pLaTeX での実装をエンコーディング単位に変更しただけです.これで,「欧文エンコーディングのリスト」\fenc@list も不要となり, 欧文フォント定義を LuaTeX-ja 読み込みの前に行っても大丈夫なのではないかと思います.

2011-10-14 19:43 更新者: h7k
  • 解決法なし から 修正済み に更新されました
コメント

commit 909e9ba で実装してみました.

2011-10-16 11:26 更新者: h7k
  • 状況オープン から 完了 に更新されました
  • チケット完了時刻2011-10-16 11:26 に更新されました
コメント

master にマージしたので完了とします.

添付ファイルリスト

添付ファイルはありません

編集

ログインしていません。ログインしていない状態では、コメントに記載者の記録が残りません。 » ログインする