¿Hay alguna manera de destruir automáticamente todas las matemáticas en línea (pero solo verticalmente)?

¿Hay alguna manera de destruir automáticamente todas las matemáticas en línea (pero solo verticalmente)?

Lo que dice en la lata.

En caso de que no esté lo suficientemente claro, lo que me gustaría es que $...$se escriba como \smash{$...$}, excepto que \smashtambién afecta el espaciado horizontal (consulte la pregunta que vinculé a continuación) y me gustaría que solo afectara el espaciado vertical.

En otras palabras, me gustaría algún código de preámbulo que haga dos cosas:

  1. Hacer que \smashsólo afecte el espaciado vertical.
  2. Trate todas las instancias de $...$como \smash{$...$}.

(Esta preguntasolicita muy específicamente la destrucción vertical y horizontal de las matemáticas en línea, por lo que la mía no es un duplicado).

Respuesta1

De forma predeterminada, el ejemplo mostrado se ajustará al interlineado, por lo que no \smashes necesario.

\documentclass{article}
\showoutput
\showboxdepth=3
\begin{document}
aaa bbb ccc ddd ee $\vec{E}=\vec{E}_0\,e^{ikz}$
aaa bbb ccc ddd ee $\vec{E}=\vec{E}_0\,e^{ikz}$
aaa bbb ccc ddd ee $\vec{E}=\vec{E}_0\,e^{ikz}$
aaa bbb ccc ddd ee $\vec{E}=\vec{E}_0\,e^{ikz}$
aaa bbb ccc ddd ee $\vec{E}=\vec{E}_0\,e^{ikz}$
aaa bbb ccc ddd ee $\vec{E}=\vec{E}_0\,e^{ikz}$
aaa bbb ccc ddd ee $\vec{E}=\vec{E}_0\,e^{ikz}$
\end{document}

produce

ingrese la descripción de la imagen aquí

y el registro confirma \baselineskip(en lugar de \lineskip).

...\hbox(9.67221+1.49998)x345.0, glue set 0.34198 []
...\penalty 150
...\glue(\baselineskip) 0.8278
...\hbox(9.67221+1.49998)x345.0, glue set 0.45447 []
...\penalty 150
...\glue(\baselineskip) 0.8278
...\hbox(9.67221+1.49998)x345.0, glue set 9.86978fil []

Para una expresión más grande

\documentclass{article}
\showoutput
\showboxdepth=3
\begin{document}
aaa bbb ccc ddd ee $\frac{X^2}{Y_3}=\frac{X^2}{Y_3}_0\,e^{ikz}$
aaa bbb ccc ddd ee $\frac{X^2}{Y_3}=\frac{X^2}{Y_3}_0\,e^{ikz}$
aaa bbb ccc ddd ee $\frac{X^2}{Y_3}=\frac{X^2}{Y_3}_0\,e^{ikz}$
aaa bbb ccc ddd ee $\frac{X^2}{Y_3}=\frac{X^2}{Y_3}_0\,e^{ikz}$
aaa bbb ccc ddd ee $\frac{X^2}{Y_3}=\frac{X^2}{Y_3}_0\,e^{ikz}$
aaa bbb ccc ddd ee $\frac{X^2}{Y_3}=\frac{X^2}{Y_3}_0\,e^{ikz}$
aaa bbb ccc ddd ee $\frac{X^2}{Y_3}=\frac{X^2}{Y_3}_0\,e^{ikz}$
\end{document}

Usted obtiene

ingrese la descripción de la imagen aquí

y el registro confirma que TeX dejó de usar \baselineskip:

...\hbox(10.17732+4.9484)x345.0, glue set 0.26582 []
...\penalty 150
...\glue(\lineskip) 1.0
...\hbox(10.17732+4.9484)x345.0, glue set 0.15062 []
...\glue(\lineskip) 1.0
...\hbox(10.17732+4.9484)x345.0, glue set 0.28621 []
...\penalty 150
...\glue(\lineskip) 1.0
...\hbox(10.17732+4.9484)x345.0, glue set 282.19075fil []

Puede configurarlo \lineskiplimitpara que se conserve el espacio de la línea base incluso si las líneas no encajan:

\documentclass{article}
\showoutput
\showboxdepth=3
\setlength\lineskiplimit{-\maxdimen}
\begin{document}
aaa bbb ccc ddd ee $\frac{X^2}{Y_3}=\frac{X^2}{Y_3}_0\,e^{ikz}$
aaa bbb ccc ddd ee $\frac{X^2}{Y_3}=\frac{X^2}{Y_3}_0\,e^{ikz}$
aaa bbb ccc ddd ee $\frac{X^2}{Y_3}=\frac{X^2}{Y_3}_0\,e^{ikz}$
aaa bbb ccc ddd ee $\frac{X^2}{Y_3}=\frac{X^2}{Y_3}_0\,e^{ikz}$
aaa bbb ccc ddd ee $\frac{X^2}{Y_3}=\frac{X^2}{Y_3}_0\,e^{ikz}$
aaa bbb ccc ddd ee $\frac{X^2}{Y_3}=\frac{X^2}{Y_3}_0\,e^{ikz}$
aaa bbb ccc ddd ee $\frac{X^2}{Y_3}=\frac{X^2}{Y_3}_0\,e^{ikz}$
\end{document}

Esto produce

ingrese la descripción de la imagen aquí

y registrar

...\hbox(10.17732+4.9484)x345.0, glue set 0.26582 []
...\penalty 150
...\glue(\baselineskip) -3.12572
...\hbox(10.17732+4.9484)x345.0, glue set 0.15062 []
...\glue(\baselineskip) -3.12572
...\hbox(10.17732+4.9484)x345.0, glue set 0.28621 []
...\penalty 150
...\glue(\baselineskip) -3.12572
...\hbox(10.17732+4.9484)x345.0, glue set 282.19075fil []

Mostrando que el espaciado de la línea de base se conserva incluso si eso fuerza un espacio negativo entre líneas.

Sin embargo, la cura aquí es peor que el problema: el texto ilegible sobreimpreso es tipográficamente peor que el espacio entre líneas desigual.

Este es (creo) el efecto que querías, al pedir que \smashse aplicara en todas partes, pero en la práctica es mejor no hacer esto y simplemente aplicarlo \smashcondicionalmente en lugares donde sabes que no hay sobreimpresión (porque un elemento alto en esta línea no está alineada con un descenso profundo en la línea de arriba para que pueda superponer los cuadros delimitadores sin superponer texto)

Respuesta2

Comentario adicional, provocado por algunos de los comentarios del OP.: Si su documento contiene una gran cantidad de material matemático en línea,¡No es que haya nada malo en eso!- es posible que desees hacerlo de forma preventivaaumentarEl valor de \baselineskip. Si el valor predeterminado de \baselineskipla fuente que emplea es "120% del tamaño de fuente nominal" y si el tamaño de fuente nominal es 10 puntos, puede ejecutar

\fontsize{10}{13}\selectfont

para el documento en su conjunto, a fin de evitar la mayoría, si no casi todos, los casos en los que \lineskipsea necesario aumentar más allá de \baselineskip. Seguramente el caso de \vec{E}forzar un aumento \lineskipya no sería relevante.

La sugerencia de aumentar \baselineskippreventivamente no es en modo alguno arbitraria ni tramposa. Por ejemplo, en el prefacio del libroMatemáticas Concretaspor Graham, Knuth y Patashnik, que (como era de esperar) contienemuchode material matemático en línea, la fuente de texto Concrete Roman (una variante "Egyptienne" de slab-serif de Computer Modern) y la fuente matemática "Euler": los autores discutieron que al aumentar el valor de \baselineskip12pt a 13pt, inmediatamente se deshizo de casi todos los casos de matemáticas en línea que obligaron a un aumento en \lineskip. Si una solución tipográfica basada en consideraciones matemáticas en línea es lo suficientemente buena para Knuth y sus coautores, es posible que desees ver si "funciona" para ti también, ¿verdad?

Por cierto, el \fontsize{10}{13}\selectfontenfoque aumenta el valor de\baselineskip en todos lados, incluso para elementos de documentos, como entornos similares, para los cuales no se necesita ni se desea tabularningún aumento . \baselinskipPara mantener las tablas agradables y compactas, puede elegir, como alternativa a ejecutar \fontsize{10}{13}\selectfont, cargar el setspacepaquete (con la opción nodisplayskipstretch) y emitir la instrucción \setstretch{1.0833}en el preámbulo. Obsérvese que un factor de 1,083 sigue siendo apenas un tercio de lo que \onehalfspacingimplicaría la directiva.


Aquí hay una solución basada en LuaLaTeX. Para activarlo, ejecute \SmashOn; para desactivarlo ejecute \SmashOff. Cuando \SmashOnse ejecuta, la función Lua smashse asigna a la process_input_bufferdevolución de llamada de LuaTeX, donde actúa como un preprocesador en el flujo de entrada, es decir, hace su trabajo.antesTeX inicia su propio procesamiento del material de entrada. Lo "cosa" que hace es reemplazar todas las instancias de $...$, con \smash{$...%}, tal como lo requiera.

Este enfoque tiene (al menos) tres limitaciones, la primera de las cuales debería ser la más relevante en la práctica.

  1. Se supone que el material matemático en línea estodo en una línea-- no se permiten saltos de línea. Sin excepción.

  2. No debe usarlo $$para iniciar y finalizar el modo matemático de visualización. Sin embargo, esto no debería ser una gran limitación, ya que nunca deberías usarlo $$en un documento LaTeX. Ver¿Por qué es \[ ... \]preferible $$ ... $$?para una discusión más extensa sobre este tema.

  3. No se utiliza \$para mostrar símbolos de dólar. Si lo hace, asegúrese de ejecutar \SmashOffantes de las instancias de \$-- y \SmashOnde reactivar la función Lua cuando sea necesario -- o reemplace las instancias de \$con \textdollar.

Dicho esto, no puedo imaginar un caso de uso convincente para querer destruir (verticalmente) todo el material matemático en línea. Si lo necesita, es casi seguro que algo esté haciendo mal. Si tiene instancias de e^{ikz}en modo matemático en línea, considere reemplazarlas con \exp(ikz). Tus lectores te estarán realmente agradecidos si hicieras esto.


ingrese la descripción de la imagen aquí

% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{amsmath}  % for '\dfrac' macro
\usepackage{lipsum}   % filler text
\usepackage{luacode}  % for 'luacode' env.
\begin{luacode}
   function smash ( s )
     return ( s:gsub ( "%b$$" , "\\smash{%1}" ) )
   end
\end{luacode}
\newcommand\SmashOn{\directlua{luatexbase.add_to_callback (
   "process_input_buffer", smash, "smash" )}}
\newcommand\SmashOff{\directlua{luatexbase.remove_from_callback (
   "process_input_buffer", "smash" )}}
  
\begin{document} 
\hrule % draw line to illustrate width of textblock
\lipsum[1][1-5] $\dfrac{\dfrac{v}{v}}{\dfrac{w}{x}}$ \lipsum[1][5-8]
\hrule
\SmashOn % activate the Lua function
\lipsum[1][1-5] $\dfrac{\dfrac{v}{v}}{\dfrac{w}{x}}$ \lipsum[1][5-8]
\hrule
\SmashOff % deactivate the Lua function 
\lipsum[1][1-5] $\dfrac{\dfrac{v}{v}}{\dfrac{w}{x}}$ \lipsum[1][5-8]
\hrule
\end{document}

información relacionada