![有沒有辦法自動粉碎所有內聯數學(但僅限垂直)?](https://rvso.com/image/449635/%E6%9C%89%E6%B2%92%E6%9C%89%E8%BE%A6%E6%B3%95%E8%87%AA%E5%8B%95%E7%B2%89%E7%A2%8E%E6%89%80%E6%9C%89%E5%85%A7%E8%81%AF%E6%95%B8%E5%AD%B8%EF%BC%88%E4%BD%86%E5%83%85%E9%99%90%E5%9E%82%E7%9B%B4%EF%BC%89%EF%BC%9F.png)
罐頭上寫著什麼。
如果還不夠清楚,我希望$...$
將其排版為\smash{$...$}
,除了\smash
還會影響水平間距(請參閱下面我連結到的問題),並且我希望它只影響垂直間距。
換句話說,我想要一些做兩件事的序言代碼:
- 只
\smash
影響垂直間距。 - 將所有實例
$...$
視為\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”數學字體——作者討論了通過將\baselineskip
12pt 的值增加到 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{$...%}
這種方法(至少)有三個限制,第一個限制在實務上應該是最相關的。
內聯數學材料假設為全部在一條線上-- 不允許換行。沒有例外。
您不得使用
$$
來啟動和終止顯示數學模式。不過,這根本不應該成為太大的限制,因為您永遠不應該$$
在 LaTeX 文件中使用。看為什麼\[ ... \]
優於$$ ... $$
?對這個主題進行更長時間的討論。您不用
\$
來顯示美元符號。如果這樣做,請確保\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}