LuaTeX (not LuaLaTeX) で pTeX と同様の日本語処理
(和文/欧文フォント独立管理,ベースライン補正など)を目指して,
pluatex.sty を作ってみました.完成度はまだまだですが,ひとまず本投稿に添付します.
LuaLaTeX における日本語組版の試みとしては,既に
luaums.sty (1年以上前にこのフォーラムに投稿したもの)や,
京都大学の前田一貴さんによる luajalayout パッケージ
(http://www-is.amp.i.kyoto-u.ac.jp/lab/kmaeda/lualatex/luajalayout/,旧 jafontspec パッケージ)
などがありますが,
ここで投稿するものとは設計思想が異なります.
------
ところで,pTeX の代わりに Lua(La)TeX を用いて日本語処理を行うことは
近いうちにも大きな問題となってくるように思います.
個人でバラバラにやっているのは効率が良くないように思うので,
(何をベースにするかはともかく)「LuaTeX での日本語処理を行うマクロを作る」
というテーマで,まとまって取り組んでみませんか?
私の名前が出ていますので少し説明いたしますと,昨年の11月ぐらいから
LuaLaTeX でとりあえず日本語組版ができるパッケージとして,jafontspec という
パッケージをこっそり公開していました.
これは今回北川さんが作られたものとは異なって,「とにかく動くものが欲しい」
という動機で作ったもので,pTeX をエミュレートしようという考え方はあまり
していませんでした.
jafontspec は内部でちょっと怪しいことをしていたのでこちらではこれまで
宣伝することはなかったのですが,北川さんから「複数人でやってみませんか」という
お話をいただき,今回の提案になります.
宣伝していなかったがために北川さんには余計な手間をかけさせてしまったようで,
申し訳なかったです.
何ができるかはわかりませんが,今回の取り組みには私も協力していきたいと
思っています.今後ともよろしくお願いいたします.
ソースの中身にまで手出しをできるだけの力量が自分にはないと思うのですが,テストケース作りなどでご協力できることがあると思いますので,ぜひ一緒にやらせてください.
改善プロセスを早めるためにも,ソースを固めてたまに配布する形式ではなく,どこかにレポジトリを作って,自由に随時更新できる形がいいと思います.
# レポジトリ内には,trunk/ 下に src/, test/, doc/ などを掘ればいいと思います.
そして,そのためにはプロジェクト名を決めて,どこかにレポジトリを確保する必要があるかと思います.publishing を表明するのはハードルが高いかもしれないので,韓国コミュニティにならって,LuaTeX-ja とかにするのがよいでしょうか?
> プロジェクト名を決めて,どこかにレポジトリを確保する必要があるかと思います.
> publishing を表明するのはハードルが高いかもしれないので,
> 韓国コミュニティにならって,LuaTeX-ja とかにするのがよいでしょうか?
ページの場所と名称は,このスレッドで議論することにしましょう.
以下,私の意見ですが,
・ 場所としては,sourceforge.jp 内の wiki を考えています.
(当然ながら,e-pTeX とは全くの別プロジェクトとします)
・ 名称は……内容の面からも,「pTeX をそのままエミュレート」することにはならないと思うので,
ご指摘通り LuaTeX-ja あたりが適当と思います.
なにかある方は,ぜひ返信をお願いします.
と書いたのですが,改めて今年の KTS meeting の資料を見ると,興味深い講演が目白押しですね.http://conf.ktug.kr/2011/Program.html
LuaTeX-ko のスライドではルビや圏点,下線の話しもしていたようだと見て取れます.
あと,電子書籍がらみっぽい,携帯端末でのリフローの話しも.(最後の講演)
> 近いうちにも大きな問題となってくるように思います.
> 個人でバラバラにやっているのは効率が良くないように思うので,
> (何をベースにするかはともかく)「LuaTeX での日本語処理を行うマクロを作る」
> というテーマで,まとまって取り組んでみませんか?
北川君,早速ありがとうございます.何ができるか不明ですが,お手伝いさせていただきますのでよろしくお願いします.
pTeXのエミュレートという流れにはならない可能性が高いと思いますが,そうするとどういうものにすべきかは非自明な問題ですね.そういうことに詳しい人にも手を上げてもらえるとうれしいのですが…….
私が持っている構想はこんな感じです。かなり pTeX との互換性を重視しています。これは「そうしないと移行が進まない」と考えているからです。
(以下で、pTeX という場合はその派生エンジンも含みます。また新しいシステムの名称を仮に「LuaTeX-ja」とします。)
- pTeX の和文処理の機能を実現することが肝要。
- ただし、pTeX と全く同じ結果に至ることは重要でない。逆に、今の pTeX が日本語組版上望ましくない結果を出す場合はそれを是正するように努めるべき。
- ルビ・割注などを容易に実装できるための機能拡張も欲しい。
- ソースレベルの互換性について:
- 既存の「純粋な」pLaTeX 文書が「自明な修正」のみで LuaTeX-ja で通るようにする。
- 純粋な = pTeX のプリミティブを含まない
- 自明な修正 = pLaTeX ユーザが容易に実行可能なもの; TeX 言語、LuaTeX エンジンの仕様、LuaLaTeX 用のパッケージに関する知識を要しない
- 既存の pLaTeX 用パッケージの大部分が「自明な修正」のみで LuaTeX-ja で通るようにする。
- 自明な修正 = pLaTeX パッケージ作成者が容易に実行可能なもの; LuaTeX エンジンの仕様、LuaLaTeX 用のパッケージに関する知識を要しない
- 既存の「純粋な」pLaTeX 文書が「自明な修正」のみで LuaTeX-ja で通るようにする。
- ただし、「pTeX との互換のための機能」と「それ以外の機能」は分離しておく。LuaTeX-ja 専用(pTeX をサポートしない)のパッケージを作成する場合は「互換のための機能」は用いない。
- 構成要素は以下の通り。括弧内は[前提エンジン;実装言語]。
- LuaTeX-ja のコア(エンジンの拡張に相当する部分)[LuaTeX;素のTeX、Lua]
- plain TeX の LuaTeX-ja サポート[LuaTeX;plain TeX、Lua] ※ 1 と分離する必要性は乏しい。
- LaTeX の LuaTeX-ja サポート[LuaTeX;LaTeX2e 内部]
- LuaTeX-ja の pTeX 互換性サポート[LuaTeX;plain TeX、Lua] ※ 対象は plain TeX と LaTeX
- pTeX の LuaTeX-ja 互換性サポート[pTeX;plain TeX] ※ 対象は plain TeX と LaTeX
- LuaLaTeX の基本的なパッケージ(fontspec など)の LuaTeX-ja サポート[LuaTeX;LaTeX2e 内部]
- LuaTeX-ja の LaTeX3 インタフェース[LuaTeX;LaTeX2e 内部、LaTeX3]
補足が必要な点もありますが、それはまた後で書きます。
「構成要素」についての説明です。名前は仮に決めたもので、「後の説明」で使うかも知れません
- luatexja-core.sty : LuaTeX-ja のコア
- 要するに実質的に「エンジン拡張」になる部分。
- 前提フォーマットについて:LuaTeX-ja 自身が luaotfload、およびその下位の luatexbase、lualibs に依存し、これらの公式なサポート範囲が plain TeX と LaTeX なのでそれだけ考えれば十分。「LaTeX2e と plain の共通部分」を想定すればよいだろう。
- ConTeXt は?: luaotfload 自体が ConTeXt で用いるには不適当(これ自身が ConTeXt のモジュールのコピーである)なので、そのままでは無理。ConTeXt 上の開発能力が得られない限りは対応できない。
- 読込: LaTeX では
\usepackage
か\RequirePackage
、それ以外では\input
。 - plain TeX の場合、内部で 2. を読み込む。
- LaTeX の場合、内部で 3. を読み込む。
- luatexja-plain.sty : plain TeX のサポート
- ptex.tex(の
\input plain
以外)に相当する部分。 - 読込: 1. から読み込まれる。
- ptex.tex(の
- luatexja-latex.sty : LaTeX のサポート
- plcore.ltx を読み込み、多少の調整を行う。
- 読込: 1. から読み込まれる。
- luatexja-compat.sty : LuaTeX-ja の pTeX 互換性サポート
\prebreakpenalty
や\jis
等の、「そのままの文法での完全な模倣は困難だが pLaTeX のパッケージのサポート上必要である」プリミティブについて、部分的な実装を行う。- 例えば、
\prebreakpenalty
については、1. での実装は、「\setprebreakpenalty{〈符号位置〉}{〈値〉}
」(書込)、「\getprebreakpenalty{〈符号位置〉}
」(読出)という命令にして、4. において「\prebreakpenalty
プリミティブ」の模倣を行う。 - どうしても「汚い仕様」になってしまうので、互換性確保以外の目的では使わない。
- 読込: LaTeX では
\usepackage
か\RequirePackage
、それ以外では\input
。 - pLaTeX で読み込んだ場合、代わりに 5. を読み込む。
- luatexja-compat-ptex.sty : pTeX の LuaTeX-ja 互換性サポート
- pTeX と LuaTeX-ja の両方をサポートするパッケージを新たに作成する際に、4. で挙げたようなプリミティブが必要な場合は、pTeX の形式(例えば
\prebreakpenalty
)を使わず、LuaTeX-ja の形式(\get/setbreakpenalty
)を使うようにしたい。そこで、LuaTeX-ja の形式を pTeX でも通るように模倣を行う。 - 読込: 4. から読み込まれる。
- つまり、pTeX でも LuaTeX-ja でも、luatexja-compat.sty を読み込んで LuaTeX-ja の形式で書けばよい。
- pTeX と LuaTeX-ja の両方をサポートするパッケージを新たに作成する際に、4. で挙げたようなプリミティブが必要な場合は、pTeX の形式(例えば
- LuaLaTeX の基本的なパッケージ(fontspec など)の LuaTeX-ja サポート
- 新しく LuaTeX-ja 用の文書を作成するのであれば、当然、LuaLaTeX 向けの方法が使えることが必要。例えば fontspec の形式で和文フォントを定義したい。
- 各々のパッケージ毎に拡張パッケージを作ることになるだろう。
- だから、これは LuaTeX-ja の構成要素には含まれないですね…。
- luatexja-expl3.sty : LuaTeX-ja の LaTeX3 インタフェース
- expl3 利用のパッケージ(fontspec 等)の拡張を作るのならあった方がいいだろう。
luatexja_set_prebreak_penalty:nn
とかluatexja_if_yoko_direction:T
とか?- 読込: LaTeX2e のパッケージから
\RequirePackage
で読み込む。
「構成要素」についての補足です。
- 各パッケージは重複読込しても安全にしておく。
- plain TeX でも重複した読込が無視されるようにする。
- LaTeX ではそのパッケージ管理に任せればよいが、オプション衝突(「
Option clash for package ...
」エラー)を避けるため、パッケージオプションは定義しない。
- これも用意した方がいい。
- luatexja.sty
- luatexja-core.sty と luatexja-compat.sty を順に読み込むだけ。
- 読込: LaTeX では
\usepackage
か\RequirePackage
、plain では\input
。
- luatexja.sty
LaTeX の中での使用(特に pLaTeX との互換)に関しての説明です。
長々と書き連ねましたが、あくまでこれは「私の構想」なので、ここでのトピックである新システムの設計をどうするかは、これからの議論が必要でしょう。
luatexja さえ読み込めば、その後はほとんど修正なしに pTeX 用のコードが動くとする。問題は「どこで luatexja を読み込むか」である。ただし、pLaTeX の和文を含む文書では、大概は和文用の文書クラス(これ自身が pTeX に依存する)が用いられるので、それを前提とする。
\documentclass{some-ja-class} \usepackage{some-ja-package} \begin{document} %...以下略
理想的なのは、some-ja-class.cls の側が対応して、luatexja.sty の読込を含むバージョンを用意することだと考えている。これを lua-some-ja-class.cls とすると、文書作成者はクラス名を変えるだけになる。
\documentclass{lua-some-ja-class} \usepackage{some-ja-package} \begin{document} %...以下略
some-ja-class.cls の中でエンジンを自動判別すれば、文書作成者は何の修正も要らなくなるが、それは却って好ましくないという考えがある。
もし、some-ja-class.cls の側での対応がされていないならば、文書作成者は \documentclass
の前で自分で luatexja.sty を読む必要に迫られる。
\RequirePackage{luatexja} \documentclass{some-ja-class} \usepackage{some-ja-package} \begin{document} %...以下略
これを回避するために、luatexja.sty を予め読み込んだフォーマット(例えば lualatexja.fmt)を用意するということを考慮してもよいと思う。
その他の注意:
- LuaTeX-ja 専用の新しい文書クラスを作る場合も、同様に、その中で luatexja.sty を読み込む。(自身は compat の機能は使わないが、pTeX 用パッケージを通るようにするため。)
- pTeX 用のパッケージは修正なしで LuaTeX-ja で使える(かも知れない)。
- pTeX と LuaTeX-ja 共用のパッケージを新規に作る場合は、luatexja-compat.sty を読み込み、互換対象のプリミティブに対し、LuaTeX-ja の書式で書く。
予め言っておくと、私自身は、性急な「移行」を進めたり勧めたりする意図は持っていません。一時期の「Linux で pTeX が簡単に使えなくなる」騒動の時はそう考えたこともありましたが、今では、TeX Live にも pTeX が収録された訳で、恐らくはその派生(e-pTeX、upTeX 等)も加えられると思っています。従って、現状の pTeX で満足ならばそれを使い続けてよく、また(近い将来に)upTeX がよいと思ったならばそれを使い続けてよく、それで不便を被ることもないと思います。(その「pTeX」はいつの間にか e- なものに置き換わってるかも知れませんが……。) 互換性の目的は、何らかの理由で「移行」を望んだ場合に、それを阻害する要因を減らすことだと思います。例えば、「LuaTeX(あるいは pdfTeX)のこの機能(あるいはそれを要するパッケージ、または TeX 連携のシステム)を使いたいが、今使っている文書クラス(あるいはパッケージ)が pTeX 用だから無理」ということを避けたいという考えです。
現状の圧倒的なチュートリアル不足をなんとかする必要性もあると思います.
同感です。ただ、「初級者」も含めた「一般の LaTeX ユーザ」に対するチュートリアルというものを考えると、そこで扱う内容は「確定的なもの」が望ましく、そこで「過渡的なもの」(将来には通用しなくなるかも知れない)を扱うには勇気があります(無論、bleeding-edge なレポートも大事ですが)。そう考えると、現状の「LuaLaTeX」にはまだまだ不確定な要素が多いように思えます(ConTeXt は別)。例えば、「思わず Lua で LaTeX してみた」について、冒頭に書いている通り、「最初に書いた時点(2010/05/27)」では、(将来それが「普通」になるはずの)「UTF-8 入力 + OpenType フォント出力」の仕組みがまだ存在しておらず、そこで「ASCII 入力 + TFM フォント出力」で全ての例を構成しました。「仕組み」(LuaLaTeX 上の fontspec の使用)が固まるにはそこから数カ月を要したと思われます。LuaLaTeX についてはその後も何度か「実験」しています(ブログの 2011-02-02、02-05、02-13 の記事)が、私自身まだよく解っていないところが残っています。(私は臆病なので「十分に解っていない人が説明しようとすることの危険性」の前にどうしても怯んでしまうようです。)
ただ、「使える LuaLaTeX」について説明ができる状況に早晩至ることも確かなので、その時には説明文書を整備していきたいと思います。直接には「プロジェクト」(日本語対応)とは関係ないけど、「プロジェクト」の文書に含めるという手段もあるかも知れません。
すくなくとも,
私は整理できるほどわかってないわけです(^-^;.
一般のユーザにとって、そういう諸々の事項を知っておくとそれだけ「得」なことは確かです。でも、例え知らなくとも、
今まで通りに(TeX マクロも含めて)文書を記述して、「lualatex xxx.tex
」でコンパイルすると、PDF ファイル xxx.pdf が得られます
ということだけ知っていれば使えるのが理想的、というのが私の考えです。
http://sourceforge.jp/projects/luatex-ja/wiki/FrontPage
権限は,今のところ
・コメントは誰でもできる.
・編集その他は,「プロジェクト参加者」のみ可能
としてあります(誰でも編集できる,としてもいいのですが,スパムが怖い).
参加したい人は,sourceforge.jp のアカウントをとった上で,
北川(いつものアドレス or h7k at users.sourceforge.jp)まで連絡をお願いします.
ipaのttfではなく,
A-otf-RyuminPro-Light.otf
A-otf-GothicBBBPro-Medium.otf
でsample.texを処理してみましたが,
組み結果がずれてしまいますね
(添付のPDFです).
ずれるのは箇条書きのマークです.
よくわかってないので
単純にipaのttfをモリサワのotfに
置き換えただけです.
> $ luatex test
> This is LuaTeX, Version beta-0.66.0-2011032118 (rev 4093)
(中略)
> LuaTeX warning: lua-loaded font [52] (file:KFhimaji.otf) has no characters!
TTF(TTC も?)ならばうまく読み込まれるみたいですが,よくわかりません.
# 開発時には使用する LuaTeX のバージョンを全体で統一した方がいいかもしれません.
同じ問題が起こったので調べてみました.
生成されたキャッシュの temp-kfhimaji.lua を読むと,直下の glyphs が空で
subfont に glyphs がある状態でしたので,otfl-font-otf.lua のそのあたりの処理を
追っていったのですが,結論としては cidmap の読み込みに失敗しているということが
わかりました.
正しい対処かどうかはわかりませんが,texmf-dist/fonts/cid/fontforge/ にある
adobe-japan1-5.cidmap を Adobe-Japan1-5.cidmap にリネームして mktexlsr し,
キャッシュを作り直すとうまく動きました.
上の zip にサンプルの PDF をKFひま字で作って含めていたのですが,
フォントの埋め込みが禁止ととれる条項があることに気付きましたので,PDFを除いた
ものを作り直しました.上のは削除依頼しておきます.
I have a question: I tried to run the sample test file based on my TL2011 installation, but without success: I have put all the lua files into texmf-dist/scripts/luatex/luatexja/, and all the sty/cls/clo/tex files into texmf-dist/tex/luatex/luatexja. Then remade the ls-R database.
Running luatex sample.tex it terminates with
(/home/norbert/tl/2011/texmf-dist/tex/generic/xkeyval/keyval.tex))
(/home/norbert/tl/2011/texmf-dist/tex/luatex/luatexja/luatexja-cctbreg.sty
Package luatexja-cctbreg Warning: Cannot apply the patch (3).
) (/home/norbert/tl/2011/texmf-dist/tex/luatex/luatexja/luatexja-base.sty
! LuaTeX error ...l/2011/texmf-dist/tex/luatex/luatexbase/modutils.lua:52: modu
le 'luatexja.base' not found:
no field package.preload['luatexja.base']
[luatexbase.loader] Search failed
[kpse lua searcher] file not found: 'luatexja.base'
[kpse C searcher] file not found: 'luatexja.base'
[kpse All-in-one searcher] file not found: 'luatexja'
[oberdiek.luatex.kpse_module_loader] Search failed
stack traceback:
[C]: in function 'require'
...l/2011/texmf-dist/tex/luatex/luatexbase/modutils.lua:52: in function 'requi
re_module'
<\directlua >:1: in main chunk.
\lltxb@requirelua ...xluaescapestring {#2}" \fi )}
<to be read again>
\RequireLuaModule
l.34 \RequireLuaModule
{luatexja.tangle}
?
Is there anything I can do to fix that? Thanks a lot and all the best
Norbert
> I have put all the lua files into
> texmf-dist/scripts/luatex/luatexja/,
> and all the sty/cls/clo/tex files into texmf-dist/tex/luatex/luatexja.
That is not correct installation method.
Like luaotfload and luatexbase packages, lua files (luatexja-core.lua etc.) should be put inside texmf/tex/luatex (of its subdir).
I recommend copying (or making a symbolic link of) src/ as texmf/tex/luatex/luatexja.