Ticket #28188

漢字のデフォルト catcode が 12 である件

Open Date: 2012-04-27 23:52 Last Update: 2014-02-02 13:30

Reporter:
Owner:
(None)
Status:
Closed
Component:
(None)
MileStone:
(None)
Priority:
5 - Medium
Severity:
5 - Medium
Resolution:
None
File:
4

Details

LuaTeX のデフォルトではひらがなやカタカナの catcode は 11 なのですが,漢字は 12 になっています. これのために,ltjclasses.dtx や ltjsclasses.dtx の \if西暦 とかは \ifSeireki に直したりしていたのですが, 科研費 LaTeX とかでも漢字をコントロールシーケンス名に使っていたりするので,過去資産の活用ということを 考えた場合にどうするべきなのかな,ということで立ててみます.

LuaTeX-ja + babel で japanese.ldf を読むと \if西暦 でひっかかる,というのを見かけたのでとりあえず.

Ticket History (3/25 Histories)

2012-04-27 23:52 Updated by: kmaeda
  • New Ticket "漢字のデフォルト catcode が 12 である件" created
2012-04-29 09:00 Updated by: zrbabbler
Comment

確か、lualatex がまだなかった頃は、0x80 以上の符号位置の \catcode は全部 12 だったはずです。 私は今でもそうだと思い込んでいた(\西暦 が使えないので)のですが、なるほど今では

ひらがなやカタカナの catcode は 11 なのですが,漢字は 12 になっています

となっているのですね。

でも、これは明らかに妙なので調べてみた所、やはりこれは意図しない結果でありそうなことが判りました。

  • XeTeX も LuaTeX も初期状態(-ini)では、0x80 以上の \catcode は全部 12 である。
  • 従って、これらの \catcode の設定はフォーマット作成時(*.ini ファイル)に行われている。
  • 具体的に設定を行うコードは、XeTeX では unicode-letters.tex、LuaTeX では luatex-unicode-letters.tex というファイルである。 後者は前者を改変して作られている。 どちらも、Unicode データベース(UCD)の UnicodeData.txt を基にして作られている。
  • (XeTeX の)unicode-letters.tex を見てみると、前半で \catcode (他 \lccode 等)、 後半(2 度目の \message の後)で \XeTeXcharclass を設定している。
  • \catcode の設定では Unicode の general category が(少なくとも) L? (記号でなく文字)である符号位置には 11 を与えている。
  • ところで、漢字とハングル完成形については、UnicodeData.txt では特殊な範囲指定の形式で書かれている (文字名称が機械的に導出可能で、かつ他の性質が全部同じだから)。
  • これらの「範囲」については、unicode-letters.tex では通常と異なり、後半において \catcode を 11 に変更している。 (範囲の一括処理のマクロを用いているのは後半のみ。)
  • 結果的に、XeTeX では全ての L? の文字の \catcode が 11 になる。
  • LuaTeX 用の catcode-unicode-letters.tex を作るとき、\XeTeXcharclass は XeTeX にしかないということで、後半部分を丸ごと削ったようだ。
  • ところが、それでは、「範囲指定」になっている漢字とハングル完成形について、 本来行うべき「\catcode を 11 に変更する」処理が脱落してしまう。

ということが起こっているようです。

2012-04-29 10:34 Updated by: h7k
Comment

なるほど,ありがとうございます.

ところが、それでは、「範囲指定」になっている漢字とハングル完成形について、 本来行うべき「\catcode を 11 に変更する」処理が脱落してしまう。

後半部を LuaTeX 用に書き直してみました (luatex-unicode-letters-aux.tex). サンプル (catcode-test.tex) では \西暦 もうまく動いているようです.
# luatex-unicode-letters-aux.tex の読み込みは絶対パスで書いてます.あと,\昭和 は単なるネタです.

2012-04-29 17:57 Updated by: zrbabbler
Comment

後半部を LuaTeX 用に書き直してみました (luatex-unicode-letters-aux.tex).

確認しました。問題ないようです。 この「XeTeX と同じ」というのが LuaTeX の「想定していた」既定値なのでしょう。

ところで、「LuaTeX-ja でどうするか」はまた別の問題で、「(u)pTeX に合わせる」という考えもあると思います。 私は、以下の理由で、「XeTeX に合わせる」を支持します。

  • (u)pTeX では \kcatcode が区[ブロック]単位でしか変えられない、 という制約のため、一部の文字が「不自然」な値を持っていた。
  • そもそも pTeX と upTeX で \kcatcode の既定値が微妙に異なる。(上項の制約のため。)
  • 少なくとも、ギリシャ文字・キリル文字は本来和文でないので、「LuaTeX の既定値」のままにしておくべき。
  • JIS X 0213 の非漢字部分(1~13区)の文字・非文字の分別結果を見た限り、 「XeTeX と同じ」のほうが妥当にみえる。
    分別結果を示した PDF 文書を添付します: uptex-kcatcode.pdf, luatex-catcode.pdf
2012-04-29 17:59 Updated by: zrbabbler
  • File luatex-catcode.pdf (File ID: 4733) is attached
2012-04-29 18:19 Updated by: zrbabbler
  • File luatex-catcode.pdf (File ID: 4733) is deleted
2012-04-29 18:28 Updated by: zrbabbler
Comment

luatex-catcode.pdf が肝心の luatex-unicode-letters-aux.tex を読む前の状態を出力していたので修正しました。 (〈仝〉は Unicode では漢字扱いなので少なくともこれの結果は変わる)

ところで、こおn「修正」は本家に取り込んだ方がいいはずだけど、 誰に連絡すればよいのかな。 コメントに出てくる「MPG」は多分 LuaLaTeX チームの Manuel Pégourié-Gonnard さんだから、 その辺り(lualatex-dev at tug.org)?

2012-04-29 19:14 Updated by: h7k
Comment

ところで、「LuaTeX-ja でどうするか」はまた別の問題で、「(u)pTeX に合わせる」という考えもあると思います。 私は、以下の理由で、「XeTeX に合わせる」を支持します。

pTeX/upTeX/LuaTeX での状況を色つき表で表示できるソースを作って比較してみましたが,私も「XeTeX に合わせる」でいいと思います.

ところで、こおn「修正」は本家に取り込んだ方がいいはずだけど、 誰に連絡すればよいのかな。 コメントに出てくる「MPG」は多分 LuaLaTeX チームの Manuel Pégourié-Gonnard さんだから、

texlive svn のログを遡ってみました.luatex-unicode-letters.tex は rev: 20014, author: mpg ですが,mpg 氏の rev 12854 で追加された luatexiniconfig.tex に

% Enable LuaTeX primitives for INI mode (needed since 0.39.0)
% Élie Roux & Manuel Pégourié-Gonnard, 2009. Public domain.
とあるので,Manuel Pégourié-Gonnard さんで間違いないでしょう.

2012-04-29 19:24 Updated by: kmaeda
Comment

あら,たしかにひらがな・カタカナと漢字で catcode が違うのは妙な感じはしていたのですが,一種のバグだったんでしょうか. ありがとうございます.

連絡は,LuaLaTeX の関係者が読んでいる ML でよいのではないでしょうか.

2012-05-08 10:50 Updated by: kmaeda
Comment

master で漢字の catcode が 11 になったようなので,ltj{,s}classes, luatexja-ajmacros でアルファベットに変更していた コントロールシーケンス名を元に戻してみました(kmaeda-cc-revert ブランチ).

ついでに,luatexja-ajmacros で \ajQuote が使えないまま放置していたのも直したつもりです (db05d95). ただ,ちょっとそのままで動かなかった原因がまだいまいち理解できていなくて,

\def\ajQuotedef#1 #2 #3 #4 {\ifx*#1\else
...
とスペース区切りになっていたのを
\def\ajQuotedef#1/#2/#3/#4/{\ifx*#1\else
...
とスラッシュ区切りに直したのと,
\xdef\ajQuote#1#2{\noexpand\CID{\noexpand\ifydir\noexpand\ifcase#1\the\toks0
        \noexpand\fi\noexpand\else\noexpand\ifcase#1\the\toks2
...
で \the\toks0 のあとに \relax を入れておかないと直後の \fi がなぜか展開されてしまうようなので入れておきました. これらは pLaTeX では問題なかったのですが…….スペースの catcode がおかしいのかとも思いましたが,よくわかりません.

あと,\toks0 の先頭に余計な \or が入ってしまって,

\ifcase #1\or 670\or 672\or...
となってしまっていたので,\@gobble で取り除くコードを入れてみました. これについては otf.sty の配布版(TeX Live 2011 で確認)でも同様で \ajQuote が使えなくなっていますので,直した方がよいと思われます.

2012-05-08 19:10 Updated by: kmaeda
Comment

そのままで動かなかった原因がまだいまいち理解できていなくて

冒頭で \endlinechar=-1 にしてあるからですね.スペースの catcode は疑っているのになんで気付かない……. 定義をオリジナルのに戻して \endlinechar=13 を加えておきました (cf563a5).

\toks0 の先頭に余計な \or が入ってしまって

なバグに関する変更は残してありますので,よろしくお願いします.

2012-05-16 15:04 Updated by: h7k
Comment

ltj{,s}classes, luatexja-ajmacros でアルファベットに変更していたコントロールシーケンス名を元に戻してみました(kmaeda-cc-revert ブランチ).

master にマージさせました.luatexja-otf.sty にも一箇所変更を加えています(luatexja-core.sty だけを読み込むのでは漢字の catcode が 12 にならないから).

(特に 1 区〜13 区について)pTeX, upTeX とどうちがうかの比較表はあった方が親切かもしれません.

2012-07-16 15:55 Updated by: h7k
Comment

(特に 1 区〜13 区について)pTeX, upTeX とどうちがうかの比較表はあった方が親切かもしれません.

JIS X 0208 の非漢字については commit 0d66310 で入れてみました.JIS X 0213 についても書くべきかなあ.

2013-03-15 10:00 Updated by: h7k
  • Ticket Close date is changed to 2013-03-15 10:00
  • Status Update from Open to Closed
Comment

完了としておきます.

2013-11-02 07:48 Updated by: h7k
  • Status Update from Closed to Open
Comment

ごめんなさい,一度完了にしたのですが,また気になったので再度オープンします.

JIS X 0213 の非漢字部分(1~13区)の文字・非文字の分別結果を見た限り、 「XeTeX と同じ」のほうが妥当にみえる。

JIS X 0208 の範囲ですが,もう一度比較してみました. upTeX と 「XeTeX に合わせた」LuaTeX-ja (commit e5a7e05) とを比較すると,異なっている点は

  • キリル文字の \kcatcode=18 (upTeX), \catcode=11
  • 1, 2区の次の記号が \kcatcode=18 だが \catcode=11:
    • 全角空白, `, ^,  ̄, _, 〃, 々, 〆, ◯, /, \, |, +, =, <, >, #, &, *, @
    • 〒, 〓, ¬, Å
  • 一方,次の記号は \kcatcode=17 だが,\catcode=12:
    • ・, 濁点, 半濁点, 〃

です.表を kct-out.pdf として添付しておきます.

個人的な意見としては,

  • upTeX と XeTeX とも違う分別を作るのは煩雑になるだけなのであまりやりたくない.
  • しかし,全角空白の \catcode が 11 なのは混乱が予想される.
  • 半角全角形の \catcode が 11 なのも違和感がある.
    • \<a と打った時に \< だけが制御綴と認識されるならば,それを全角にした \<a も「\< だけが制御綴として認識」の方が自然では?
    • とはいうものの,全角数字は pTeX でも upTeX でも \kcatcode=17 なので, LuaTeX-ja で\catcode=12 にするのは逆に混乱を招きそう

というのがあり,どうすればいいのか悩んでいます(悩んだ結果が 46afb87, b45df94).

2013-11-02 07:48 Updated by: h7k
  • File kct-out.pdf (File ID: 4997) is attached
2013-11-06 21:48 Updated by: kmaeda
Comment

旅行に行っていたりして遅くなりました.

全角空白って \catcode=11 だったんですね.そもそも ASCII 以外の文字を制御綴に使うことがほぼないので,普段使いではそこまで気が回っていないです.

原則は定義通り「文字は \catcode=11,それ以外は \catcode=12」なのだと思うので,そのようにすればよいのだと考えます. 数字については,文字だけれど文法的な理由で除外されているのだと思いますが,全角についてはそのような意味がないので文字扱いなんですかね. なので,全角空白は記号なので \catcode=12,「<」などの全角記号は \catcode=12,全角数字は \catcode=11 というのはある程度合理的に思えます.

というところまで書いて,はて他の言語だとどうなっているのだろう,とふと思ったので,Python3 で試してみました.

Python 3.3.2 (default, Aug 20 2013, 22:01:29) 
[GCC 4.8.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> あ=1
>>> print(あ)
1
>>> <=1
  File "<stdin>", line 1
    <=1
      ^
SyntaxError: invalid character in identifier
>>>  =1 # 全角スペース
  File "<stdin>", line 1
     =1 # 全角スペース
      ^
SyntaxError: invalid character in identifier
>>> 1=1
  File "<stdin>", line 1
    1=1
      ^
SyntaxError: invalid character in identifier
>>> 前田=1
>>> print(前田)
1
>>> 〒=1
  File "<stdin>", line 1
    〒=1
      ^
SyntaxError: invalid character in identifier
>>> ゛=1
  File "<stdin>", line 1
    ゛=1
      ^
SyntaxError: invalid character in identifier
>>> ξ=1
>>> print(ξ)
1
>>> あ1=1
>>> print(あ1)
1
>>> あ<=1
  File "<stdin>", line 1
    あ<=1
         ^
SyntaxError: invalid character in identifier
>>> print(あ1)
1
>>> あ =1
  File "<stdin>", line 1
    あ =1
         ^
SyntaxError: invalid character in identifier
>>> あ=1
  File "<stdin>", line 1
    あ=1
          ^
SyntaxError: invalid character in identifier

Python3 だと,全角数字は半角数字と変数名では同一視している感じがします.全角スペースが半角スペースと同じ役割ではないみたい.

2013-11-07 09:33 Updated by: h7k
  • File kct-out.pdf (File ID: 4997) is deleted
2013-11-07 09:48 Updated by: h7k
Comment

h7k への返信

表を kct-out.pdf として添付しておきます.

https://github.com/h-kitagawa/kct へのリンクとして貼り直しておきます.

リンク先には,JIS X 0213 の非漢字についての表 kct-uni.pdf もあります.

# jisx0213-2004-8bit-std.txt に Fullwidth form が書かれているものは問答無用でそれに合わせているので, ZR さんによる uptex-kcatcode.pdf, luatex-catcode.pdf とは若干異なっているかもしれません.

2013-11-07 09:48 Updated by: h7k
  • Priority Update from 3 to 5 - Medium
  • Type Update from 実装に関する議論 to Support Request
2014-02-02 13:30 Updated by: h7k
  • Status Update from Open to Closed
  • Ticket Close date is changed to 2014-02-02 13:30
Comment

pTeX, upTeX との違いを ドキュメント中にも書いたので,再び完了にします.

Attachment File List

Edit

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