Заставить математику вести себя как \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

Это зависит от нескольких факторов. Если ваши математические формулывсеЕсли вы построили его таким образом, то, возможно, имеет смысл изменить математические коды букв, хотя я рекомендую вам этого не делать.

Предпочитайте семантическую разметку: многобуквенные идентификаторы обозначают либо переменные, либо функции; определите две команды, скажем, \varи, \funcи введите формулу как

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

(не используйте \times, пожалуйста!). Теперь у вас есть свобода выбора любого представления для переменных и функций, которое вам нужно, например

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

Когда ваш руководитель или редактор журнала скажет вам: «Хорошо, но функции должны быть набраны прямыми буквами», вы ответите: «Подождите минутку», измените вторую строку на

\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трюка, заключается в том, что это единственный способ сгенерировать токен символа, зная его код символа.

В последней версии expl3(выпущенной после 9 сентября 2015 г.) можно обойти этот \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}

Связанный контент