我更新了 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}
在第二页上,将打印
发生了什么?\clearpage
LuaTeX 完成第一页后,调用了回调函数。这会将一些内容添加到 Lua TeX 输出缓冲区并返回。现在,下次\directlua
尝试打印某些内容时,它将被添加到同一个缓冲区,该缓冲区将在评估后发送到 TeX 。因此,在回调期间\directlua
打印的文本将在随机后续使用期间打印。在您的示例中,polyglossia 尝试使用 LuaTeX 访问某个数字,但对返回结果感到困惑。tex.print
\directlua
page 1
这表明:绝不在回调中使用tex.print
。实际行为也可能随着任何更新而改变,引用手册:(指整个tex.*print
函数系列)
目前,在回调内部使用这些函数的结果尚未定义。
现在,你可以使用接口通过回调将标记添加到 TeX 输入流中token.put_next
,但这很可能不是您想要执行的操作:它会将标记插入到基本上随机的位置,因为在\shipout
完成时会调用回调,因此它们可能会出现在输出例程的代码中。此例程不期望随机代码插入,因此它要么导致另一个错误,要么将标记添加到主垂直列表中。在最后一种情况下,页码最终会出现在某个“随机”位置后由于 TeX 输出例程的异步特性,它所引用的实际页面。
因此,如何修复它取决于您要存档的内容:如果您想将某些内容打印到控制台,请参阅 Ulrike Fischer 的回答。如果您想在 TeX 文档中打印页码或在页脚中打印其他信息,请参阅例如这个问题。LuaTeX 回调在更低的级别上运行。