miktex와 모든 패키지를 업데이트했는데 이제 문서에서 start_page_number 콜백을 사용하려고 하면 오류가 발생합니다. 이 오류는 매우 작은 문서에서도 나타났습니다. 예를 들어 다음 문서와 같습니다.
\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}
컴파일하면 다음과 같은 오류가 발생합니다.
{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}
이 오류를 수정하도록 도와주세요. (키릴 문자가 포함된 문서에 러시아어를 사용하고 싶기 때문에 러시아어를 사용합니다.) 도움을 주신 모든 분들께 감사드립니다.
답변1
start_page_number
"\shipout 시작 부분에 [ 및 페이지 번호를 인쇄하는 코드를 대체합니다." 이 코드는 터미널과 로그에 정보를 보냅니다. 문서에 무언가를 쓰려고 하는 코드로 대체하는 것은 별 의미가 없습니다. 예를 들어 texio.write_nl
잘 작동합니다.
\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}
답변2
tex.print
콜백에서 사용하려고 합니다 . 그것은 당신이 기대하는 방식으로 거의 작동하지 않을 것입니다. 이 특별한 경우의 문제를 표시하려면 문서를 다음과 같이 수정하여 컴파일하세요.
\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}
두 번째 페이지에는 다음과 같은 내용이 인쇄됩니다.
무슨 일이에요? \clearpage
LuaTeX가 첫 번째 페이지를 완료하고 콜백을 호출한 후 . 이는 Lua TeX 출력 버퍼에 무언가를 추가하고 반환되었습니다. 이제 다음에 \directlua
무언가를 인쇄하려고 시도하면 \directlua
. 따라서 tex.print
콜백 중에 인쇄된 텍스트는 다음 \directlua
사용 중에 무작위로 인쇄됩니다. 예를 들어, 폴리글로시아는 LuaTeX를 사용하여 일부 숫자에 액세스하려고 시도했지만 page 1
대신 반환되는 것에 대해 혼란스러워했습니다.
이는 다음을 보여줍니다.절대tex.print
콜백에 사용하세요 . 매뉴얼을 인용하면 실제 동작은 업데이트에 따라 변경될 수도 있습니다. (전체 tex.*print
기능 계열 참조)
콜백 내부에서 이러한 함수를 사용한 결과는 현재 정의되지 않았습니다.
이제 인터페이스를 사용하여 콜백에서 TeX 입력 스트림에 토큰을 추가할 수 있습니다 token.put_next
.하지만이것은 당신이 하려는 일이 아닐 가능성이 높습니다. \shipout
완료되면 콜백이 호출되기 때문에 기본적으로 임의의 위치에 토큰을 삽입하므로 출력 루틴의 코드에 포함될 가능성이 높습니다. 이 루틴은 무작위 코드 삽입을 예상하지 않으므로 다른 오류가 발생하거나 기본 수직 목록에 토큰이 추가됩니다. 마지막 경우에는 페이지 번호가 "임의의" 위치에 있게 됩니다.~ 후에TeX 출력 루틴의 비동기 특성으로 인해 참조하는 실제 페이지입니다.
따라서 문제를 해결하는 방법은 보관하려는 대상에 따라 다릅니다. 콘솔에 무언가를 인쇄하려면 Ulrike Fischer의 답변을 참조하세요. TeX 문서의 페이지 번호나 페이지 바닥글의 다른 정보를 인쇄하려면 예를 참조하세요.이 질문.LuaTeX 콜백은 훨씬 낮은 수준에서 작동합니다.