使用LuaTeX中的post_linebreak_filter设置框的高度和深度

使用LuaTeX中的post_linebreak_filter设置框的高度和深度

读完这个答案后 自动防止因数学而产生多余的行距 作者 David Carlisle,我试验了代码以获得网格排版。我的方法:线的高度始终为(n - 0.3)\baselineskip,深度(n - 0.7)\baselineskipn ∈ ℕ。然后我删除粘连。这对于水平模式下的大型内联数学或其他大型对象很有效,但它不适用于显示数学,正如您在 MWE 中看到的那样。

我有几个问题:

  1. 这里出了什么问题?
  2. 我如何影响显示数学线post_linebreak_filter或其他地方的高度和深度?
  3. 在这种情况下,我该如何正确设置间距?这意味着显示数学的基线应在网格上,并且显示数学之后的行也应遵循网格。

梅威瑟:

\documentclass[12pt]{article}

\usepackage{showframe,color,unicode-math}

% Check grid typesetting
\def\grid{%
    \vtop to0pt{%
        \hsize=0pt \noindent \color{red}%
        X\\X\\X\\X\\X\\X\\X\\X\\X\\X\\X\\X\\X\\X\\X\\X\\X\\X\vss}}

\raggedbottom

\directlua{
function fixlines(h,c)
  local B=tex.baselineskip.width
  for n in node.traverse(h) do
  %
  % correct height and depth
   if (n.id==0 or n.id==11) then
    n.height = (math.ceil((n.height+.3*B)/B)-.3)*B
    n.depth  = (math.ceil((n.depth+.7*B)/B)-.7)*B
   end
%
% lineskip or baselineskip: kill glue
   if n.id==12 and (n.subtype==1 or n.subtype==2) then
    n.width=0 % kill glue
   end
  end
 return h
end
luatexbase.add_to_callback('post_linebreak_filter', fixlines, 'fix line spacing')
}

% test big objects
\def\

答案1

经过一个不眠之夜,我找到了一个解决方案。在中,append_to_vlist_filter您可以操作法线(n.subtype==1)、方程式(n.subtype==6,即显示数学行)和方程式编号( ,或n.subtype==7之后的内容)。现在每条显示数学行也都有更正的高度和深度。这是网格排版!!!! :)\eqno\leqno

完成 MWE:

\documentclass[12pt]{article}

\usepackage{showframe,color,unicode-math}
\usepackage{lua-visual-debug}

% Check grid typesetting
\def\grid{%
    \vtop to0pt{%
        \hsize=0pt \noindent \color{red}%
        X\\X\\X\\X\\X\\X\\X\\X\\X\\X\\X\\X\\X\\X\\X\\X\\X\\X\vss}}

\raggedbottom

\directlua{
function fixlines(h,c)
  local B=tex.baselineskip.width
  for n in node.traverse(h) do
  %
  % correct height and depth
   if n.id==0 and (n.subtype==1 or n.subtype==6 or n.subtype==7) then
    n.height = (math.ceil((n.height+.29*B)/B)-.3)*B
    n.depth  = (math.ceil((n.depth+.69*B)/B)-.7)*B
   end
%
% lineskip or baselineskip: kill glue
   if n.id==12 and (n.subtype==1 or n.subtype==2) then
    n.width=0 % kill glue
   end
  end
 return h
end
luatexbase.add_to_callback('append_to_vlist_filter', fixlines, 'fix line spacing')
}

% test big objects
\def\

答案2

这更像是一条评论,而不是答案。FWIW,使用数学进行网格排版在 ConTeXt 中开箱即用:

\setuplayout[grid=yes]
\showgrid
\definemathmatrix[pmatrix][left={\left(\,}, right={\,\right)},simplecommand=PMATRIX]
\def\

相关内容