Erro ao usar o retorno de chamada start_page_number em lualatex

Erro ao usar o retorno de chamada start_page_number em lualatex

Atualizei o miktex e todos os pacotes e agora recebo um erro ao tentar usar o callback start_page_number no meu documento. O erro apareceu até em documentos muito pequenos, por exemplo neste documento:

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

Quando compilo, recebo os seguintes erros:

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

Por favor, ajude-me a corrigir esses erros (eu uso o idioma russo porque quero usá-lo em documentos que contenham caracteres cirílicos). Obrigado a todos pela ajuda.

Responder1

start_page_number"substitui o código que imprime [ e o número da página no início de \shipout.". Este código envia informações para o terminal e para o log. Não faz muito sentido substituí-lo por um código que tente escrever algo no documento. Com texio.write_nl, por exemplo, funciona bem:

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

Responder2

Você está tentando usar tex.printum retorno de chamada. Isso quase nunca funcionará da maneira que você espera. Para mostrar o problema neste caso específico, compile a seguinte modificação do seu documento:

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

Na segunda página, isso será impresso

insira a descrição da imagem aqui

O que aconteceu? Depois que \clearpageo LuaTeX finalizou a primeira página e chamou seu callback. Isso adicionou algo ao buffer de saída do Lua TeX e retornou. Agora, da próxima vez que \directluatentar imprimir algo, ele será adicionado ao mesmo buffer que será enviado ao TeX após a avaliação de \directlua. Portanto, o texto impresso tex.printdurante um retorno de chamada é impresso durante um \directluauso seguinte aleatório. No seu exemplo, a polyglossia tenta usar LuaTeX para acessar algum número e ficou confusa ao page 1ser retornada.

Isso demonstra:Nuncausar tex.printem um retorno de chamada. O comportamento real também pode mudar com qualquer atualização, para citar o manual: (referindo-se a toda a tex.*printfamília de funções)

O resultado do uso dessas funções dentro de retornos de chamada é indefinido no momento.

Agora você pode adicionar tokens ao fluxo de entrada do TeX a partir de um retorno de chamada usando a token.put_nextinterface,masmuito provavelmente não é isso que você está tentando fazer: ele inseriria os tokens em uma posição basicamente aleatória porque o retorno de chamada é chamado quando \shipouté concluído, então eles provavelmente acabariam no código da rotina de saída. Esta rotina não espera inserções aleatórias de código, portanto resultará em outro erro ou adicionará os tokens à lista vertical principal. No último caso, o número da página acabaria em algum local “aleatório”depoisa página real à qual ela se refere devido à natureza assíncrona da rotina de saída do TeX.

Então, como consertar isso depende do que você está tentando arquivar: Se você quiser imprimir algo no console, veja a resposta de Ulrike Fischer. Se você quiser imprimir um número de página em seu documento TeX ou alguma outra informação no rodapé da página, veja por exemploessa questão.Os retornos de chamada do LuaTeX operam em um nível muito mais baixo.

informação relacionada