如何在 LuaTeX 中设置长度(粘合/跳过?而不是尺寸)?

如何在 LuaTeX 中设置长度(粘合/跳过?而不是尺寸)?

我正在尝试使用 Lua 定义长度(而不是维度)。但是,我在语法上遇到了麻烦。我认为我应该使用相同的结构/原型,以便glue_spec仍然能够length在这些新长度上使用标准 LaTeX 宏。

问题 1:仅使用 Lua 来定义和设置新长度的方法是什么?

问题2:LaTeX 中的所有“长度”都是跳过节点/粘合节点,而不是尺寸,并且可以与所有标准宏一起使用,这样正确吗length?(\addtolength,,\setlength等等)

来自LuaTeX文档:

tex.setskip (["global",] <number> n, <node> s)
tex.setskip (["global",] <string> s, <node> s)
<node> s = tex.getskip (<number> n)
<node> s = tex.getskip (<string> s)

我能对我读到的所有内容做出的最佳解读是:

local name = "MyLength";

local newLengthCommand =
    "\\newlength{\\" .. name .. "}";

% *** Actually Creates a New Length ...
tex.sprint(newLengthCommand);

local setLengthCommand =
    "\\setlength{\\" .. name .. "}{1in}";

% ***** Doesn't actually execute and set length ... why?
tex.sprint(setLengthCommand);

% ***** Debug to be sure syntax was right ...
-- tex.sprint("\\par\\verb|" .. newLengthCommand .. "|");
-- tex.sprint("\\verb|" .. setLengthCommand .. "|");

% **** Many Fails trying to hack registers ...
local gluespec = node.new(node.id("glue_spec"));
gluespec.width = tex.sp("1in");
tex.skip[name] = gluespec;

-- tex.setskip("global", name, gluespec);
-- tex.skip[name].width = value .. "in";
-- etc., etc..

答案1

下面显示了跳过寄存器\zzz从 Lua 设置为可拉伸值。

它会产生一个日志

  \zzz has value 5.0pt plus 1.0pt minus 2.0pt

lualatex 文档:

\documentclass{article}

\newlength\zzz


\directlua{
local sp=65536
tex.setglue("zzz", 5*sp, 1*sp,2*sp,0,0)
}

\typeout{\zzz has value \the\zzz}

\begin{document}

\end{document}

以及在 tex 和 lua 中分配长度的更完整示例

\documentclass{article}

% a latex length 
\newlength\zzz
\setlength\zzz{123pt}
\typeout{\zzz is \meaning\zzz, \the\zzz} % happens to be skip register 43

\directlua{
local sp=65536
%
print ('skip alloc: ' .. tex.getcount(12)) % also 43 here
%
tex.setcount("global",12,tex.getcount(12)+1) % allocate
local myskipa=tex.getcount(12)
tex.setglue(myskipa, 5*sp, 1*sp,2*sp,0,0)
token.set_char("mylengtha", myskipa)
%
tex.setcount("global",12,tex.getcount(12)+1) % allocate
local myskipb=tex.getcount(12)
tex.setglue(myskipb, 5*sp, 1*sp,2*sp,2,3)% fil fill % expected 1,2??
token.set_char("mylengthb", myskipb)
}


% Lua allocated lengths, visible from TeX
\typeout{\skip\mylengtha is \skip\the\mylengtha, \the\skip\mylengtha}
\typeout{\skip\mylengthb is \skip\the\mylengthb, \the\skip\mylengthb}


% tex allocation picks up at 46,
% leaving 44 and 45 which wheer allocated in Lua
\newlength\zzzb
\setlength\zzzb{567pt}
\typeout{\zzzb is \meaning\zzzb, \the\zzzb} 

\begin{document}

\end{document}

这产生了

\zzz is \skip43, 123.0pt
skip alloc: 43
\skip \mylengtha is \skip 44, 5.0pt plus 1.0pt minus 2.0pt
\skip \mylengthb is \skip 45, 5.0pt plus 1.0fil minus 2.0fill
\zzzb is \skip46, 567.0pt

请注意,我本来期望拉伸和收缩顺序 2 和 3 是填充和填充,但它们少了一个,我想我会在 luatex 列表中提出这一点。 确认的luatex 与 etex/ptex/pdftex/xetex 不兼容,并且对于 fil、fill 和 filll 粘合拉伸顺序使用 2,3,4 而不是 1,2,3。

相关内容