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