Texinfo 対応
Texinfo の一部の命令(@node 等)は「その行の残り全部を引数にとる」という仕様になっているようです。そして、その実装では、先に出てきた @c と同様に、「改行文字をアクティブにした上で、改行文字を区切りとしたマクロを呼ぶ」としています。従って、入力前処理で行末にコメント文字を入れてしまうと改行文字が消えてしまいます。これが luatexja で異常になる原因です。
※ \parsearg がその処理をしているマクロです。
Texinfo では、「どうしても必要な場合」のために、文字コード127の文字がコメント文字(カテゴリコード14)に割り当てられているようですが、先述の理由で、これを使っても失敗します。
@node 等の命令の引数で @c や @comment を使うことはできるようです。(もちろん直接 \c を実行できるわけはないので特別にパーズして除去している。)だから、コメント文字の代わりに @c を入れるというのは解決法として考えられます。でも、Texinfo のマニュアルを見ると、コメント命令(@c / @comment)は使えない場所もあると書いてあります。ひょっとしたら、「@c を入れる」も失敗するかも知れません。
時間がなかなか取れず対応できなくてすみません.(来週もきついです)
54ab627 では改行の前に挿入できる文字をカウンタ \ltjlineendcomment で指定できるようにしていますが,これを拡張して
とすること自体は可能だと思います.
% 単純なカウンタでなく,\ltjsetparameter/\ltjgetparameter に組み入れた方がいい?
失敗しそうなパターンを見つけました。
例えば、以下の例で @c !!! ERROR !!` のコメントはエラーを引き起こします。
\input texinfo @settitle Test @c Really? @contents @node Cool Chapter @c ;-) @c ;-) @chapter Cool Chapter @c Not! Lorem ipsum dolor @c agree sit amet, consectetuer adipiscing elit. Ut purus elit, @emph{vestibulum ut, @c !!! ERROR !!! placerat ac}, adipiscing vitae, felis. @bye
このことから考えると、 「コメント文字の代わりに @c を入れる」 という処理にすると、 以下のコードが通らなくなると予想されます。
いろはにほへと@emph{ちりぬるを わかよたれそ}つねならむ
ZRさん,ありがとうございます.
ふと思ったのですが,これまでスペースの抑制のためにコメント文字を使っていたわけですが,この目的ならば \ignorespaces があるので,こちらを挿入することで解決できないでしょうか.ただの思いつきで,\ignorespaces の動作について詳しいわけではないので,これはこれで駄目な例があるかもしれませんが.
ちょっと試したところ,@node の行末に @ignorespaces を入れると2回目以降のコンパイルで .aux を読む時にエラーになるので,少し工夫が必要そうです.
皆さま いろいろなアイディアありがとうございます。
いっそ、Lua の世界で、行頭に @node 等の line command があったら行末に U+FFFFF をつけない(行頭に line command が無い場合だけ U+FFFFFF をつける)という動作も考えられるかなぁ、と思いました。
幸い、Texinfo の世界では line command は行頭から @ が始まることになっています。LuaTeX はともかく、texi から html 等を生成するコマンド makeinfo では line command のある行の line command より前に空白文字以外があると警告が出ます。警告の出ない「正しい」書き方のみサポートすることにすれば、単純なパターンマッチングでもなんとかなりそうな気がします。
もちろん、line command は何か等、どういった場合につけない動作にするかといった具体的な定義は LuaTeX-ja ではなくて texinfo-ja.tex なり txi-ja.tex なりに書くことになると思います。
\ignorespaces でいけるのであれば、Texinfo 側で @c の除去と同じような方法で @ignorespaces を除去できるのではないかと思います。 といっても、本家 texinfo.tex をいじるのではなくて、txi-ja.tex で、いくつかのマクロを再定義することになるかと思います。
もしかすると、本当に line command 中で \ignorespaces を使いたいときに困るかもしれないので、\ignorespaces そのものではなくて、 別の適当な名前のマクロを定義して使うようにする方がいいような気もします。
昔の決定を含めて少し蒸し返すと,日本語文章のソース中での改行をどう扱うか,というのが大きい話だと思います. 要求レベルと実装レベルで本来きちんと整理すべきだと思いますが,うまく調べきれていないので,問題提起で少し書き散らします.
真にどうしたいか,よりシンプルな実装が存在するか,という観点に変わっていってもよいのではないかなあ,とinhibitglueの流用?が出現して感じました.
北川さんの
54ab627 では改行の前に挿入できる文字をカウンタ \ltjlineendcomment で指定できるようにしていますが,これを拡張して * \ltjlineendcomment=-1 なら,何も入れない * \ltjlineendcomment=-2 なら,Lua 文字列 luatexja.inputbuf.comment_string の内容を追加する とすること自体は可能だと思います.
の実装を試してみました (125ec15).これを用いた Texinfo の対応例を testtexi.zip として上げました(\ignorespaces 使用).
黒木さん,コメントありがとうございます.検討しなおす良い機会かもしれません.
一般のLuaTeX-jaの仕様について考えるなら、
「\ignorespaces や \relax とかを挿入する」
という方式は排除できると思います。
\def\test{% {\TeX}はアレ }
後者はあまり嬉しくないですが、欧文だけの処理との整合を考えるなら、これの方が自然ともいえるでしょう。
※実行の段階で「和文間の空白トークンは消される」ので、 \test です を実行した場合、「アレ」と「です」の間に空白は入りません。
ところが、「\ignorespaces を入れる」規則にすると、先の \test の定義は
\def\test{{\TeX}はアレ\ignorespaces }
と等価となる、という謎仕様になってしまいます。
TeX言語者のレベルでは、「そういう謎仕様である」ことが周知されればよいのかも知れません。 しかし同じ問題はLateXレベルでも起こります。
\newcommand*\myMacro[2]{......} % ↓末尾に \ignorespaces が入るので異常動作する \myMacro{{\TeX}はアレ} {Ti\emph{k}Zもアレ}
LaTeXユーザに「行末に \ignorespaces が入る」規則を周知する」というのはナンセンスだと思います (\ignorespaces はLaTeXの命令でない)。
(Texinfoに限って \ignorespaces を適用することについて)
ユーザ定義マクロは複数引数のものが定義できるようですが、 これに関しては行をまたぐことを(何故か)禁止してますね…(マニュアル17.3節)。 ただ、そのほかの命令についても、 \ignorespaces が混入した場合に影響が出ないかをちゃんと検証する必要がある、 と思っています(で、そんなことやりたくない……)。
少なくとも、 @tex で「TeX言語環境」に入った場合には 「謎仕様」が効いてくるはず。
Texinfoのための対策については、自分としては、色々検討した結果、
いっそ、Lua の世界で、行頭に @node 等の line command があったら行末に U+FFFFF をつけない(行頭に line command が無い場合だけ U+FFFFFF をつける)という動作も考えられるかなぁ、と思いました。
これが最も妥当かなと考えています。
・LuaTeXja側で
luatexja.inputbuf.ナントカカントカ = <boolean> function(<string> line_string)
みたいなフックを用意しておいて、 「『これが定義済であり、かつ実行結果が真(か偽か予め決めた方)』でない」 というのをコメント文字挿入の条件に加える。
・あとは、Texinfoの側で具体的な条件を考える。
LuaTeX-ja一般の話としては、現状の仕様が妥当だと考えています。 (理由は長くなるので今は省略。)
また思いつきですが,実はこれだけで Texinfo 対応は解決しないでしょうか?
- \def\parseargusing#1#2{%
- \def\argtorun{#2}%
- \begingroup
- \catcode\ltjlineendcomment=9% Ignore the character \ltjlineendcomment (U+FFFFF).
- \begingroup
- \obeylines
- \spaceisspace
- #1%
- \parseargline\empty% Insert the \empty token, see \finishparsearg below.
- }
- \def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}%
- \endgroup% Restore the catcode of \ltjlineendcomment.
- }
\endgroup で復元だと何かまずいことがあるかもしれないので,\catcode だけ保存しておいて復元の方がよいかも.
実はこれだけで Texinfo 対応は解決しないでしょうか?
ホントだ……今までなぜ気づかなかったんだろう……。
チョット修正してみました。
\def\parseargusing#1#2{% \def\argtorun{#2}% \begingroup \catcode\ltjlineendcomment=9 \obeylines \spaceisspace #1% \parseargline\empty% Insert the \empty token, see \finishparsearg below. }
チョット修正してみました。
最初はそのように書いていたのですが,何故かエラーが出たので前に投稿した形になったのですが, 今試してみたらこれでOKみたいです.なんだったんだろう.別のエラー原因と混同したかな.
これを思いついたのは,以前に bxjscls の \catcode`\?=9 を見ていたからなので,ZRさんに感謝です.
ありがとうございます。
@node の中でだけU+FFFFFFのカテゴリコードを12にして、@c と同様の方法で除去すれば、、、ということを考えて、 \parseargusing 等を再定義してみたりはしていたのですが全然うまく実装できず、この方法はあきらめていました。カテゴリコードを9にするという手もあるんですね。。。
一応、バージョンチェック的なところも含めて、
のような感じでしょうか。
- \def\parseargusing#1#2{%
- \def\argtorun{#2}%
- \begingroup
- \ifx\ltjlineendcomment\thisisundefined
- % Ignore U+FFFFF for LuaTeX-ja <= 20160208.0
- \catcode"FFFFF=9
- \else
- % Ignore the character \ltjlineendcomment for LuaTeX-ja > 20160208.0
- \catcode\ltjlineendcomment=9
- \fi
- \obeylines
- \spaceisspace
- #1%
- \parseargline\empty% Insert the \empty token, see \finishparsearg below.
- }
日本語 Texinfo のサンプル https://github.com/trueroad/texinfo-sample-jp に上記のコードを入れてみました。
結局,文字列を挿入するのは大抵の場合は筋が悪そうだということで,私のコミット (125ec15) は破棄することにしましょう. これで一旦完了にします.
完了になっているところに追記して申し訳ありません。 @comment や @c 等の行末に和文文字があると、次の行も食べられてしまう、という事象を見つけました。本件最初の事象と全く同じメカニズムで発生するようで、本件と同様 @comment や @c を再定義して U+FFFFF のカテゴリコードを 9 にしてやることで解消できました。
日本語 Texinfo のサンプル https://github.com/trueroad/texinfo-sample-jp にも上記のコードを入れました。
- % Re-define texinfo.tex's \comment
- \def\comment{\begingroup \catcode`\^^M=\active%
- \ifx\ltjlineendcomment\thisisundefined
- % Ignore U+FFFFF for LuaTeX-ja <= 20160208.0
- \catcode"FFFFF=9%
- \else
- % Ignore the character \ltjlineendcomment for LuaTeX-ja > 20160208.0
- \catcode\ltjlineendcomment=9%
- \fi
- \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other\commentxxx}%
- % Re-let \comment related macros
- \let\setfilename=\comment
- \let\dircategory=\comment
- \let\definfoenclose=\comment
- \let\footnotestyle=\comment
- % Re-define texinfo.tex's \c
- \def\c{\begingroup \catcode`\^^M=\active%
- \ifx\ltjlineendcomment\thisisundefined
- % Ignore U+FFFFF for LuaTeX-ja <= 20160208.0
- \catcode"FFFFF=9%
- \else
- % Ignore the character \ltjlineendcomment for LuaTeX-ja > 20160208.0
- \catcode\ltjlineendcomment=9%
- \fi
- \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
- \cxxx}
- % Re-let \c related macro
- \let\texinfoc=\c
「完了」にしたのはとりあえずなので,問題があればどんどん書いて下さい(行末絡み以外ならば別チケットの方がよいかもしれませんが,そもそも私のつけたタイトルがよくなかった……).
確かに @c の行末でも同じことが起こりそうですね.これ以外に同様の事象が Texinfo になければよいのですが.
Texinfo 対応についてですが ,54ab627 で改行文字の前に挿入するコメント文字を変更する機能を入れていただいてありがとうございます. ただ,Texinfo ではそもそもカテゴリコード14の文字は排除されている(?)ようで,コメント文字のような働きをするコントロールシークエンスである @c や @comment を挿入できるようにしないとだめなようです.どうしましょうか.
ちなみに,@c の定義はこんな感じです.単純に行末まで食べます.