自动防止因数学而产生多余的行距

自动防止因数学而产生多余的行距

盒子和粘合系统似乎是 TeX 的优点和缺点。我经常要处理的一个主要问题是线条之间的距离不均匀,如下例所示。

在此处输入图片描述

在数学符号周围插入一些\smash命令证明这个额外的行间距根本没有必要;标准高度的行上有足够的空间容纳数学符号:

在此处输入图片描述

目前,插入\smash我发现手动插入命令是解决此问题的唯一可接受的解决方案,因为我怀疑弄乱行间粘连不是一个好主意(或者什么?)。我想知道是否有一种自动方法可以实现这一点?我可以阻止 TeX 根据内联数学的大小调整行高吗?

你可能认为:

但是,如果您想在内联数学中放置大型结构(如矩阵),该怎么办?当然您不希望它们与相邻的行发生冲突?

事实是我绝不将矩阵或类似的大型构造放在内联数学中。在我看来,这些东西完全属于显示数学。

\documentclass{article}

\usepackage{mathtools}

\DeclareMathOperator\Ad{Ad}

\usepackage{lipsum}

\begin{document}

Consider the map~$\Ad_{g_0^2}$.
La la la la la la la la la la la la la la la la la.
And the algebra~$\widetilde{A}$.
\lipsum[1]

Consider the map~\smash{$\Ad_{g_0^2}$}.
La la la la la la la la la la la la la la la la la.
And the algebra~\smash{$\widetilde{A}$}.
\lipsum[1]

\end{document}

答案1

当我被评论 ping 吸引回到此页面时,我发布了第二个答案,我发现当可以使用更简单的经典 tex 答案时,只有 luatex 答案。

如果您设置,\lineskiplimit=-\maxdimen那么 tex 将保留基线,而不限制由此引起的重叠量。

在此处输入图片描述

\documentclass{article}

\usepackage{mathtools}

\DeclareMathOperator\Ad{Ad}

\usepackage{lipsum}

\begin{document}

\lineskiplimit=-\maxdimen

Consider the map~$\Ad_{g_0^2}$.
La la la la la la la la la la la la la la la la la.
And the algebra~$\widetilde{A}$.
\lipsum[1]

Consider the map~\smash{$\Ad_{g_0^2}$}.
La la la la la la la la la la la la la la la la la.
And the algebra~\smash{$\widetilde{A}$}.
\lipsum[1]

\end{document}

答案2

这是一个可以做得更强大的 luatex 版本,但在换行之后,它使用回调来设置框的高度和深度,并用固定值替换任何基线跳过或行跳过粘连。(可能它应该保留第一个框的高度和最后一个框的深度,留作练习。)

在此处输入图片描述

\documentclass{article}

\usepackage{mathtools}

\DeclareMathOperator\Ad{Ad}


\directlua{
  function fixlines(h,c)
    local pd=0
    print('code: ' .. type(c) .. ':' .. c)
    for n in node.traverse(h) do
      %
      % smash boxes
      if n.id==0 then
        n.depth=0
        n.height=0
      end
      %
      % lineskip or baselineskip set to 12pt
      if n.id==12 and (n.subtype==1 or n.subtype==2) then
        n.width=786432 % 12pt in sp
      end
    end
    return h
  end
  luatexbase.add_to_callback('post_linebreak_filter', fixlines, 'fix line spacing')
}
\usepackage{lipsum}

\begin{document}


Consider the map~$\Ad_{g_0^2}$.
La la la la la la la la la la la la la la la la la.
And the algebra~$\widetilde{A}$.
\lipsum[1]

Consider the map~\smash{$\Ad_{g_0^2}$}.
La la la la la la la la la la la la la la la la la.
And the algebra~\smash{$\widetilde{A}$}.
\lipsum[1]

\end{document}

相关内容