Fazendo a matemática se comportar como \mathit

Fazendo a matemática se comportar como \mathit

Costumo usar nomes descritivos para predicados, termos e funções. No entanto, devido à falta de kerning, eles não parecem bonitos.

Por exemplo

$offer = surface \times force(now)$

renderiza como

insira a descrição da imagem aqui

Assim, para evitá-lo, use \mathit.

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

que renderiza como

insira a descrição da imagem aqui

que, sem dúvida, parece melhor e é mais fácil de ler.

Para evitar digitar \mathitm, defini

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

e

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

Questões)

Esta é a maneira "correta" de fazer isso?

Quais são as desvantagens/desvantagens desta abordagem? (Posso usar \mathnormalpara voltar ao comportamento padrão, e sei disso, por exemplo, para o produto de fe itenho que usar f{}ipara evitar a ligadura).

Responder1

Depende de vários fatores. Se suas fórmulas matemáticas foremtodosconstruído dessa forma, então você pode ter justificativa para alterar os códigos matemáticos das letras, embora eu recomende que você não faça isso.

Prefira uma marcação semântica: identificadores multiletras denotam variáveis ​​ou funções; defina dois comandos, diga \vare \funcdigite sua fórmula como

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

(não use \times, por favor!). Agora você tem a liberdade de escolher qualquer representação para variáveis ​​e funções que precisar, por exemplo

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

Quando seu supervisor ou editor de periódico lhe disser “Legal, mas as funções devem ser escritas em letras verticais”, você responderá “Espere um minuto”, mude a segunda linha para

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

e recompilar. Seria o mesmo com a mudança nos códigos matemáticos?

É mais difícil digitar? Acho que não, principalmente se você for um especialista em Emacs capaz de definir alguns atalhos.


Alterar o código matemático de todas as letras é bastante fácil, pois o código é repetitivo. Não esqueça de declarar novamente \mathitcom \DeclareSymbolFontAlphabetpara não desperdiçar uma família matemática.

\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

Os loops podem ser simplificados com 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

O principal problema, que exige o uso do \lowercasetruque, é que ele é a única maneira de gerar um token de caractere conhecendo seu código de caractere.

Com uma versão recente expl3(lançada após 09/09/2015), pode-se evitar o \lowercasetruque usando \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}

Responder2

A razão pela qual a reatribuição global das letras no modo matemático não é uma boa ideia foi mencionada em outra resposta e comentários. Mas se você realmente precisa disso, você pode fazer:

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

no início do documento. Se precisar manter os números no estilo romano, você pode definir:

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

Isto significa, por exemplo:

\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}

Se você estiver usando TeX simples, poderá usar \itvariableso comando fornecido após \input ams-mathou \input opmac. Este comando define os códigos matemáticos de todas as letras para a família matemática do texto em itálico (como padrão). Por exemplo:

\input ams-math \itvariables

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

\bye

Responder3

Eu concordaria com egreg que é muito melhor fazer com que a marcação corresponda ao significado aqui e marcar cada identificador separadamente. A marcação matemática no TeX, assim como as fontes padrão, são projetadas com base na ideia de que letras adjacentes são variáveis ​​separadas, normalmente com multiplicação implícita ou operadores de concatenação.

No entanto, se você não está convencido e deseja usar como padrão a fonte do texto em itálico, não há necessidade de alocar uma nova fonte matemática para isso, ela já está configurada para uso, \mathitbastando fazê-la escapar do agrupamento implícito que isso \mathit implica.

\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}

informação relacionada