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.print
um 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
O que aconteceu? Depois que \clearpage
o 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 \directlua
tentar 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.print
durante um retorno de chamada é impresso durante um \directlua
uso seguinte aleatório. No seu exemplo, a polyglossia tenta usar LuaTeX para acessar algum número e ficou confusa ao page 1
ser retornada.
Isso demonstra:Nuncausar tex.print
em 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.*print
famí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_next
interface,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.