%20de%20Lua%20no%20LuaTeX%3F.png)
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 \directlua
um 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 \label
associado 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:
\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 \par
na pilha de entrada do TeX, para que o TeX leia a seguir após a \directlua
chamada inteira ser concluída. (Isso não resulta no processamento do TeX de todo \par
e 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