漢字のデフォルト catcode が 12 である件
確か、lualatex がまだなかった頃は、0x80 以上の符号位置の \catcode は全部 12 だったはずです。 私は今でもそうだと思い込んでいた(\西暦 が使えないので)のですが、なるほど今では
ひらがなやカタカナの catcode は 11 なのですが,漢字は 12 になっています
となっているのですね。
でも、これは明らかに妙なので調べてみた所、やはりこれは意図しない結果でありそうなことが判りました。
ということが起こっているようです。
なるほど,ありがとうございます.
ところが、それでは、「範囲指定」になっている漢字とハングル完成形について、 本来行うべき「\catcode を 11 に変更する」処理が脱落してしまう。
後半部を LuaTeX 用に書き直してみました (luatex-unicode-letters-aux.tex).
サンプル (catcode-test.tex) では \西暦 もうまく動いているようです.
# luatex-unicode-letters-aux.tex の読み込みは絶対パスで書いてます.あと,\昭和 は単なるネタです.
後半部を LuaTeX 用に書き直してみました (luatex-unicode-letters-aux.tex).
確認しました。問題ないようです。 この「XeTeX と同じ」というのが LuaTeX の「想定していた」既定値なのでしょう。
ところで、「LuaTeX-ja でどうするか」はまた別の問題で、「(u)pTeX に合わせる」という考えもあると思います。 私は、以下の理由で、「XeTeX に合わせる」を支持します。
luatex-catcode.pdf が肝心の luatex-unicode-letters-aux.tex を読む前の状態を出力していたので修正しました。 (〈仝〉は Unicode では漢字扱いなので少なくともこれの結果は変わる)
ところで、こおn「修正」は本家に取り込んだ方がいいはずだけど、 誰に連絡すればよいのかな。 コメントに出てくる「MPG」は多分 LuaLaTeX チームの Manuel Pégourié-Gonnard さんだから、 その辺り(lualatex-dev at tug.org)?
ところで、「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 さんで間違いないでしょう.
あら,たしかにひらがな・カタカナと漢字で catcode が違うのは妙な感じはしていたのですが,一種のバグだったんでしょうか. ありがとうございます.
連絡は,LuaLaTeX の関係者が読んでいる ML でよいのではないでしょうか.
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 が使えなくなっていますので,直した方がよいと思われます.
そのままで動かなかった原因がまだいまいち理解できていなくて
冒頭で \endlinechar=-1 にしてあるからですね.スペースの catcode は疑っているのになんで気付かない……. 定義をオリジナルのに戻して \endlinechar=13 を加えておきました (cf563a5).
\toks0 の先頭に余計な \or が入ってしまって
なバグに関する変更は残してありますので,よろしくお願いします.
ltj{,s}classes, luatexja-ajmacros でアルファベットに変更していたコントロールシーケンス名を元に戻してみました(kmaeda-cc-revert ブランチ).
master にマージさせました.luatexja-otf.sty にも一箇所変更を加えています(luatexja-core.sty だけを読み込むのでは漢字の catcode が 12 にならないから).
(特に 1 区〜13 区について)pTeX, upTeX とどうちがうかの比較表はあった方が親切かもしれません.
(特に 1 区〜13 区について)pTeX, upTeX とどうちがうかの比較表はあった方が親切かもしれません.
JIS X 0208 の非漢字については commit 0d66310 で入れてみました.JIS X 0213 についても書くべきかなあ.
完了としておきます.
ごめんなさい,一度完了にしたのですが,また気になったので再度オープンします.
JIS X 0213 の非漢字部分(1~13区)の文字・非文字の分別結果を見た限り、 「XeTeX と同じ」のほうが妥当にみえる。
JIS X 0208 の範囲ですが,もう一度比較してみました. upTeX と 「XeTeX に合わせた」LuaTeX-ja (commit e5a7e05) とを比較すると,異なっている点は
です.表を kct-out.pdf として添付しておきます.
個人的な意見としては,
というのがあり,どうすればいいのか悩んでいます(悩んだ結果が 46afb87, b45df94).
旅行に行っていたりして遅くなりました.
全角空白って \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 だと,全角数字は半角数字と変数名では同一視している感じがします.全角スペースが半角スペースと同じ役割ではないみたい.
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 とは若干異なっているかもしれません.
pTeX, upTeX との違いを ドキュメント中にも書いたので,再び完了にします.
LuaTeX のデフォルトではひらがなやカタカナの catcode は 11 なのですが,漢字は 12 になっています. これのために,ltjclasses.dtx や ltjsclasses.dtx の \if西暦 とかは \ifSeireki に直したりしていたのですが, 科研費 LaTeX とかでも漢字をコントロールシーケンス名に使っていたりするので,過去資産の活用ということを 考えた場合にどうするべきなのかな,ということで立ててみます.
LuaTeX-ja + babel で japanese.ldf を読むと \if西暦 でひっかかる,というのを見かけたのでとりあえず.