Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[ptex] [和字]+ [ブレース]で終わっている行の行端の扱い #87

Closed
h-kitagawa opened this issue Aug 4, 2019 · 15 comments
Labels

Comments

@h-kitagawa
Copy link
Member

TeX Forum の記事「[和字]+ [ブレース]で終わっている行の行端の扱い」(帯田 木偶太さん)を忘れないためにチケット化しておきます.

現在の pTeX では、ソース上の行が[和字]+[1 個以上の開きまたは閉じの
ブレース]で終わっている場合、行端由来の空白は入らないようですが、
これって仕様なのでしょうか?

pTeX の配布に含まれるドキュメント類を探しても、
$texmfmain/doc/ptex/base/jtexdoc.tex に、

欧文の場合、改行は単語間のスペースとして取り扱われますが、
日本語の場合、原稿内では自由な箇所で改行が行えたほうが便利です。\
そこで日本語\TeX では、1行の終わりが1バイトコードの場合はスペーサー
の挿入を行い、2バイトコードの場合は何も行わないようになっています。

とあるだけで、[和文字]+[ブレース]が更なる例外であるというような
記述は見つかりません。『改訂第 7 版 LaTeX2e 美文書作成入門』§3.10 の
記述も同様ですし、他の書籍類でも見た覚えがありません。
(以下省略)

@aminophen
Copy link
Member

aminophen commented Feb 6, 2022

TeX Forum の記事の(07a)に関連してですが,行の終わりが「和文文字からなる制御綴」+「ブレース」の場合が不思議な感じですね。「和文文字→グループ境界 {, } が有限個という状態で行が終わった場合に,空白が発生しない」が一種の仕様?だと思っていましたが,以下の例だと不思議です。

\def\和{あ}\def\。{い}

あ
う
{あ}
う
い
う
{い}
う

\和
う
{\和}
う
\。
う
{\。}
う


\bye

→ マニュアルの表現を「和文文字→グループ境界 {, } が有限個という状態で行が終わった場合に,空白が発生しない」から「コントロールワードの一部でない和文文字→グループ境界〜」に変えれば良い?

@h-kitagawa
Copy link
Member Author

どうなんでしょうね.マニュアルの表現を直すのもありですが,
コントロールワードの直後に state が一律 mid_line になっているので,最後が和文文字かどうかで分岐させる方が自然のように思います(もうすぐ夕食どきなので,その後にやります).

@aminophen
Copy link
Member

とりあえずマニュアルの表現を直してみました。 texjporg/ptex-manual@6096faa (手許で他に直していた文章も一緒になっているコミットですが)

20220206-ptex-endline

@aminophen
Copy link
Member

コントロールワードの直後に state が一律 mid_line になっているので,最後が和文文字かどうかで分岐させる

考えてみれば #81 の改修前は「コントロールワードの最後が和文文字かどうか」が完全には区別できず混同される状況がありましたので,今年のタイミングで直すのもアリかもしれないですね。

@h-kitagawa
Copy link
Member Author

コントロールワードの直後に state が一律 mid_line になっている

おっと,これは嘘でした,skip_blanks ですね.ちょっと大きくなりそうですが考えてみます.

@h-kitagawa
Copy link
Member Author

今年のタイミングで直す

https://github.com/texjporg/tex-jp-build/tree/state_csword でやってみました.結果的に state の値として skip_blanks_kanji(和文文字後の skip_blank)を増やしたことになります.

@aminophen
Copy link
Member

state の値として skip_blanks_kanji(和文文字後の skip_blank)を増やした

ありがとうございます。単に mid_kanji に行くのでは足りなかったということでしょうか。

@aminophen
Copy link
Member

「コントロールワードの最後が和文文字かどうか」が完全には区別できず混同される状況

#81 の話は str_pool に格納されたあとの話なので,今の話(格納するまでの話)とは別でしたね。

直すのが良いかどうかは悩みます。もともと「和文文字+ブレース」で空白が入らないのは不思議に思うところですし…。

@h-kitagawa
Copy link
Member Author

eptexlineendmode_p400 ブランチ\ptexlineendmode を実装しました.着想としては 某カレンダー のように入力をトークンとして読み込む過程を内部整数で制御するというものです.


\ptexlineendmodeは内部整数であり,現在では下位 3 ビットの値のみが意味をもつ.

  • 最下位ビットが 0 のときは「和文文字で終わるコントロールワード+{}」で行が終わるときに空白を発生させません.1 のときは発生させます.
  • 下から 2 番目のビットが 0 のときは和文文字のコントロールシンボルで行が終わるときに空白を発生させません.1 のときは発生させます.
  • 下から 3 番目のビットが 0 のときは「和文文字(cs の一部の場合は除く)+ {}」で行が終わるときに空白を発生させません.1 のときは発生させます.

p4.0.0 以降のデフォルトの挙動は 0,p3.8.2 の挙動は 1,p3.8.1 以前の挙動は 3 となるはずです.

@aminophen
Copy link
Member

\ptexlineendmode の実装,ありがとうございます。 良いと思います。

試してみました。下から3番目のビットの動作が想定と違うような気がします。具体的には,下から2番目のビットで制御されるべき「和文コントロールシンボル + {}」で行が終わる時も連動してしまうようです。

%#!ptex
\catcode`\{=1
\catcode`\}=2
\catcode`\^=7

%\catcode`^^A=12  % 12
\catcode`^^B=11   % 11
%\catcode`^^80=12 % 12
\catcode`^^81=11  % 11

\tracingonline1
\showboxdepth10000
\showboxbreadth10000

\font\x=cmr10 \x
\font\y=rml \y

\def\TeXnician{A}
\def\!{B}
\def\きょうはTeX日和{C}
\def\あしたはMF{D}
\def\!{E}
\def\^^A{F}
\def\^^B{G}
\def\^^80{H}
\def\^^81{I}
\def\^^B漢{J}
\def\漢^^B{K}
\def\^^81漢{L}
\def\漢^^81{M}

あ\TeXnician\!\きょうはTeX日和
え\あしたはMF
お\!\^^A
き\^^B
く\^^80
け\^^81
こ\^^B漢
さ\漢^^B
し\^^81漢
す\漢^^81
\showlists

あ{\TeXnician}
い{\!}
う{\きょうはTeX日和}
え{\あしたはMF}
お{\!}
か{\^^A}
き{\^^B}
く{\^^80}
け{\^^81}
こ{\^^B漢}
さ{\漢^^B}
し{\^^81漢}
す{\漢^^81}
\showlists

あn
い!
うX日和
えMF
お!
か^^A
き^^B
く^^80
け^^81
こ^^B漢
さ漢^^B
し^^81漢
す漢^^81
\showlists

あ{n}
い{!}
う{X日和}
え{MF}
お{!}
か{^^A}
き{^^B}
く{^^80}
け{^^81}
こ{^^B漢}
さ{漢^^B}
し{^^81漢}
す{漢^^81}
\showlists

\end

これを ptex -ini \\ptexlineendmode4 \\input test.tex とでもして走らせると,「値が0の時と4の時の差分」と「値が2の時と6の時の差分」とが一致しなかったので気づきました。

@h-kitagawa
Copy link
Member Author

和文コントロールシンボル + {}

考慮漏れでした,ありがとうございます.

和文文字由来の mid_kanji と,和文コントロールシンボル由来の mid_kanji が区別できないことが原因ですが,これを解決しようとするとまた state が増えることになります.そのため,

和文コントロールシンボル + {} で行が終わった際は,下から 2, 3 番めのビットが両方 0 のときのみ空白が入らない

と現行の挙動を述べたほうがよいように思います.

@aminophen
Copy link
Member

和文コントロールシンボル + {} で行が終わった際は,下から 2, 3 番めのビットが両方 0 のときのみ空白が入らない

と現行の挙動を述べたほうがよいように思います.

そうですね,そうしましょう。


差分 https://github.com/texjporg/tex-jp-build/compare/1398582..408aaf7 を見ていてふとした疑問ですが,uptex-m.ch では @ @<Scan ahead in the buffer...@>= のマルチバイト文字でない場合に

-    cat:=cat_code(cur_chr);
+    cat:=cat_code(cur_chr); if cat=letter then state:=skip_blanks;

が追加されているのに対して,そこの元である ptex-base.ch は

   else cat:=cat_code(cur_chr);

のままなのが気になりました。

@h-kitagawa
Copy link
Member Author

-    cat:=cat_code(cur_chr);
+    cat:=cat_code(cur_chr); if cat=letter then state:=skip_blanks;

ここはいらない気がしてきました.次の ^^ 記法を調べる

  while (buffer[k]=cur_chr)and(cat=sup_mark)and(k<limit) do

ループの後にもう一回

    if cat=letter then state:=skip_blanks;

があるからです.

@aminophen
Copy link
Member

ここはいらない気がしてきました.

私もそんな気がします。

aminophen added a commit that referenced this issue Feb 15, 2022
@aminophen
Copy link
Member

マージして svn r62032 でコミットしました。

これで pTeX 系列の TL2022 へ向けたは完了したと思います。ありがとうございます。pretest がもうすぐ始まりますので,それまでに pLaTeX の方を latex-dev に追随させながらテストしていこうと思います。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants