有沒有辦法自動粉碎所有內聯數學(但僅限垂直)?

有沒有辦法自動粉碎所有內聯數學(但僅限垂直)?

罐頭上寫著什麼。

如果還不夠清楚,我希望$...$將其排版為\smash{$...$},除了\smash還會影響水平間距(請參閱下面我連結到的問題),並且我希望它只影響垂直間距。

換句話說,我想要一些做兩件事的序言代碼:

  1. \smash影響垂直間距。
  2. 將所有實例$...$視為\smash{$...$}

這個問題非常具體地要求垂直和水平粉碎內聯數學,所以我的不是它的重複。

答案1

預設情況下,顯示的範例將適合行距,因此\smash不需要

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

生產

在此輸入影像描述

並且日誌確認\baselineskip(而不是\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 []

對於更大的表達式

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

你得到

在此輸入影像描述

日誌確認 TeX 放棄使用\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 []

您可以進行設置\lineskiplimit,以便即使線條不適合也保留基線空間:

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

這會產生

在此輸入影像描述

並記錄

...\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 []

顯示基線間距保留,即使這會迫使行之間產生負間距。

不過,這裡的解決方法比問題更糟糕,過度印刷的難以辨認的文本在印刷上比不均勻的行距更糟糕。

這是(我認為)您想要的效果,透過要求\smash在任何地方應用,但實際上最好不要這樣做,而只是\smash有條件地應用在您知道沒有套印的地方(因為上面的高項目)該行未與上面行的深下降部分對齊,以便您可以重疊邊界框而不重疊文字)

答案2

由OP的一些評論引發的附加評論:如果您的文件包含大量內嵌數學材料--並不是說這有什麼問題!——你可能想先發制人增加的價值\baselineskip。如果\baselineskip您使用的字體的預設值為“標稱字體大小的 120%”,並且標稱字體大小為 10pt,則可以執行

\fontsize{10}{13}\selectfont

對於整個文件,以避免大多數(如果不是幾乎全部)\lineskip必須增加到超過 的情況\baselineskip。當然,\vec{E}強制增加的情況\lineskip將不再相關。

先發制人地增加的建議\baselineskip絕不是任意的或黑客的。例如,在本書的前言中具體數學作者:Graham、Knuth 和 Patashnik——其中(毫不奇怪)包含很多內聯數學材料、Concrete Roman 文字字體(Computer Modern 的板狀襯線變體的“Egyptienne”)和“Euler”數學字體——作者討論了通過將\baselineskip12pt 的值增加到 13pt,他們立即擺脫了幾乎所有內聯數學強制增加的情況\lineskip。如果由內聯數學考慮引起的印刷解決方案對於 Knuth 和他的合著者來說足夠好,那麼您可能想看看它是否也對您“有效”,對吧?

順便說一句,該\fontsize{10}{13}\selectfont方法增加了\baselineskip 到處,包括文件元素,例如tabular類似環境,可能不需要或不希望增加\baselinskip。為了保持表格美觀和緊湊,您可以選擇(作為運行的替代方案\fontsize{10}{13}\selectfont)載入setspace套件(使用選項)並發出序言中的nodisplayskipstretch指令。請注意,1.083 的係數仍然僅為該指令所需\setstretch{1.0833}係數的三分之一。\onehalfspacing


這是一個基於 LuaLaTeX 的解決方案。要激活它,請執行\SmashOn;若要停用它,請執行\SmashOff.執行時\SmashOn,Lua函數smash被分配給LuaTeX的process_input_buffer回調,它充當輸入流上的預處理器,即,它做它的事情TeX 開始自己處理輸入資料。它所做的「事情」就是根據您的需要將,的所有實例替換$...$為, 。\smash{$...%}

這種方法(至少)有三個限制,第一個限制在實務上應該是最相關的。

  1. 內聯數學材料假設為全部在一條線上-- 不允許換行。沒有例外。

  2. 您不得使用$$來啟動和終止顯示數學模式。不過,這根本不應該成為太大的限制,因為您永遠不應該$$在 LaTeX 文件中使用。看為什麼\[ ... \]優於$$ ... $$對這個主題進行更長時間的討論。

  3. 您不用\$來顯示美元符號。如果這樣做,請確保\SmashOff在 的實例之前運行\$——並\SmashOn在需要時重新激活 Lua 函數——或者\$將的實例替換為\textdollar

也就是說,我無法想像一個令人信服的用例來想要(垂直)粉碎所有內聯數學材料。如果您需要它,那麼幾乎肯定您做錯了什麼。如果您有e^{ikz}內聯數學模式的實例,請考慮將它們替換為\exp(ikz).如果您這樣做,您的讀者實際上會感激您。


在此輸入影像描述

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

相關內容