LuaTeX で Lua から \thepage を取得 (またはページの変更を検出) するにはどうすればよいですか?

LuaTeX で Lua から \thepage を取得 (またはページの変更を検出) するにはどうすればよいですか?

私は、Lua 関数を使用して LaTeX ドキュメントに挿入される画像を生成する LuaLaTeX パッケージを作成しています (貢献しています)。

必要な情報の 1 つは、奇数ページか偶数ページかを判断するための現在のページ番号です (これはそれほど簡単ではないことはわかっていますし、 を超える戦略もいくつか知っています\thepage)。LaTeX の部分で Lua 変数を設定すると、これまでのところこれはうまく機能します。

しかし、作成した画像のシーケンスが複数のページに分散される可能性があることが判明し、奇数ページと偶数ページで画像の動作が異なる可能性があるため、これを反映させたいと思います。

基本的に私たちが持っているのは、

tex.print('\\includegraphics{something}\\par')

1 つの Lua 関数内のループで実行されるステートメント。

ここで疑問が残ります。このような 2 つのグラフィック間のページ変更を直接検出したり、このようなループ内で現在のページを繰り返し取得したりする方法はありますか?

現在の奇数または偶数の状態を判断するために私が見つけたすべてのソリューションは、LaTeX 自体にあります。 を使用して\directluaLaTeX で使用する値を取得する方法は知っていますが、その逆、つまり LUa 内から LaTeX 値を取得する方法はありますか?

編集:TeXnicianのコメントと回答に返信します。段落の繰り返しを生成するようにサンプルコードを変更すると、ページカウンタが更新されないようです。1つのLuaチャンク内:

\documentclass{article}

\newcommand\printluapage{%
    \directlua{for i = 1, 60 do tex.print(tex.count['c@page']) 
        tex.print([[\par]]) end}
}

\begin{document}
\printluapage

New command

\printluapage

New command

\printluapage
\end{document}

ページ番号は、 の新しい呼び出しごとにのみ更新されます\printluapage

答え1

メイン ドキュメント内からページ カウンターを正確に参照することはほとんど不可能であり、出力されるページが正確にわかるのは出力ルーチン中のみです。Luatex は TeX ページの出力方法の基本モデルを変更しないため、同じことが luatex にも当てはまります。

luaループでは次のように使用できます

mcount=mycount+1
tex.print('\\includegraphics{something}\\label{graphic-' .. mycount .. '}\\par')

すると、すべての画像\labelに が関連付けられ、次回の実行時に\pageref{graphic-5}(Lua または TeX から) を取得して、5 番目のグラフィックがどのページに表示されたかを確認できます。

完全な例:

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

\documentclass{article}
\directlua{j=0}
\newcommand\printluapage{%
    \directlua{
for i = 1, 60 do
 j=j+1
 tex.print('\string\\pageref{foo' .. j .. '}\string\\label{foo' .. j .. '}') 
 tex.print([[\par]]) end}%
}

\begin{document}
\printluapage

New command

\printluapage

New command

\printluapage
\end{document}

答え2

これは、Lua で LaTeX カウンター ページの値を読み込むだけの非常に基本的なソリューションです (印刷はテスト用ですが、tex.count ステートメントは他の場所でも使用できます)。

\documentclass{article}

\newcommand\printluapage{%
    \directlua{tex.print(tex.count['c@page'])}
}

\begin{document}
    \printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage
\end{document}

答え3

ここでは 2 つの複雑な問題があります。

まず、呼び出しはすべて\directlua即座に実行されるため、TeXの通常の処理を実行したい場合は、制御をTeXに渡す必要があります(コルーチンなどを使用します)。

\directlua{for i = 1, 60 do tex.print(tex.count['c@page']) 
    tex.print([[\par]]) end}
}

質問にあるように、これは単に、呼び出し全体が完了した後に TeX が次に読み取るために、 との 60 個のインスタンス42(またはページ番号)を TeX の入力スタックに配置します。 (ループが終了する前であっても、TeX がそれぞれとタイプセットの残りをすぐに処理するわけではありません。) 正確な問題は、この質問で解決策とともに説明されています。\par\directlua\parLuaTeX で Lua と TeX を同時にインターリーブ実行する

第二に、TeX はページ区切りが避けられなくなるまで垂直リストに項目を追加するだけです (たとえば、これまでに収集したすべての資料を 1 ページにまとめる方法はありません)。そのため、資料が追加されたときのページ カウンターの値は、必ずしもその資料が最終的に配置されるページと同じではありません (たとえば、次のページになる場合があります)。ページ番号は、ボックスが出荷されるときにのみ最終的に決定されます。この事実に対処するためのトリックがいくつかあります (たとえば、出荷中に Lua コードを実行するなど) が、私はこれらのトリックを知りません。おそらく他の誰かが答えてくれるでしょう。 :-)

現在のページに追加された素材の量を示す\pagetotal(または Lua の)などの量を使用することで、おおよその結果を得ることができます。ただし、注意点がいくつかあります。上記の最初のポイントは、TeX に処理を任せることです (Lua コードを の複数の呼び出しに分割します)。また、収縮可能な接着剤と伸縮可能な接着剤を処理し、それらを考慮に入れる必要がある場合もあります。tex.pagetotal\directlua

答え4

インターリーブの問題は部分的にConTeXtで解決しました。Lua内からページ番号にアクセスでき、ある時点で更新されますが、Davidが説明した問題は彼のコメント持続します。

\starttext

\startluacode
for i = 1, 60 do
    context(context.currentpage) 
    context.par()
end
\stopluacode

\stoptext

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

関連情報