lualatex でコールバック start_page_number を使用中にエラーが発生しました

lualatex でコールバック start_page_number を使用中にエラーが発生しました

miktex とすべてのパッケージを更新しましたが、ドキュメントで callback 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}

2ページ目には次のように印刷されます

ここに画像の説明を入力してください

何が起こったのでしょうか? \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 コールバックははるかに低いレベルで動作します。

関連情報