有没有办法自动粉碎所有内联数学(但仅限于垂直方向)?

有没有办法自动粉碎所有内联数学(但仅限于垂直方向)?

就像标签上写的一样。

如果还不够清楚的话,我希望$...$将其排版为\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的默认值为“标称字体大小的 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{$...%}

这种方法至少有三处局限性,其中第一个局限性在实践中应该是最相关的。

  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}

相关内容