Tíquete #36096

Texinfo 対応

: 2016-03-04 21:37 Última Atualização: 2016-03-12 01:07

Relator:
Dono:
(Nenhum)
Estado:
Fechado
Componente:
(Nenhum)
Marcos:
(Nenhum)
Prioridade:
5 - Medium
Gravidade:
5 - Medium
Resolução:
Nenhum
Arquivo:
1

Details

Texinfo 対応についてですが ,54ab627 で改行文字の前に挿入するコメント文字を変更する機能を入れていただいてありがとうございます. ただ,Texinfo ではそもそもカテゴリコード14の文字は排除されている(?)ようで,コメント文字のような働きをするコントロールシークエンスである @c や @comment を挿入できるようにしないとだめなようです.どうしましょうか.

ちなみに,@c の定義はこんな感じです.単純に行末まで食べます.

  1. \def\c{\begingroup \catcode`\^^M=\active%
  2. \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
  3. \cxxx}
  4. {\catcode`\^^M=\active \gdef\cxxx#1^^M{\endgroup}}

Ticket History (3/23 Histories)

2016-03-04 21:37 Updated by: kmaeda
  • New Ticket "Texinfo 対応" created
2016-03-06 11:11 Updated by: kmaeda
  • Tipo Update from Bugs to Support Request
2016-03-06 16:34 Updated by: zrbabbler
Comentário

Texinfo の一部の命令(@node 等)は「その行の残り全部を引数にとる」という仕様になっているようです。そして、その実装では、先に出てきた @c と同様に、「改行文字をアクティブにした上で、改行文字を区切りとしたマクロを呼ぶ」としています。従って、入力前処理で行末にコメント文字を入れてしまうと改行文字が消えてしまいます。これが luatexja で異常になる原因です。

\parsearg がその処理をしているマクロです。

Texinfo では、「どうしても必要な場合」のために、文字コード127の文字がコメント文字(カテゴリコード14)に割り当てられているようですが、先述の理由で、これを使っても失敗します。

@node 等の命令の引数で @c@comment を使うことはできるようです。(もちろん直接 \c を実行できるわけはないので特別にパーズして除去している。)だから、コメント文字の代わりに @c を入れるというのは解決法として考えられます。でも、Texinfo のマニュアルを見ると、コメント命令(@c / @comment)は使えない場所もあると書いてあります。ひょっとしたら、「@c を入れる」も失敗するかも知れません。

2016-03-06 16:59 Updated by: h7k
Comentário

時間がなかなか取れず対応できなくてすみません.(来週もきついです)

54ab627 では改行の前に挿入できる文字をカウンタ \ltjlineendcomment で指定できるようにしていますが,これを拡張して

  • \ltjlineendcomment=-1 なら,何も入れない
  • \ltjlineendcomment=-2 なら,Lua 文字列 luatexja.inputbuf.comment_string の内容を追加する

とすること自体は可能だと思います.

% 単純なカウンタでなく,\ltjsetparameter/\ltjgetparameter に組み入れた方がいい?

2016-03-06 19:55 Updated by: zrbabbler
Comentário

失敗しそうなパターンを見つけました。

  • @code@emph 等の“brace command”は (LaTeX のマクロと同じように) { } で囲った引数をとり、これは行をまたぐことができる。
    • 実際に行をまたいだ使用は珍しくない。
  • ところが(複数行の)引数の中でコメント命令(@c) を入れることはできない。 (実際にやってみるとエラーになる。)
    • 要するに、「カテゴリコード変更を利用しているマクロは 他のマクロの引数では使えない」という制限に引っかかる。

例えば、以下の例で @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{ちりぬるを
わかよたれそ}つねならむ
2016-03-06 22:04 Updated by: kmaeda
Comentário

ZRさん,ありがとうございます.

ふと思ったのですが,これまでスペースの抑制のためにコメント文字を使っていたわけですが,この目的ならば \ignorespaces があるので,こちらを挿入することで解決できないでしょうか.ただの思いつきで,\ignorespaces の動作について詳しいわけではないので,これはこれで駄目な例があるかもしれませんが.

ちょっと試したところ,@node の行末に @ignorespaces を入れると2回目以降のコンパイルで .aux を読む時にエラーになるので,少し工夫が必要そうです.

2016-03-06 22:37 Updated by: trueroad
Comentário

皆さま いろいろなアイディアありがとうございます。

いっそ、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 なりに書くことになると思います。

2016-03-08 00:33 Updated by: trueroad
Comentário

\ignorespaces でいけるのであれば、Texinfo 側で @c の除去と同じような方法で @ignorespaces を除去できるのではないかと思います。 といっても、本家 texinfo.tex をいじるのではなくて、txi-ja.tex で、いくつかのマクロを再定義することになるかと思います。

もしかすると、本当に line command 中で \ignorespaces を使いたいときに困るかもしれないので、\ignorespaces そのものではなくて、 別の適当な名前のマクロを定義して使うようにする方がいいような気もします。

2016-03-08 11:28 Updated by: kuroky
Comentário

昔の決定を含めて少し蒸し返すと,日本語文章のソース中での改行をどう扱うか,というのが大きい話だと思います. 要求レベルと実装レベルで本来きちんと整理すべきだと思いますが,うまく調べきれていないので,問題提起で少し書き散らします.

  • pTeXでは,…
  • LuaTeX-jaでは,当初の想定では U+FFFF(カテゴリコード14)の文字を改行ごとに挟んで,ボックスを並べるときにその改行を単語間空白に置き換えるかどうかを判断する?
  • ConTeXtでは,日本語対に挟まれた任意のASCII空白を除去する
  • CSS組版などでは,特定の文字の直後の改行は,単語間空白にしないという設定ができる(?,texconf15で村上さんからそんな回答をいただいたと記憶しています.)

真にどうしたいか,よりシンプルな実装が存在するか,という観点に変わっていってもよいのではないかなあ,とinhibitglueの流用?が出現して感じました.

2016-03-08 13:24 Updated by: kmaeda
Comentário

北川さんの

54ab627 では改行の前に挿入できる文字をカウンタ \ltjlineendcomment で指定できるようにしていますが,これを拡張して * \ltjlineendcomment=-1 なら,何も入れない * \ltjlineendcomment=-2 なら,Lua 文字列 luatexja.inputbuf.comment_string の内容を追加する とすること自体は可能だと思います.

の実装を試してみました (125ec15).これを用いた Texinfo の対応例を testtexi.zip として上げました(\ignorespaces 使用).

黒木さん,コメントありがとうございます.検討しなおす良い機会かもしれません.

2016-03-08 15:48 Updated by: zrbabbler
Comentário

一般のLuaTeX-jaの仕様について考えるなら、
\ignorespaces\relax とかを挿入する」
という方式は排除できると思います。

\def\test{%
  {\TeX}はアレ
}
  • pTeX系や現状のLuaTeX-jaではこれは
    \def\test{{\TeX}はアレ}
    と等価になります。
  • CJKやxeCJKではこれは
    \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の命令でない)。

2016-03-08 16:03 Updated by: kmaeda
Comentário

ZRさん,ありがとうございます.

  1. \newcommand*\myMacro[2]{......}
  2. % ↓末尾に \ignorespaces が入るので異常動作する
  3. \myMacro{{\TeX}はアレ}
  4. {Ti\emph{k}Zもアレ}

そうか,このケースがありえますか.Texinfo でも2つ以上引数をとるマクロがあるとまずいことが起こるかもしれないです.

2016-03-08 16:38 Updated by: zrbabbler
Comentário

(Texinfoに限って \ignorespaces を適用することについて)

ユーザ定義マクロは複数引数のものが定義できるようですが、 これに関しては行をまたぐことを(何故か)禁止してますね…(マニュアル17.3節)。 ただ、そのほかの命令についても、 \ignorespaces が混入した場合に影響が出ないかをちゃんと検証する必要がある、 と思っています(で、そんなことやりたくない……)。

少なくとも、 @tex で「TeX言語環境」に入った場合には 「謎仕様」が効いてくるはず。

2016-03-08 16:52 Updated by: zrbabbler
Comentário

Texinfoのための対策については、自分としては、色々検討した結果、

いっそ、Lua の世界で、行頭に @node 等の line command があったら行末に U+FFFFF をつけない(行頭に line command が無い場合だけ U+FFFFFF をつける)という動作も考えられるかなぁ、と思いました。

これが最も妥当かなと考えています。

・LuaTeXja側で

luatexja.inputbuf.ナントカカントカ = <boolean> function(<string> line_string)

みたいなフックを用意しておいて、 「『これが定義済であり、かつ実行結果が真(か偽か予め決めた方)』でない」 というのをコメント文字挿入の条件に加える。

・あとは、Texinfoの側で具体的な条件を考える。

LuaTeX-ja一般の話としては、現状の仕様が妥当だと考えています。 (理由は長くなるので今は省略。)

2016-03-08 18:23 Updated by: kmaeda
Comentário

また思いつきですが,実はこれだけで Texinfo 対応は解決しないでしょうか?

  1. \def\parseargusing#1#2{%
  2. \def\argtorun{#2}%
  3. \begingroup
  4. \catcode\ltjlineendcomment=9% Ignore the character \ltjlineendcomment (U+FFFFF).
  5. \begingroup
  6. \obeylines
  7. \spaceisspace
  8. #1%
  9. \parseargline\empty% Insert the \empty token, see \finishparsearg below.
  10. }
  11. \def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}%
  12. \endgroup% Restore the catcode of \ltjlineendcomment.
  13. }
2016-03-08 18:33 Updated by: kmaeda
Comentário

\endgroup で復元だと何かまずいことがあるかもしれないので,\catcode だけ保存しておいて復元の方がよいかも.

2016-03-08 21:32 Updated by: zrbabbler
Comentário

実はこれだけで Texinfo 対応は解決しないでしょうか?

ホントだ……今までなぜ気づかなかったんだろう……。

チョット修正してみました。

\def\parseargusing#1#2{%
  \def\argtorun{#2}%
  \begingroup
    \catcode\ltjlineendcomment=9
    \obeylines
    \spaceisspace
    #1%
    \parseargline\empty% Insert the \empty token, see \finishparsearg below.
}
2016-03-08 21:40 Updated by: kmaeda
Comentário

チョット修正してみました。

最初はそのように書いていたのですが,何故かエラーが出たので前に投稿した形になったのですが, 今試してみたらこれでOKみたいです.なんだったんだろう.別のエラー原因と混同したかな.

これを思いついたのは,以前に bxjscls の \catcode`\?=9 を見ていたからなので,ZRさんに感謝です.

2016-03-08 23:42 Updated by: trueroad
Comentário

ありがとうございます。

@node の中でだけU+FFFFFFのカテゴリコードを12にして、@c と同様の方法で除去すれば、、、ということを考えて、 \parseargusing 等を再定義してみたりはしていたのですが全然うまく実装できず、この方法はあきらめていました。カテゴリコードを9にするという手もあるんですね。。。

一応、バージョンチェック的なところも含めて、

  1. \def\parseargusing#1#2{%
  2. \def\argtorun{#2}%
  3. \begingroup
  4. \ifx\ltjlineendcomment\thisisundefined
  5. % Ignore U+FFFFF for LuaTeX-ja <= 20160208.0
  6. \catcode"FFFFF=9
  7. \else
  8. % Ignore the character \ltjlineendcomment for LuaTeX-ja > 20160208.0
  9. \catcode\ltjlineendcomment=9
  10. \fi
  11. \obeylines
  12. \spaceisspace
  13. #1%
  14. \parseargline\empty% Insert the \empty token, see \finishparsearg below.
  15. }
のような感じでしょうか。

日本語 Texinfo のサンプル https://github.com/trueroad/texinfo-sample-jp に上記のコードを入れてみました。

2016-03-09 23:53 Updated by: kmaeda
  • Estado Update from Aberto to Fechado
  • Ticket Close date is changed to 2016-03-09 23:53
Comentário

結局,文字列を挿入するのは大抵の場合は筋が悪そうだということで,私のコミット (125ec15) は破棄することにしましょう. これで一旦完了にします.

2016-03-12 00:57 Updated by: trueroad
Comentário

完了になっているところに追記して申し訳ありません。 @comment や @c 等の行末に和文文字があると、次の行も食べられてしまう、という事象を見つけました。本件最初の事象と全く同じメカニズムで発生するようで、本件と同様 @comment や @c を再定義して U+FFFFF のカテゴリコードを 9 にしてやることで解消できました。

  1. % Re-define texinfo.tex's \comment
  2. \def\comment{\begingroup \catcode`\^^M=\active%
  3. \ifx\ltjlineendcomment\thisisundefined
  4. % Ignore U+FFFFF for LuaTeX-ja <= 20160208.0
  5. \catcode"FFFFF=9%
  6. \else
  7. % Ignore the character \ltjlineendcomment for LuaTeX-ja > 20160208.0
  8. \catcode\ltjlineendcomment=9%
  9. \fi
  10. \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other\commentxxx}%
  11. % Re-let \comment related macros
  12. \let\setfilename=\comment
  13. \let\dircategory=\comment
  14. \let\definfoenclose=\comment
  15. \let\footnotestyle=\comment
  16. % Re-define texinfo.tex's \c
  17. \def\c{\begingroup \catcode`\^^M=\active%
  18. \ifx\ltjlineendcomment\thisisundefined
  19. % Ignore U+FFFFF for LuaTeX-ja <= 20160208.0
  20. \catcode"FFFFF=9%
  21. \else
  22. % Ignore the character \ltjlineendcomment for LuaTeX-ja > 20160208.0
  23. \catcode\ltjlineendcomment=9%
  24. \fi
  25. \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other%
  26. \cxxx}
  27. % Re-let \c related macro
  28. \let\texinfoc=\c
日本語 Texinfo のサンプル https://github.com/trueroad/texinfo-sample-jp にも上記のコードを入れました。

2016-03-12 01:07 Updated by: kmaeda
Comentário

「完了」にしたのはとりあえずなので,問題があればどんどん書いて下さい(行末絡み以外ならば別チケットの方がよいかもしれませんが,そもそも私のつけたタイトルがよくなかった……).

確かに @c の行末でも同じことが起こりそうですね.これ以外に同様の事象が Texinfo になければよいのですが.

Attachment File List

Editar

You are not logged in. I you are not logged in, your comment will be treated as an anonymous post. » Login