数式の前後の四分アキ

数式の前後の四分アキ

- 匿 名 の投稿
返信数: 9
pLaTeXでの数式と和文の間の四分アキに関連して2つ質問があります。

【質問1】
次の文書をpLaTeXでタイプセットすると「4」の前後だけスペースが入りません。

\documentclass{article}
\begin{document}
\xkanjiskip10pt
あ1あ
あ$2$あ
あ\hbox{3}あ
あ\hbox{$4$}あ% ←ここだけスペースが入らない
\end{document}

数式が欧文と同様に扱われるとすると考えると、\hbox{$...$}の前後にもスペースが入るのが自然だと思いますが、入らないのには何か理由があるのでしょうか?
また、\xspcodeなどのコマンドで\hbox{$...$}の前後にスペースが入るように設定を変更する方法がありましたら教えてください。

ptexskip.pdfやアスキーのwebページで調べましたが、この件については見つかりませんでした。

【質問2】
次の現象も質問1の問題が原因だと考えています。
siunitxパッケージの\SIコマンドの後のスペースの問題です。
次の文書をpLaTeXでタイプセットすると、「1 m s-1」の後だけスペースが入りません。

\documentclass{article}
\usepackage{siunitx}
\sisetup{
  detect-family=true,
  detect-weight=true,
  detect-mode=true,
  detect-inline-family=math,
  detect-inline-weight=math,
  detect-display-math=true
}
\begin{document}
\xkanjiskip10pt
あ\SI{1}{\m}あ
あ\SI{1}{\m\per\s}あ
\end{document}

\SIコマンドは単位の指数を\text{$^{\text{-1}}$}のような方法で表示しているようで、\textは内部で\hboxを使用しているので、\hbox{$...$}の問題が\SIの問題の原因ではないかと考えています。
現在、以下のようにして\SIコマンドの後に$\relax$を入れることで対処しています。

\let\originalSI\SI
\renewcommand{\SI}[2]{%
  \ifmmode
    \originalSI{#1}{#2}%
  \else
    \originalSI{#1}{#2}%
    $\relax$%
  \fi
}

この方法には、
- \SIのオプション引数が使用できなくなる、
- \hbox{\SI{...}{...}}のようにすると後のスペースが入らない
という欠点があります。
1つ目の欠点はxparseの\RenewDocumentCommandを使うことで解決できそうですが、2つ目は解決方法がわかりません。
pLaTeXで\SIコマンドの後にスペースが正しく入るようにするよい用法がありましたら教えてください。

よろしくお願いします。
匿 名 への返信

Re: 数式の前後の四分アキ

- 北川 弘典 の投稿
> あ\hbox{$4$}あ% ←ここだけスペースが入らない
入らない理由について説明します.

\hbox{ ... } の周囲に \xkanjiskip が入るかは,
\hbox 内の「最初の文字」「最後の文字」に基づいて決まります.
# ptex-base.ch 内の check_box 関数

例えば,
> \xspcode`\a=0
> \xspcode`\b=3
> あ\hbox{ba}い
では,
・「最初の文字」b の xspcode =3 → \hbox の前に \xkanjiskip 入る
・「最後の文字」a の xspcode =0 → \hbox の後に \xkanjiskip 入らず
となり,「あ baあ」のようになります.

さて,この「最初の文字」「最後の文字」の探索では,
文中数式(の境界)は「文字」として認識されない
挙動になっています(理由はわかりません).例えば
> あ\hbox{$4$}あ
の場合,\hbox の「最初の文字」は null 値となり,結果として
\hbox の直前に \xkanjiskip は入りません.後ろ側も同様です.


ちなみに,文中数式の*直前*に入る \xkanjiskip については,
\xspcode`\0 の値で制御可能です.
直後については,\xspcode ではうまくいかないようです.
北川 弘典 への返信

Re: 数式の前後の四分アキ

- 北川 弘典 の投稿
挙動を変えていいのかわかりませんが,とりあえずパッチのたたき台です.
・\xspcode`\0 の値で文中数式直後の \xkanjiskip 挿入も制御可能に
・\hbox 内の「最初の文字」「最後の文字」として
 文中数式境界としての math_node も可能に.

e-TeX の TeX--XeT 拡張 \beginR ... \endR, \beginL ... \endR の
周囲に \xkanjiskip が入らないという問題がまだ残っています:
(これらは内部では math_node 扱い)
> \TeXXeTstate=1
> % 両方とも \xkanjiskip 入らず
> あ\beginL abc\endL い
> a\beginR あいう\endR b

また,\discretionary まわりの調整もまだ甘いです:
> い\discretionary{\hbox{$q$}}{\hbox{$e$}}{\hbox{$d$}}あ
では,「いd あ」のような出力になります.
北川 弘典 への返信

Re: 数式の前後の四分アキ

- 奥村 晴彦 の投稿
すばらしいです!
私もこの仕様(バグ?)は前から気になっていました。
ぜひptexに取り入れていただければ助かります。
北川 弘典 への返信

Re: 数式の前後の四分アキ

- 匿 名 の投稿
\hbox{$...$}の前後のスペースの問題を解決するためのパッチを作ってくださり、ありがとうございます。

W32TeXではすでにこのパッチが適用されているようですが、TeX LiveではTeX Live 2013が公開されるまでは修正されないのでしょうか?
匿 名 への返信

Re: 数式の前後の四分アキ

- Akira Kakuto の投稿
TeX Live では、フォントやマクロ関係は、毎日更新されますが、
バイナリは1年に1回だけ release 時に更新されます。
ユーザがコンパイルしてテストすることは自由です。
W32TeX は常にテスト版という気持ちなので、気軽に変更して
いますが、時々バグを入れて迷惑をかけています。
できるだけ気をつけます。

 

Akira Kakuto への返信

Re: 数式の前後の四分アキ

- Norbert Preining の投稿
TeX Liveのバイナリは1年に1回だけ更新されますが、バグを見つけて直した後tlptexliveから普通にバイナリを更新が出来ます。

後少し新しいcompile scriptをアップして、新しいバイナリを作ります。
Norbert Preining への返信

Re: 数式の前後の四分アキ

- 匿 名 の投稿
TeX Live 2012にtlptexliveをインストールしたところ、パッチが適用されたpTeXが使えるようになりました。
ありがとうございました。