在 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。因此,tex.print在回調期間列印的文字將在隨機後續\directlua使用期間列印。在您的範例中,polyglossia 嘗試使用 LuaTeX 存取某些號碼,但對page 1返回感到困惑。

這顯示:絕不tex.print在回調中使用。實際行為也可能會隨著任何更新而改變,引用手冊:(指整個tex.*print功能係列)

目前,從內部回調使用這些函數的結果尚未定義。

現在您可以使用該介面從回呼中將標記新增至 TeX 輸入流中token.put_next這很可能不是您想要做的:它將在基本上隨機的位置插入標記,因為\shipout完成後會呼叫回調,因此它們可能最終會出現在輸出例程的程式碼中。此例程不期望隨機代碼插入,因此它將導致另一個錯誤或將標記添加到主垂直列表中。在最後一種情況下,頁碼最終會出現在某個「隨機」位置由於 TeX 輸出例程的非同步特性,它所引用的實際頁面。

因此,如何修復它取決於您要歸檔的內容:如果您想將某些內容列印到控制台,請參閱 Ulrike Fischer 的答案。如果您想列印 TeX 文件中的頁碼或頁腳中的其他一些信息,請參閱範例這個問題。LuaTeX 回調在低得多的等級上運行。

相關內容