Hacer que las matemáticas se comporten como \mathit

Hacer que las matemáticas se comporten como \mathit

A menudo utilizo nombres descriptivos para predicados, términos y funciones. Sin embargo, debido a la falta de interletraje, no se ven bien.

Por ejemplo

$offer = surface \times force(now)$

se representa como

ingrese la descripción de la imagen aquí

Por lo tanto, para evitarlo, utilice \mathit.

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

que se presenta como

ingrese la descripción de la imagen aquí

que, posiblemente, se ve mejor y es más fácil de leer.

Para evitar escribir \mathitm, definí

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

y

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

Preguntas)

¿Es esta la forma "correcta" de hacer esto?

¿Cuáles son las desventajas/inconvenientes de este enfoque? (Puedo usar \mathnormalpara volver al comportamiento estándar, y sé que, por ejemplo, para el producto de fy itengo que usar f{}ipara evitar la ligadura).

Respuesta1

Depende de varios factores. Si tus fórmulas matemáticas sontodoconstruido así, entonces podría estar justificado cambiar los códigos matemáticos de las letras, aunque le recomiendo que no lo haga.

Prefiere un marcado semántico: los identificadores de varias letras denotan variables o funciones; Defina dos comandos, diga \vary \funcescriba su fórmula como

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

(¡no uses \times, por favor!). Ahora tienes la libertad de elegir cualquier representación para variables y funciones que necesites, por ejemplo

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

Cuando su supervisor o el editor de una revista le diga "Bien, pero las funciones deben escribirse en letras verticales", usted responderá "Espera un minuto", cambia la segunda línea a

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

y recompilar. ¿Pasaría lo mismo con el cambio de los códigos matemáticos?

¿Es más difícil escribir? No lo creo, especialmente si eres un experto en Emacs y puedes definir un par de taquigrafías.


Cambiar el código matemático de todas las letras es bastante sencillo, ya que el código es repetitivo. No olvide volver a declarar \mathitcon \DeclareSymbolFontAlphabetpara no desperdiciar una familia de matemáticas.

\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

Los bucles se pueden simplificar con 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

El principal problema que requiere utilizar el \lowercasetruco es que es la única forma de generar un token de carácter conociendo su código de carácter.

Con una versión reciente de expl3(publicada después del 9 de septiembre de 2015), se puede evitar el \lowercasetruco 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}

Respuesta2

La razón por la cual la reasignación global de letras en modo matemático no es una buena idea se mencionó en otra respuesta y comentarios. Pero si realmente necesitas esto, puedes hacer:

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

al inicio del documento. Si necesita mantener los números en estilo romano, puede configurar:

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

Esto significa, por ejemplo:

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

Si está utilizando TeX simple, puede usar \itvariablesel comando que se proporciona después de \input ams-matho \input opmac. Este comando establece códigos matemáticos de todas las letras en la familia matemática de texto en cursiva (por defecto). Por ejemplo:

\input ams-math \itvariables

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

\bye

Respuesta3

Estoy de acuerdo con egreg en que es mucho mejor hacer que el marcado coincida con el significado aquí y marcar cada identificador por separado. El marcado matemático en TeX, así como las fuentes predeterminadas, están diseñados sobre la idea de que las letras adyacentes son variables separadas, generalmente con operadores implícitos de multiplicación o concatenación.

Sin embargo, si no está convencido y desea utilizar de forma predeterminada la fuente de texto en cursiva, no es necesario asignar una nueva fuente matemática para esto, ya está configurada para su uso, \mathitsolo necesita hacer que escape de la agrupación implícita que \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}

información relacionada