Como posso recuperar \thepage (ou detectar uma mudança de página) de Lua no LuaTeX?

Como posso recuperar \thepage (ou detectar uma mudança de página) de Lua no LuaTeX?

Estou escrevendo (contribuindo para) um pacote LuaLaTeX onde uma função Lua é usada para gerar imagens que são inseridas no documento LaTeX.

Uma informação que precisamos é o número da página atual para determinar se estamos em uma página par ou ímpar (sei que isso não é tão trivial e conheço algumas estratégias além \thepage). Definimos uma variável Lua quando ainda estamos na parte LaTeX e até agora isso funciona muito bem.

No entanto, agora verifica-se que a sequência de imagens que criamos pode estar distribuída em várias páginas, e gostaríamos muito de reflectir isso porque as nossas imagens podem comportar-se de forma diferente em páginas pares e ímpares.

Basicamente o que temos é uma série de

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

instruções, executadas em um loop dentro de uma função Lua.

Agora a questão: existe alguma maneira de detectar diretamente uma mudança de página entre dois desses gráficos ou recuperar repetidamente a página atual dentro de um loop?

Todas as soluções que encontrei para determinar o estado par ou ímpar atual estão no próprio LaTeX. Eu sei como recuperar \directluaum valor para uso no LaTeX, mas existe uma maneira de fazer o oposto - recuperar um valor LaTeX de dentro da LUa?

Editar:para responder ao comentário e resposta do TeXnician: Quando modifico o código de exemplo para produzir repetições de parágrafos, parece que o contador de páginas não será atualizadodentro de um pedaço de 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}

O número da página só é atualizado a cada nova chamada de \printluapage.

Responder1

Quase nunca é possível fazer referência com precisão ao contador de páginas no documento principal, apenas durante a rotina de saída, onde a página que está sendo enviada é conhecida com precisão. Luatex não altera o modelo básico de saída das páginas TeX, portanto o mesmo se aplica ao luatex.

No seu loop lua você pode usar

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

Então cada imagem terá um \labelassociado a ela e na próxima execução você poderá escolher \pageref{graphic-5}(de Lua ou TeX) que lhe dirá em qual página o 5º gráfico foi parar.

um exemplo completo:

insira a descrição da imagem aqui

\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}

Responder2

Esta é uma solução muito básica que apenas lê o valor da página do contador LaTeX em Lua (a impressão é para teste, mas a instrução tex.count também pode ser usada em outros lugares).

\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}

Responder3

Existem duas complicações aqui.

Primeiramente, toda chamada to \directluaé executada imediatamente, portanto, se você deseja que o processamento normal do TeX aconteça, você precisa ceder o controle ao TeX (e usar corrotinas ou algo assim). Então quando você tiver

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

como na pergunta, isso simplesmente coloca 60 instâncias de 42(ou qualquer que seja o número da página) e \parna pilha de entrada do TeX, para que o TeX leia a seguir após a \directluachamada inteira ser concluída. (Isso não resulta no processamento do TeX de todo \pare qualquer restante da composição imediatamente, mesmo antes do término do loop.) Seu problema exato é discutido, com soluções, nesta questão:Intercalando simultaneamente a execução de Lua e TeX em LuaTeX.

Em segundo lugar, o TeX simplesmente acrescenta itens às suas listas verticais até que uma quebra de página se torne inevitável (por exemplo, não há nenhuma maneira possível de colocar todo o material coletado até agora em uma única página), então o valor do contador de páginas no momento em que o material é adicionado não é necessariamente a página em que terminará (pode terminar na próxima página, por exemplo). O número da página só é finalmente determinado quando as caixas são enviadas. Existem alguns truques para lidar com esse fato (por exemplo, executar seu código Lua durante o envio?), mas eu não conheço esses truques; talvez outra pessoa responda. :-)

Você pode obter alguns resultados aproximados usando quantidades como \pagetotal(ou de Lua, tex.pagetotal), que mostra quanto material foi adicionado à página atual. Isso está sujeito a advertências: o primeiro ponto acima sobre deixar o TeX fazer seu trabalho (dividir seu código Lua em diferentes chamadas para \directlua), e também você pode precisar lidar com cola encolhível e extensível e considerá-las.

Responder4

O problema da intercalação éparcialmenteresolvido no ConTeXt. Você pode acessar o número da página de dentro de Lua e ele será atualizado em algum momento, mas o problema que David descreveu emo comentário delepersiste.

\starttext

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

\stoptext

insira a descrição da imagem aqui

informação relacionada