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

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

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

pTeX の配布に含まれるドキュメント類を探しても、
$texmfmain/doc/ptex/base/jtexdoc.tex に、
    欧文の場合、改行は単語間のスペースとして取り扱われますが、
    日本語の場合、原稿内では自由な箇所で改行が行えたほうが便利です。\\
    そこで日本語\TeX では、1行の終わりが1バイトコードの場合はスペーサー
    の挿入を行い、2バイトコードの場合は何も行わないようになっています。
とあるだけで、[和文字]+[ブレース]が更なる例外であるというような
記述は見つかりません。『改訂第 7 版 LaTeX2e 美文書作成入門』§3.10 の
記述も同様ですし、他の書籍類でも見た覚えがありません。

一方、実際の pTeX は、相当昔からから、このような場合には行端は単に
無視されるという動作をしてきたものと記憶しています。
  ※    私が最初に気付いたのは、MS-DOS 上で動作する East Wind 版と
        呼ばれるものだったと思います。
ずっと気にはなっていたものの、実際上の問題になることはなかろうと考えて
特にどこにも報告せずにいた(ひょっとすると、TeX Q & A(ここの
旧掲示板)あたりでちらっと言及したような気もします)のですが、
https://okumuralab.org/tex/mod/forum/discuss.php?d=2667&parent=15619 の
最後の「なぜ」は、この点に由来するわけで、この際はっきり確かめておきたく、
質問させていただく次第です。

以下、確認用のソースです。

------------------------------------------------------------------------

\documentclass{jarticle}\relax

\def\testA#1#2{%
    \def\tempA{#1}%
    \futurelet\tempAA\testAA
}
\def\testAA{%
    \typeout{\tempA: \meaning\tempAA:}%
}
\def\testB#1#2#3{%
    \def\tempA{#3}%
    \typeout{#1: \meaning\tempA:}%
}

\begin{document}

\testA{01}{和X}
Y%  %  “01: blank space  :”と表示される(行端が空白に変換される)

\testA{02}{{和X}}
Y%  %  “02: blank space  :”と表示される(行端が空白に変換される)
    %
\testA{03}{和}
Y%  %  “03: the letter Y:”と表示される(行端は無視される)

\testA{04}{{和}}
Y%  %  “04: the letter Y:”と表示される(行端は無視される)

\testA{05}{和}     
Y%  %  “05: the letter Y:”と表示される(行末の空白も行端も無視される)

\testA{06}{和} %
Y%  %  “06:  blank space  :”と表示される。
    %  これは行末由来ではなく、% の直前のスペースがそのまま
    %  空白として認識されたものと思われる。
    %  05 の結果とは対照的だが、期待どおりの動作。

\testA{07}{\和}
Y%  %  “07: blank space  :”と表示される(ブレースの直前が和文字でも、それが
    %  コントロール・シーケンス名の一部なら行端が空白に変換される)
    %  これも期待どおりの動作。

\testB{08}X{
Y}% %  “08: macro:-> Y:”と表示される(行端が空白に変換される)

\testB{09}X{{
Y}}%%  “09: macro:->{ Y}:”と表示される(行端が空白に変換される)

\testB{10}和{
Y}% %  “10: macro:->Y:”と表示される(行端は無視される)

\testB{11}和{{
Y}}%%  “11: macro:->{Y}:”と表示される(行端は無視される)

\message{^^J}


\end{document}

帯田 木偶太 への返信

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

- aminophen の投稿
現在 texjporg で執筆中の「pTeX マニュアル」には

> ソース上の行が[和字]+[1 個以上の開きまたは閉じのブレース]で終わっている場合、
> 行端由来の空白は入らないようですが、

をドキュメント化しています。(こちら

> (欧文文字直後の改行は空白文字扱いされるのと対照的に)
> \emph{和文文字直後の改行は何も発生しない}.和文文字の直後にグループ開始・終了が来て
> 行が終わった場合も同様である.

ただ,このマニュアルは pTeX の現行挙動に基づいて執筆しているので,
妥当な仕様なのかどうかは私にはわかりません。
(直感的ではないな,とは思います)
帯田 木偶太 への返信

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

- aminophen の投稿
帯田 木偶太さんの例示ソース中の 07 に

> ブレースの直前が和文字でも、それが
> コントロール・シーケンス名の一部なら行端が空白に変換される

とありますが,この言明は

* pTeX p3.8.1 (TeX Live 2018) までなら真
* pTeX p3.8.2 (TeX Live 2019) では厳密には偽

になります。(提示されているソースコードの処理結果はどちらも同じ)

「コントロール・シーケンス」には
「コントロール・ワード」と「コントロール・シンボル」の2種類があります。
"\和" はコントロール・ワードですので,p3.8.1 と p3.8.2 で変化しません。
"\。" はコントロール・シンボルですので,p3.8.1 と p3.8.2 で変化しています。

提示されているソースの 07 の部分を以下に置き換えてコントロール・シンボルも試すと,違いが表れてきます。

% =====

\testA{07a}{\和}
Y%  %  “07a: blank space  :”と表示される(ブレースの直前が和文字でも、それが
    %  コントロール・ワード名の一部なら行端が空白に変換される)
    %  これも期待どおりの動作。

\testA{07b}{\。}
Y%  %  p3.8.2 では“07b: the letter Y:”と表示される(行端は無視される)
    %  p3.8.1 では“07b: blank space  :”と表示される(行端が空白に変換される)
    %  (ブレースの直前が和文字でも、それがコントロール・シンボルの一部)

% =====

この p3.8.1 → p3.8.2 の変化は意図的で,texjporg の「pTeX マニュアル」に書いてあります。

> バージョン p3.8.1 以前では「\】」のような和文のコントロールシンボルで行が終わった場合,
> 「\!」のような欧文コントロールシンボルと同様に改行由来の空白が追加されてしまい,
> 和文文字直後の改行は何も発生しないという原則に反していたが,
> こちらは TeX Live 2019 の pTeX p3.8.2 で修正された([5]).
帯田 木偶太 への返信

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

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

肝心のこの質問に対しては,仕様だと考えた方が良さそうです。

\documentclass{jsarticle}
\begin{document}

これは日本語です。(1)

これは\textbf{日本語}です。(2)

これは\textbf{日本語}
です。(3)

これは\textbf{日本語} %
です。(4)(比較用;空白が入る)

\end{document}

もし「ソース上の行が[和字]+[1 個以上の開きまたは閉じのブレース]で終わっている場合」に
空白が入るとすれば,上記の(3)で空白が入ってしまいます。

----

さて,さっき挙げた例の 07a の挙動はマニュアルと一致しない気がする…
aminophen への返信

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

- しっぽ 愛好家 の投稿
>空白が入るとすれば,上記の(3)で空白が入ってしまいます。
これを嫌うか,それでも構わないかという話なのですよね. 当時の開発者はそれを嫌ったのでしょうけれども. そして,(私も含め)「空白が入ったほうが理解しやすい」人も いるというだけのことでしょう.
しっぽ 愛好家 への返信

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

- 帯田 木偶太 の投稿
お二方とも、返信をいただきありがとうございます。

すでに知られている挙動だったのですね。

「仕様」かどうかはともかくとして、「意図された挙動」だと
お二方とも考えておられるようですが、私にはどうもそうでないように思えます。
意図されたものであるなら、開発サイドからの表明が全く見当たらないというのは
不審ですし、そのような挙動をさせる動機・目的というのが思い当たりません。
https://okumuralab.org/tex/mod/forum/discuss.php?d=2682&parent=15700 で
ご指摘があったように、
        これは\textbf{日本語}
        です。(3)
という場合に、現在の挙動であれば、行端をコメントアウトする必要がなくなりますが、
こういう位置に行端が入り得るような記述スタイルを取り入れているケースでは、
        コンパクト・ディスクは、\textbf{CD}
        と略称される。
という記述もなされ得るところ、こちらの行端はコメント・アウトする必要が
あることになります。結局、ブレースで行を終わらせる場合、
「積極的に空白を望むのでない限り行端をコメント・アウトする」か、
「ブレースのさらに前を見て、必要により行端をコメント・アウトする」か、
どちらかの方策をとることになり、入力者の負担は、軽減されることなく、
むしろ重くなってしまうでしょう。

「ブレース直後の行端は、空白に変換される」という挙動の方が自分にとっても
わかりやすく、今後の入門者にとっても習得しやすくて望ましい、というのが
個人的な見解です。
        ※  カテゴリー・コードを変更して、ブレースをコントロール・ワードに
            使うようなケースは「自ら望んで苦労してください」ということで。
帯田 木偶太 への返信

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

- aminophen の投稿
> こういう位置に行端が入り得るような記述スタイルを取り入れているケースでは、
> コンパクト・ディスクは、\textbf{CD}
> と略称される。
> という記述もなされ得るところ、こちらの行端はコメント・アウトする必要が
> あることになります。

これについては,
「和欧文間空白を,pTeX が自動挿入する xkanjiskip に頼るか,自分でスペースを入れるか」
という流儀によっても「コメントアウトが必要かどうか」が変わってきます。
マークアップとして個人的には前者(xkanjiskip に頼る)が良いとは思いますが,
仮に後者(自分でスペースを入れる)のユーザがいれば「コメントアウト不要」となり,
結果的に「一律に行端はコメントアウトしない」という考え方がありえます。

組版結果だけを見たとき,和欧文間にある空白が xkanjiskip なのかスペースなのかは
判別しづらい場合が多いと思います。
仮に仰るように挙動を変えれば,今度は和文間に突然空白が入るようになるので,
(通常 kanjiskip はゼロになることが多いでしょう)
困る人が一定数出るのではないかと思います。

なので,私自身は中立の立場です。
(挙動を変えるべきだとまでは思わないが,違和感がないというわけでもない)
帯田 木偶太 への返信

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

- 北川 弘典 の投稿
> 「仕様」かどうかはともかくとして、「意図された挙動」だと
> お二方とも考えておられるようですが、私にはどうもそうでないように思えます。

昔(アスキー日本語TeX 2.99-j1.7)のソースを眺めてみましたが,
なんだか中途半端です.

開きブレース関連の該当部分のソースを見ますと

mid_line+left_brace,mid_kanji+left_brace: incr(align_state);
skip_blanks+left_brace,new_line+left_brace: begin
  state:=mid_line; incr(align_state);
  end;

のようになっています(mid_line は欧文文字の直後,mid_kanji は
和文文字の直後の状態です).閉じブレースの場合も同様です.
・「和字の後の開きブレースの後の改行からでも空白が入る」という挙動は
 「,mid_kanji+left_brace」を1行後ろにずらすだけで実現できるので,
 単純な見落としではないように思えてきます.
・ひょっとしたら「ブレースはグループ境界を示すことが役割」を重視し,
         これは\textbf{日本語}
         の文章です。あっちは\textbf{CD}
         です。
 からマークアップを取った
         これは日本語
         の文章です。あっちはCD
         です。
 とでは空白の入り方が同じになるようにしたかった?

一方,(07a) の挙動は

「\あ{⏎」と「あ{⏎」で行端由来の空白が入るか異なる(⏎ は改行)

という点で規則を複雑化させているように感じます.なんとなく日本語
対応に伴う TeX82 からの変更量を減らしたかったという気持ちが見えて
きます.