私は述語、用語、関数に説明的な名前をよく使用します。しかし、カーニングが不足しているため、見た目がよくありません。
例えば
$offer = surface \times force(now)$
としてレンダリングされます
したがって、これを回避するには を使用します\mathit
。
$\mathit{offer = surface \times force(now)}$
これは次のように表示されます
おそらく、見た目も良くなり、読みやすくなります。
\mathit
mと入力するのを避けるために、私は定義しました
\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}