Existe uma maneira de destruir automaticamente todas as matemáticas embutidas (mas apenas verticalmente)?

Existe uma maneira de destruir automaticamente todas as matemáticas embutidas (mas apenas verticalmente)?

O que diz na lata.

Caso não esteja claro o suficiente, o que eu gostaria é que $...$fosse escrito como \smash{$...$}, exceto que \smashtambém afeta o espaçamento horizontal (veja a pergunta que vinculei abaixo) e gostaria que afetasse apenas o espaçamento vertical.

Em outras palavras, gostaria de algum código de preâmbulo que fizesse duas coisas:

  1. Make \smashafeta apenas o espaçamento vertical.
  2. Trate todas as instâncias de $...$como \smash{$...$}.

(Essa questãosolicita muito especificamente a quebra vertical e horizontal da matemática embutida, então a minha não é uma duplicata dela.)

Responder1

Por padrão, o exemplo mostrado caberá no espaçamento entre linhas, então não \smashé necessário

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

Produz

insira a descrição da imagem aqui

e o log confirma \baselineskip(em vez de \lineskip) é usado.

...\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 uma expressão maior

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

Você consegue

insira a descrição da imagem aqui

e o log confirma que o TeX desistiu 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 []

Você pode definir \lineskiplimitpara que o espaço da linha de base seja preservado mesmo que as linhas não caibam:

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

Isso produz

insira a descrição da imagem aqui

e 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 o espaçamento da linha de base é preservado, mesmo que isso force o espaço negativo entre as linhas.

A cura aqui é pior do que o problema: texto ilegível sobre-impresso é tipograficamente pior do que espaço de linha irregular.

Este é (eu acho) o efeito que você queria, ao pedir para \smashser aplicado em todos os lugares, mas na prática é melhor não fazer isso e apenas aplicar \smashcondicionalmente em lugares onde você sabe que não há impressão excessiva (porque um item alto em esta linha não está alinhada com um descendente profundo na linha acima para que você possa sobrepor as caixas delimitadoras sem sobrepor o texto)

Responder2

Comentário adicional, motivado por alguns comentários do OP: Se o seu documento contiver muito material matemático embutido -não que haja algo de errado com isso!- você pode querer preventivamenteaumentaro valor de \baselineskip. Se o valor padrão \baselineskipda fonte usada for "120% do tamanho nominal da fonte" e se o tamanho nominal da fonte for 10pt, você poderá executar

\fontsize{10}{13}\selectfont

para o documento como um todo, a fim de evitar a maioria, se não quase todos, os casos de \lineskipaumento além de \baselineskip. Com certeza, o caso de \vec{E}forçar um aumento \lineskipnão seria mais relevante.

A sugestão de aumentar \baselineskippreventivamente não é de forma alguma arbitrária ou hackeada. Por exemplo, no prefácio do livroMatemática Concretapor Graham, Knuth e Patashnik - que (sem surpresa) contémbastantede material matemático embutido, a fonte de texto Concrete Roman (uma variante "Egyptienne" da variante com serifa plana do Computer Modern) e a fonte matemática "Euler" - os autores discutiram que, ao aumentar o valor de \baselineskip12pt para 13pt, eles imediatamente livrou-se de quase todos os casos de matemática embutida, forçando um aumento no \lineskip. Se uma solução tipográfica motivada por considerações matemáticas embutidas for boa o suficiente para Knuth e seus coautores, você pode querer ver se ela "funciona" para você também, certo?

Aliás, a \fontsize{10}{13}\selectfontabordagem aumenta o valor de\baselineskip em todos os lugares, inclusive para elementos de documentos, como tabularambientes semelhantes, para os quais nenhum aumento \baselinskippode ser necessário ou desejado. Para manter as tabelas compactas e bonitas, você pode escolher - como alternativa à execução \fontsize{10}{13}\selectfont- carregar o setspacepacote (com a opção nodisplayskipstretch) e emitir a instrução \setstretch{1.0833}no preâmbulo. Note-se que um factor de 1,083 ainda representa apenas um terço do que a \onehalfspacingdirectiva implicaria.


Aqui está uma solução baseada em LuaLaTeX. Para ativá-lo, execute \SmashOn; para desativá-lo, execute \SmashOff. Quando \SmashOnexecutada, a função Lua smashé atribuída ao callback do LuaTeX process_input_buffer, onde ela atua como um pré-processador no fluxo de entrada, ou seja, ela faz seu trabalhoantesO TeX inicia seu próprio processamento do material de entrada. A "coisa" que ele faz é substituir todas as instâncias de $...$, por \smash{$...%}, exatamente como você precisa.

Existem (pelo menos) três limitações a esta abordagem, a primeira das quais deve ser a mais relevante na prática.

  1. O material matemático embutido é consideradotudo em uma linha-- não são permitidas quebras de linha. Sem exceção.

  2. Você não deve usar $$para iniciar e encerrar o modo matemático de exibição. Isso não deve ser uma grande restrição, já que você nunca deve usar $$em um documento LaTeX. VerPor que é \[ ... \]preferível $$ ... $$?para uma discussão mais longa sobre este assunto.

  3. Você não costuma \$exibir símbolos de dólar. Se fizer isso, certifique-se de executar \SmashOffantes da(s) instância(s) de \$-- e \SmashOnde reativar a função Lua se e quando necessário -- ou substitua as instâncias de \$por \textdollar.

Dito isto, não consigo imaginar um caso de uso convincente para querer destruir (verticalmente) todo o material matemático embutido. Se você precisar, é quase certo que você está fazendo algo errado. Se você tiver instâncias e^{ikz}no modo matemático embutido, considere substituí-las por \exp(ikz). Seus leitores ficarão realmente gratos por você se você fizer isso.


insira a descrição da imagem aqui

% !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}

informação relacionada