Re: 数式内におけるカッコ前後の空白の処理

名前: 藤田
日時: 2009-10-01 10:41:00
IPアドレス: 61.124.97.*

>>53772 \documentclass[a4j]{jarticle} \title{微分演算子の出力について} \date{2009/10/01} \begin{document} \maketitle 藤田\@湘南情報数理化学研究所です. Doraさんの解の出力と結果的にほぼ同じことになるのですが,{.}さんの 53764の補足を兼ねて基本的なところから考えてみました. \section{まず周辺情報} 微分演算子の前のアキについては,Knuthの\TeX{}book Chapter 18 p.\ 168に 記述があり,「\TeX{}がすべてを自動的にやってくれるわけではなく, \begin{quote} \verb/$\int_0^\infty f(x)\,dx$/ \qquad $\int_0^\infty f(x)\,dx$ \end{quote} のように,手動でthin space\verb/\,/を挿入する必要がある」としています. これが\TeX{}の仕様ですので,「熟練のタイピストが\verb/\,/を手動で挿入 する」のは,\TeX{}bookに則った「純正の」やり方という結論になるわけです. しかし,これでは身も蓋もありませんので,皆さんの議論に触発されて, 「一体どうなっているのだろう」という詮索をしてみました. \section{原因の調査} 53761のShizuさんが指摘された二つの場合のアキの違いは, \verb/\left/と\verb/\right/を使うと, \verb/\mathinner/の扱いになるためだと推測されます.これを確かめるためには, 次のように,\verb/\mathinner{f(x)}/とすればよく,実際に$f(x)$と $dx$の間が開きます. \verb/\mathclose/と\verb/\mathinner/の違い mathclose--mathord vs.\ mathinner--mathord: \[\int_{0}^{1}f(x)dx\] \[\int_{0}^{1}\mathinner{f(x)}dx\] \verb/\mathclose/と\verb/\mathinner/の違い mathclose--mathord vs.\ mathinner--mathord: \[\int_{0}^{1}\{f(x)+g(x)\}dx\] \[\int_{0}^{1}\left\{f(x)+g(x)\right\}dx\] 最後のものと次の2例は同じ: \[\int_{0}^{1}\mathinner{\left\{f(x)+g(x)\right\}}dx\] \[\int_{0}^{1}\mathinner{\{f(x)+g(x)\}}dx\] 要するに,狭いアキの(実際にはアキのない)ものが,\TeX{}における mathclose--mathordの場合の標準値に設定されているということです. これを一律に広げるのは,mathclose--mathordの間隔のすべてを結果的に mathinner--mathordに変更することになるので,ほかに悪影響がでる可能性が あります.したがって,数式モードのパラメーターを 変更して対処するのは,やらない方がよいとおもいます. \TeX{}book (Chapter 18 p.\ 168)でさえ,手動で補正しろといっている くらいですから(後述の「つけたり」参照). \section{対処法} \verb/\,/を挿入する以外の個別的な対処法ですが,とりあえず 次のようなものを考えました. \begin{enumerate} \item 個別に\verb/\mathinner{f(x)}/として対処する方法.これは,原因調査のところ での述べたことの応用です.手間を考えると\verb/\,/の挿入よりもとくに すぐれているわけではありません. \item 次のように\verb/\diff/を定義して使用する方法. \begin{verbatim} \def\diff{\mathop{d\!}{}} または, \def\diff{\mathop{d\!}\mathstrut} \end{verbatim} \def\diff{\mathop{d\!}{}} %\def\diff{\mathop{d\!}\mathstrut} 使用例: \[\int_{0}^{1}f(x)\diff x\] \[\int_{0}^{1}\{f(x)+g(x)\}\diff x\] \[\int_{0}^{1}\left\{f(x)+g(x)\right\}\diff x\] なお,定義末尾の\verb/{}/または\verb/\mathstrut/は,次に括弧類が きたときの補正です.この補正で,\verb/$\diff($/と入力したとき, $\diff($となります. \TeX{}では,mathclose--mathopのアキとmathinner--mathopのアキとは同じ thin space (\verb/\,/ 3mu)に設定されていますので, 53761のShizuさん所望 のことが実現できています. ついでに,\TeX{}book p.\ 169末尾にある例 $$\int\!\!\!\int_{D} dx\,dy$$ \noindent は,\verb/\diff/を使うと次のようになります. \[\int\!\!\!\int_{D} \diff x\diff y\] 53772のDoraさんの方法だと, \newcommand{\dd}[1]{\mathclose{\,}d#1} \verb/$(\dd{x})$/と入力した場合 $(\dd{x})$と出力され,開きの括弧と微分演算子の間に アキがはいってしまいます (\verb/\d/は再定義しないほうがよいので\verb/\dd/に変更しました). 上記の\verb/\diff/を使い\verb/$(\diff x)$/と入力すると, $(\diff x)$となってアキははいりません. \item 私が推奨するのは,次のように定義した\verb/\Diff/を使う方法です. 微分演算子を立体(ローマン体)に変更します. \begin{verbatim} \def\Diff{\mathop{\mathrm{d}\!}{}} または, \def\Diff{\mathop{\mathrm{d}\!}\mathstrut} \end{verbatim} \def\Diff{\mathop{\mathrm{d}\!}{}} %\def\Diff{\mathop{\mathrm{d}\!}\mathstrut} 使用例: \[\int_{0}^{1}f(x)\Diff x\] \[\int_{0}^{1}\{f(x)+g(x)\}\Diff x\] \[\int_{0}^{1}\left\{f(x)+g(x)\right\}\Diff x\] 数学では,慣用的に,$dx$が使われています.しかしながら,数学でも イタリック体は変数をあらわすことになっています.杓子定規にいえば, 微分記号dは変数ではないので,立体(ローマン体) $\mathrm{d}x$で あらわすのが正式です.物理・化学の分野では,IUPACの規約等で, $\mathrm{d}x$が標準と決められています.この際ですから,\verb/\Diff/で 出力されるような立体を使いませんか! \end{enumerate} \section{つけたり} \TeX{}では,\verb/\mathop/は, たとえば,\verb/\def\lim{\mathop{\rm lim}}/のように, 立体欧字記号(演算子)を定義するのに使われています. \verb/$a\lim b$/とすると$a\lim b$と出力される ことでわかるように,前後にアキが挿入されます. \TeX{}の演算子は,「前後にアキがある記号」という 仕様になっていることになります. 微分演算子は,この範疇にはいらないわけで, より組織的に考えるなら, 演算子として,「両側にアキのあるもの」(Op)と 「前だけにアキがあり,うしろはアキがないもの」に 分類する必要があります.後者に対する対処が \TeX{}そのものには備わっていないということになります. 従来の数式要素(アトム) Opとは別に,後者をSOp (semioperator: わたしの 勝手な造語)という数式要素として別立てにするのが, 正式だと思いますが,これは,\TeX{}の数式モードの 大幅な変更ということになります. なまなかな覚悟では,ちょっと手がでませんね. \end{document}

この書き込みへの返事:

お名前
題名 
メッセージ(タグは <a href="...">...</a> だけ使えます。適宜改行を入れてください)