![Existe uma maneira de destruir automaticamente todas as matemáticas embutidas (mas apenas verticalmente)?](https://rvso.com/image/449635/Existe%20uma%20maneira%20de%20destruir%20automaticamente%20todas%20as%20matem%C3%A1ticas%20embutidas%20(mas%20apenas%20verticalmente)%3F.png)
O que diz na lata.
Caso não esteja claro o suficiente, o que eu gostaria é que $...$
fosse escrito como \smash{$...$}
, exceto que \smash
també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:
- Make
\smash
afeta apenas o espaçamento vertical. - 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
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
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 \lineskiplimit
para 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
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 \smash
ser aplicado em todos os lugares, mas na prática é melhor não fazer isso e apenas aplicar \smash
condicionalmente 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 \baselineskip
da 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 \lineskip
aumento além de \baselineskip
. Com certeza, o caso de \vec{E}
forçar um aumento \lineskip
não seria mais relevante.
A sugestão de aumentar \baselineskip
preventivamente 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 \baselineskip
12pt 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}\selectfont
abordagem aumenta o valor de\baselineskip
em todos os lugares, inclusive para elementos de documentos, como tabular
ambientes semelhantes, para os quais nenhum aumento \baselinskip
pode 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 setspace
pacote (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 \onehalfspacing
directiva implicaria.
Aqui está uma solução baseada em LuaLaTeX. Para ativá-lo, execute \SmashOn
; para desativá-lo, execute \SmashOff
. Quando \SmashOn
executada, 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.
O material matemático embutido é consideradotudo em uma linha-- não são permitidas quebras de linha. Sem exceção.
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.Você não costuma
\$
exibir símbolos de dólar. Se fizer isso, certifique-se de executar\SmashOff
antes da(s) instância(s) de\$
-- e\SmashOn
de 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.
% !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}