Gibt es eine Möglichkeit, alle Inline-Mathematikfunktionen automatisch zu zerstören (aber nur vertikal)?

Gibt es eine Möglichkeit, alle Inline-Mathematikfunktionen automatisch zu zerstören (aber nur vertikal)?

Was auf der Dose steht.

Falls es nicht klar genug ist: Ich möchte, dass for $...$als gesetzt wird \smash{$...$}, außer dass \smashsich 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:

  1. Beeinflusst \smashnur den vertikalen Abstand.
  2. 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 \smashist 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

Bildbeschreibung hier eingeben

und das Protokoll bestätigt, \baselineskipdass (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

Bildbeschreibung hier eingeben

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

Bildbeschreibung hier eingeben

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 \smashbedingt 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 \baselineskipfü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 \baselineskipsicherlich nicht mehr relevant.\vec{E}\lineskip

Der Vorschlag, \baselineskipprä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 \baselineskipsie 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}\selectfonterhöht dieser Ansatz den Wert von\baselineskip überall, einschließlich für Dokumentelemente wie tabular-ähnliche Umgebungen, für die \baselinskipmö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}\selectfontladen (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.setspacenodisplayskipstretch\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 „ \SmashOnexecute“ ausgeführt wird, smashwird die Lua-Funktion dem process_input_bufferCallback 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.

  1. Das Inline-Mathematerial wird alsalles in einer Zeile-- keine Zeilenumbrüche erlaubt. Keine Ausnahme.

  2. 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.

  3. Sie verwenden nicht, \$um Dollarzeichen anzuzeigen. Wenn Sie dies tun, stellen Sie sicher, dass Sie es \SmashOffvor den Instanzen von ausführen \$-- und \SmashOndie 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.


Bildbeschreibung hier eingeben

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

verwandte Informationen