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コマンドの後にスペースが正しく入るようにするよい用法がありましたら教えてください。
よろしくお願いします。
> あ\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 ではうまくいかないようです.
入らない理由について説明します.
\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 ではうまくいかないようです.
挙動を変えていいのかわかりませんが,とりあえずパッチのたたき台です.
・\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 あ」のような出力になります.
・\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 あ」のような出力になります.