在 lualatex 中使用回调 start_page_number 时出错

在 lualatex 中使用回调 start_page_number 时出错

我更新了 miktex 和所有软件包,现在当我尝试在文档中使用回调 start_page_number 时出现错误。该错误甚至出现在非常小的文档中,例如在此文档中:

\documentclass{article}
\usepackage{luacode}
\usepackage{polyglossia}
\setmainlanguage[babelshorthands=true]{russian}
\setmainfont{Times New Roman}
\pagestyle{empty}
\thispagestyle{empty}
\begin{luacode}
function f0()
tex.print("page "..tex.count["c@page"])
end
luatexbase.add_to_callback("start_page_number",f0,"start")
\end{luacode}
\begin{document}
test
\end{document}

当我编译它时,出现以下错误:

{C:/Users/ksash/AppData/Local/MiKTeX/2.9/pdftex/config/pdftex.map}] (./lua3.aux
! Missing number, treated as zero.
<to be read again>
p
l.3 \select@language {russian}

?
! Missing = inserted for \ifnum.
<to be read again>
p
l.3 \select@language {russian}

?
! Missing number, treated as zero.
<to be read again>
p
l.3 \select@language {russian}

?
! Missing number, treated as zero.
<to be read again>
p
l.3 \select@language {russian}

?
! Missing number, treated as zero.
<to be read again>
\__bool_p_0:
l.3 \select@language {russian}

请帮我修复这个错误(我使用俄语,因为我想在包含西里尔字符的文档中使用它)。谢谢大家的帮助。

答案1

start_page_number“替换在 \shipout 开头打印 [ 和页码的代码。”。此代码将信息发送到终端和日志。用试图在文档中写入某些内容的代码替换它没有多大意义。例如,texio.write_nl它可以正常工作:

\documentclass{article}
\usepackage{luacode}
\usepackage{polyglossia}
\setmainlanguage{russian}
\usepackage{fontspec}
\setmainfont{Times New Roman}
\pagestyle{empty}
\thispagestyle{empty}
\begin{luacode}
function f0()
texio.write_nl("page "..tex.count["c@page"])
end
luatexbase.add_to_callback("start_page_number",f0,"start")
\end{luacode}
\begin{document}
test
\end{document}

答案2

您正尝试tex.print在回调中使用。这几乎永远不会以您期望的方式工作。要显示此特定情况下的问题,请编译以下文档修改:

\documentclass{article}
\usepackage{luacode}
\pagestyle{empty}
\thispagestyle{empty}
\begin{luacode}
function f0()
  tex.print("page "..tex.count["c@page"])
end
luatexbase.add_to_callback("start_page_number",f0,"start")
\end{luacode}
\begin{document}
test
\clearpage
X\directlua{tex.print''}X
\end{document}

在第二页上,将打印

在此处输入图片描述

发生了什么?\clearpageLuaTeX 完成第一页后,调用了回调函数。这会将一些内容添加到 Lua TeX 输出缓冲区并返回。现在,下次\directlua尝试打印某些内容时,它将被添加到同一个缓冲区,该缓冲区将在评估后发送到 TeX 。因此,在回调期间\directlua打印的文本将在随机后续使用期间打印。在您的示例中,polyglossia 尝试使用 LuaTeX 访问某个数字,但对返回结果感到困惑。tex.print\directluapage 1

这表明:绝不在回调中使用tex.print。实际行为也可能随着任何更新而改变,引用手册:(指整个tex.*print函数系列)

目前,在回调内部使用这些函数的结果尚未定义。

现在,你可以使用接口通过回调将标记添加到 TeX 输入流中token.put_next这很可能不是您想要执行的操作:它会将标记插入到基本上随机的位置,因为在\shipout完成时会调用回调,因此它们可能会出现在输出例程的代码中。此例程不期望随机代码插入,因此它要么导致另一个错误,要么将标记添加到主垂直列表中。在最后一种情况下,页码最终会出现在某个“随机”位置由于 TeX 输出例程的异步特性,它所引用的实际页面。

因此,如何修复它取决于您要存档的内容:如果您想将某些内容打印到控制台,请参阅 Ulrike Fischer 的回答。如果您想在 TeX 文档中打印页码或在页脚中打印其他信息,请参阅例如这个问题。LuaTeX 回调在更低的级别上运行。

相关内容