![Gibt es eine Möglichkeit, alle Inline-Mathematikfunktionen automatisch zu zerstören (aber nur vertikal)?](https://rvso.com/image/449635/Gibt%20es%20eine%20M%C3%B6glichkeit%2C%20alle%20Inline-Mathematikfunktionen%20automatisch%20zu%20zerst%C3%B6ren%20(aber%20nur%20vertikal)%3F.png)
Was auf der Dose steht.
Falls es nicht klar genug ist: Ich möchte, dass for $...$
als gesetzt wird \smash{$...$}
, außer dass \smash
sich dies auch auf den horizontalen Abstand auswirkt (siehe die Frage, auf die ich unten verlinkt habe), und ich möchte, dass es sich nur auf den vertikalen Abstand auswirkt.
Mit anderen Worten, ich hätte gerne einen Präambelcode, der zwei Dinge tut:
- Beeinflusst
\smash
nur den vertikalen Abstand. - Behandeln Sie alle Instanzen von
$...$
als\smash{$...$}
.
(Diese Fragefordert ganz konkret sowohl vertikales als auch horizontales Zerschlagen von Inline-Mathematik, also ist meine kein Duplikat davon.)
Antwort1
Standardmäßig passt das angezeigte Beispiel in den Zeilenabstand, daher \smash
ist kein
\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}
Produziert
und das Protokoll bestätigt, \baselineskip
dass (anstatt \lineskip
) verwendet wird.
...\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 []
Für einen größeren Ausdruck
\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}
Du erhältst
und das Protokoll bestätigt, dass TeX die Verwendung von aufgegeben hat \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 []
Sie können einstellen \lineskiplimit
, dass der Grundlinienabstand auch dann erhalten bleibt, wenn die Zeilen nicht passen:
\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}
Dadurch entsteht
und log
...\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 []
Zeigt, dass der Grundlinienabstand erhalten bleibt, auch wenn dadurch ein negativer Abstand zwischen den Zeilen entsteht.
Die Lösung ist hier allerdings schlimmer als das Problem, denn übergedruckter, unleserlicher Text ist typografisch schlimmer als ein ungleichmäßiger Zeilenabstand.
Dies ist (glaube ich) der Effekt, den Sie wollten, indem Sie darum baten, ihn \smash
überall anzuwenden, aber in der Praxis ist es besser, dies nicht zu tun und ihn nur \smash
bedingt an Stellen anzuwenden, an denen Sie wissen, dass kein Überdruck erfolgt (weil ein hohes Element in dieser Zeile nicht mit einem tiefen Unterlängenelement in der Zeile darüber ausgerichtet ist, sodass Sie die Begrenzungsrahmen überlappen können, ohne den Text zu überlappen).
Antwort2
Zusätzlicher Kommentar, angeregt durch einige Kommentare des OP: Wenn Ihr Dokument viel Inline-Mathematikmaterial enthält -nicht, dass daran irgendetwas falsch wäre!-- Sie möchten vielleicht präventivZunahmeder Wert von \baselineskip
. Wenn der Standardwert von \baselineskip
für die von Ihnen verwendete Schriftart "120% der nominalen Schriftgröße" ist und die nominale Schriftgröße 10pt beträgt, können Sie ausführen
\fontsize{10}{13}\selectfont
für das gesamte Dokument, um die meisten, wenn nicht fast alle Fälle zu vermeiden, in denen \lineskip
über erhöht werden muss . Der Fall, in dem eine Erhöhung von erzwungen wird, wäre \baselineskip
sicherlich nicht mehr relevant.\vec{E}
\lineskip
Der Vorschlag, \baselineskip
präventiv zu erhöhen, ist keineswegs willkürlich oder taktlos. So heißt es im Vorwort des BuchesKonkrete Mathematikvon Graham, Knuth und Patashnik -- das (wenig überraschend) enthälteine Mengevon Inline-Mathematikmaterial, der Textschriftart Concrete Roman (eine „Egyptienne“ der Slab-Serif-Variante von Computer Modern) und der Mathematikschriftart „Euler“ – die Autoren diskutierten, dass \baselineskip
sie durch die Erhöhung des Wertes von von 12pt auf 13pt sofort fast alle Fälle von Inline-Mathematik beseitigten, die eine Erhöhung von erzwangen \lineskip
. Wenn eine typografische Lösung, die durch Überlegungen zur Inline-Mathematik angeregt wurde, für Knuth und seine Co-Autoren gut genug ist, möchten Sie vielleicht sehen, ob sie auch für Sie „funktioniert“, oder?
Übrigens \fontsize{10}{13}\selectfont
erhöht dieser Ansatz den Wert von\baselineskip
überall, einschließlich für Dokumentelemente wie tabular
-ähnliche Umgebungen, für die \baselinskip
möglicherweise keine Erhöhung von erforderlich oder erwünscht ist. Um Tabellen schön kompakt zu halten, können Sie – als Alternative zum Ausführen – das Paket \fontsize{10}{13}\selectfont
laden (mit der Option ) und die Anweisung in der Präambel ausgeben. Beachten Sie, dass ein Faktor von 1,083 immer noch kaum ein Drittel dessen ist, was die Direktive bedeuten würde.setspace
nodisplayskipstretch
\setstretch{1.0833}
\onehalfspacing
Hier ist eine LuaLaTeX-basierte Lösung. Um sie zu aktivieren, führen Sie „execute“ aus \SmashOn
; um sie zu deaktivieren, führen Sie „execute“ aus \SmashOff
. Wenn „ \SmashOn
execute“ ausgeführt wird, smash
wird die Lua-Funktion dem process_input_buffer
Callback von LuaTeX zugewiesen, wo sie als Präprozessor für den Eingabestrom fungiert, d. h. sie erledigt ihre ArbeitVorTeX beginnt mit der eigenen Verarbeitung des Eingabematerials. Dabei ersetzt es alle Vorkommen von $...$
, durch \smash{$...%}
, ganz wie Sie es wünschen.
Dieser Ansatz weist (mindestens) drei Einschränkungen auf, von denen die erste in der Praxis die relevanteste sein dürfte.
Das Inline-Mathematerial wird alsalles in einer Zeile-- keine Zeilenumbrüche erlaubt. Keine Ausnahme.
Sie dürfen nicht verwenden,
$$
um den Anzeigemathematikmodus zu starten und zu beenden. Dies sollte jedoch keine große Einschränkung darstellen, da Sie niemals$$
in einem LaTeX-Dokument verwenden sollten. SieheWarum ist\[ ... \]
vorzuziehen$$ ... $$
?für eine ausführlichere Diskussion dieses Themas.Sie verwenden nicht,
\$
um Dollarzeichen anzuzeigen. Wenn Sie dies tun, stellen Sie sicher, dass Sie es\SmashOff
vor den Instanzen von ausführen\$
-- und\SmashOn
die Lua-Funktion bei Bedarf erneut aktivieren -- oder die Instanzen von\$
durch ersetzen\textdollar
.
Allerdings kann ich mir keinen überzeugenden Anwendungsfall vorstellen, bei dem man alle Inline-Mathematikinhalte (vertikal) zerschlagen möchte. Wenn Sie dies benötigen, machen Sie mit ziemlicher Sicherheit etwas falsch. Wenn Sie e^{ikz}
im Inline-Mathematikmodus Instanzen von haben, sollten Sie diese durch ersetzen \exp(ikz)
. Ihre Leser werden Ihnen tatsächlich dankbar sein, wenn Sie dies tun.
% !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}