我在 Windows 10 x64 中运行 MiKTeX 2.9。
在使用 basic-miktex-2.9.6942-x64.exe 进行全新基本安装(保留旧版本)后,我遇到了 lualatex 程序的问题。(修正侧边距 侧边距和精确左/右对齐)
- 使用新的 2019 基本安装时,我收到一条错误消息
警告(节点过滤器):错误:[\directlua]:11:尝试对字段“xadvance”(零值)执行算术运算
并崩溃。
切换回之前的 2018 环境后,程序运行良好。
我发现,如果我仅将整个目录 C:\Program Files\MiKTeX 2.9\miktex 与旧目录(2018)交换,同时保留其他所有内容,该程序现在就可以运行。
在新安装中,exe 文件的日期为 2019 年 1 月 2 日;在旧安装中,exe 文件的日期为 2018 年 6 月 26 日和 2018 年 6 月 24 日
有什么帮助吗?
lualatex主要代码
% !TeX TS-program = lualatex
\documentclass[12pt]{article}
\RequirePackage{xcolor}
\usepackage{luacode}
\newcount\dropsidebearings
\input{drop_sidebearing.lua}
\newcommand{\hairlineiv}[1][green]{%
\leavevmode%
\kern-0.1pt %
\smash{\color{#1}\vrule height 5\baselineskip depth 5pt width 0.1pt}%
\kern-0.1pt
}
\begin{document}
\pagestyle{empty}
\newcommand{\longtitles}{Long titles must be exactly aligned with the vertical green bar.}% the main title
\begin{minipage}{5in}
\dropsidebearings=1 %turn on the effect
% \longtitles
\raggedleft\sffamily\fontsize{50}{60}\selectfont\bfseries \longtitles\hairlineiv
\end{minipage}
\end{document}
luatex 代码(文件:drop_sidebearing.lua)
\begin{luacode*}
local function drop_sidebearing(head, groupcode)
if tex.count['dropsidebearings'] == 0 then
return true
end
for n in node.traverse_id(node.id'hlist', head) do
local char = node.has_glyph(n.head)
if char then
local f = font.getfont(char.font)
if f.shared then
local off = f.shared.rawdata.descriptions[char.char].boundingbox[1]*f.size/1000
char.xadvance = char.xadvance - off
char.xoffset = char.xoffset - off
end
end
for ch in node.traverse_id(node.id'glyph', n.head) do
char = ch
end
if char then
local f = font.getfont(char.font)
if f.shared then
local desc = f.shared.rawdata.descriptions[char.char]
char.xadvance = char.xadvance - (desc.width-desc.boundingbox[3])*f.size/1000
end
end
local new_list = node.hpack(n.head, n.width, 'exactly')
new_list.head = nil
n.glue_order = new_list.glue_order
n.glue_set = new_list.glue_set
n.glue_sign = new_list.glue_sign
node.free(new_list)
end
return true
end
luatexbase.add_to_callback('post_linebreak_filter', drop_sidebearing, 'Drop sidebearings after linebreaking')
\end{luacode*}