Я часто использую описательные имена для предикатов, терминов и функций. Однако из-за отсутствия кернинга они выглядят некрасиво.
Например
$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
Это зависит от нескольких факторов. Если ваши математические формулывсеЕсли вы построили его таким образом, то, возможно, имеет смысл изменить математические коды букв, хотя я рекомендую вам этого не делать.
Предпочитайте семантическую разметку: многобуквенные идентификаторы обозначают либо переменные, либо функции; определите две команды, скажем, \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}