![如何在 LuaTeX 中设置长度(粘合/跳过?而不是尺寸)?](https://linux22.com/image/402551/%E5%A6%82%E4%BD%95%E5%9C%A8%20LuaTeX%20%E4%B8%AD%E8%AE%BE%E7%BD%AE%E9%95%BF%E5%BA%A6%EF%BC%88%E7%B2%98%E5%90%88%2F%E8%B7%B3%E8%BF%87%EF%BC%9F%E8%80%8C%E4%B8%8D%E6%98%AF%E5%B0%BA%E5%AF%B8%EF%BC%89%EF%BC%9F.png)
我正在尝试使用 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。