就像标签上写的一样。
如果还不够清楚的话,我希望$...$
将其排版为\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
的默认值为“标称字体大小的 120%”,并且标称字体大小为 10pt,则可以执行\baselineskip
\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
-like 环境,其中\baselinskip
可能不需要或不希望增加。为了保持表格美观紧凑,您可以选择——作为运行的替代\fontsize{10}{13}\selectfont
——加载setspace
包(使用选项nodisplayskipstretch
)并在序言中发出指令\setstretch{1.0833}
。请注意,1.083 的因子仍然只是指令\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}