数学を\mathitのように動作させる

数学を\mathitのように動作させる

私は述語、用語、関数に説明的な名前をよく使用します。しかし、カーニングが不足しているため、見た目がよくありません。

例えば

$offer = surface \times force(now)$

としてレンダリングされます

ここに画像の説明を入力してください

したがって、これを回避するには を使用します\mathit

$\mathit{offer = surface \times force(now)}$

これは次のように表示されます

ここに画像の説明を入力してください

おそらく、見た目も良くなり、読みやすくなります。

\mathitmと入力するのを避けるために、私は定義しました

\DeclareSymbolFont{italics}{\encodingdefault}{\rmdefault}{m}{it}

そして

\DeclareMathSymbol{a}{\mathalpha}{italics}{`a}
...
\DeclareMathSymbol{z}{\mathalpha}{italics}{`z}
\DeclareMathSymbol{A}{\mathalpha}{italics}{`A}
...
\DeclareMathSymbol{z}{\mathalpha}{italics}{`Z}

質問

これは「適切な」やり方でしょうか?

このアプローチの短所/欠点は何ですか? ( を使用して\mathnormal標準の動作に戻ることができます。また、たとえば、fとの積の場合、合字を防ぐためにiを使用する必要があることはわかっていますf{}i)。

答え1

それはいくつかの要因に依存します。数式が全てそのように構築されている場合、文字の数学コードを変更することが正当化される可能性がありますが、そうしないことをお勧めします。

セマンティックマークアップを優先します。複数文字の識別子は変数または関数のいずれかを表します。2つのコマンド(と)を定義し、\var\funcのように数式を入力します。

\[
\var{offer}=\var{surface}\cdot\func{force}(\var{now})
\]

( は使わない\timesでください!)。これで、変数や関数の表現を自由に選択できるようになりました。たとえば、

\newcommand{\var}[1]{\mathit{#1}}
\newcommand{\func}[1]{\mathit{#1}}

上司やジャーナルの校正者が「いいけど、関数は縦書きにすべき」と言ったら、「ちょっと待って」と答えて、2行目を次のように変更します。

\newcommand{\func}[1]{\mathrm{#1}}

再コンパイルします。数学コードを変更しても同じでしょうか?

入力が難しくなりましたか? 特に、いくつかの省略形を定義できる Emacs の専門家であれば、そうは思いません。


すべての文字の数学コードを変更するのは、コードが反復的であるため非常に簡単です。数学ファミリーを無駄にしないように、\mathitで再宣言することを忘れないでください。\DeclareSymbolFontAlphabet

\DeclareSymbolFont{italics}{\encodingdefault}{\rmdefault}{m}{it}
\DeclareSymbolFontAlphabet{\mathit}{italics}

\makeatletter
\count@=`a \advance\count@\m@ne
\@whilenum{\count@<`z}\do{%
  \advance\count@\@ne
  \begingroup\lccode`A=\count@
  \lowercase{\endgroup
    \DeclareMathSymbol{A}{\mathalpha}{italics}{`A}%
  }%
}
\count@=`A \advance\count@\m@ne
\@whilenum{\count@<`Z}\do{%
  \advance\count@\@ne
  \begingroup\lccode`A=\count@
  \lowercase{\endgroup
    \DeclareMathSymbol{A}{\mathalpha}{italics}{`A}%
  }%
}
\makeatother

ループは次のように簡略化できますexpl3

\usepackage{expl3}

\DeclareSymbolFont{italics}{\encodingdefault}{\rmdefault}{m}{it}
\DeclareSymbolFontAlphabet{\mathit}{italics}

\ExplSyntaxOn
\int_step_inline:nnnn { `A } { 1 } { `Z }
 {
  \group_begin:
  \char_set_lccode:nn { `A } { #1 }
  \char_set_lccode:nn { `B } { #1 + 32 }
  \tl_to_lowercase:n
   {
    \group_end:
    \DeclareMathSymbol{A}{\mathalpha}{italics}{`A}
    \DeclareMathSymbol{B}{\mathalpha}{italics}{`B}
   }
 }
\ExplSyntaxOff

このトリックを使用する必要がある主な問題は、\lowercase文字コードがわかっている場合に文字トークンを生成する唯一の方法であるということです。

の最新バージョン (2015-09-09 以降にリリース) では、を使用してこのトリックをexpl3回避できます。\lowercase\char_generate:nn

\documentclass{article}
\usepackage{expl3}

\DeclareSymbolFont{italics}{\encodingdefault}{\rmdefault}{m}{it}
\DeclareSymbolFontAlphabet{\mathit}{italics}

\ExplSyntaxOn
\int_step_inline:nnnn { `A } { 1 } { `Z }
 {
  \exp_args:Nf \DeclareMathSymbol{\char_generate:nn{#1}{11}}{\mathalpha}{italics}{#1}
 }
\int_step_inline:nnnn { `a } { 1 } { `z }
 {
  \exp_args:Nf \DeclareMathSymbol{\char_generate:nn{#1}{11}}{\mathalpha}{italics}{#1}
 }
\ExplSyntaxOff

\begin{document}

\[
offer=surface\cdot force(now)
\]

\end{document}

答え2

数式モードで文字をグローバルに再割り当てすることが良い考えではない理由は、別の回答とコメントで説明されています。ただし、これが本当に必要な場合は、次の操作を実行できます。

\everymath{\it}\everydisplay{\it}

文書の先頭に、ローマ数字のスタイルを維持する必要がある場合は、次のように設定します。

\def\mathcodes#1{\mathcode`#1=\numexpr\mathcode`#1-"7000\relax 
   \ifx#10\else\expandafter\mathcodes\fi}
\mathcodes1234567890

これは、例えば次のことを意味します。

\documentclass[12pt]{article}
\everymath{\it}\everydisplay{\it}
\def\mathcodes#1{\mathcode`#1=\numexpr\mathcode`#1-"7000\relax 
   \ifx#10\else\expandafter\mathcodes\fi}
\mathcodes1234567890
\begin{document}

$offer = surface \times force(now) + 1$

\end{document}

プレーン TeX を使用している場合は、または の\itvariables後に提供されるコマンドを使用できます。このコマンドは、すべての文字の数式コードをテキスト斜体数式ファミリ (デフォルト) に設定します。例:\input ams-math\input opmac

\input ams-math \itvariables

$offer = surface \times force(now) + 2$

\bye

答え3

私は、マークアップをここでの意味に一致させて、各識別子を個別にマークアップする方がはるかに良いという egreg の意見に同意します。TeX の数式マークアップとデフォルトのフォントは、隣接する文字が別々の変数であり、通常は暗黙の乗算演算子または連結演算子を持つという考えに基づいて設計されています。

ただし、納得できず、デフォルトでテキストの斜体フォントを使用したい場合は、新しい数式フォントを割り当てる必要はありません。すでに使用できるように設定されているので、\mathit暗黙のグループ化を回避するだけで済みます\mathit

\documentclass{article}


\let\v\mathit
\begin{document}


$\mathit{offer = surface \times force(now)}$



$\v{offer} = \v{surface} \times \v{force}(\v{now})$%%%USE THIS

\everymath{\mathit{\xdef\tmp{\fam\the\fam\relax}}\tmp}


$offer = surface \times force(now)$

\end{document}

関連情報