LuaTeX의 Lua에서 \thepage를 검색하거나 페이지 변경을 감지하려면 어떻게 해야 하나요?

LuaTeX의 Lua에서 \thepage를 검색하거나 페이지 변경을 감지하려면 어떻게 해야 하나요?

저는 Lua 함수를 사용하여 LaTeX 문서에 삽입되는 이미지를 생성하는 LuaLaTeX 패키지를 작성(기여)하고 있습니다.

우리에게 필요한 정보 중 하나는 홀수 페이지인지 짝수 페이지인지 판단하기 위한 현재 페이지 번호입니다. (저는 이것이 그렇게 사소한 것이 아니라는 것을 알고 있으며 그 이상의 몇 가지 전략에 대해 알고 있습니다 \thepage.) 아직 LaTeX 부분에 있을 때 Lua 변수를 설정했는데 지금까지는 꽤 잘 작동했습니다.

그러나 이제 우리가 생성하는 일련의 이미지가 여러 페이지에 분산될 수 있다는 사실이 밝혀졌고, 이미지가 홀수 페이지와 짝수 페이지에서 다르게 동작할 수 있으므로 이를 반영하고 싶습니다.

기본적으로 우리가 가지고 있는 것은 일련의

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

하나의 Lua 함수 내에서 루프로 실행되는 명령문입니다.

이제 질문입니다. 이러한 두 그래픽 사이의 페이지 변경을 직접 감지하거나 이러한 루프 내에서 현재 페이지를 반복적으로 검색할 수 있는 방법이 있습니까?

현재 홀수 또는 짝수 상태를 결정하기 위해 제가 찾은 모든 솔루션은 LaTeX 자체에 있습니다. LaTeX에서 사용할 값을 검색하는 방법을 알고 있지만 \directlua그 반대인 LUa 내에서 LaTeX 값을 검색하는 방법이 있습니까?

편집하다:TeXnician의 의견과 답변에 응답하기 위해: 예제 코드를 수정하여 단락이 반복되도록 하면 페이지 카운터가 업데이트되지 않는 것 같습니다.하나의 루아 청크 내에서:

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

페이지 번호는 의 새로운 호출이 있을 때만 업데이트됩니다 \printluapage.

답변1

기본 문서 내에서 페이지 카운터를 정확하게 참조할 수 있는 경우는 거의 없으며, 발송되는 페이지가 정확하게 알려진 출력 루틴 동안에만 가능합니다. Luatex는 TeX 페이지 출력 방식의 기본 모델을 변경하지 않으므로 Luatex에도 동일하게 적용됩니다.

루아 루프에서 다음을 사용할 수 있습니다.

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

그런 다음 모든 이미지 \label에는 해당 이미지가 연결되어 있으며 다음 실행 시 \pageref{graphic-5}Lua 또는 TeX에서 선택하여 5번째 그래픽이 어느 페이지에 있는지 알려줄 수 있습니다.

전체 예:

여기에 이미지 설명을 입력하세요

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

답변2

이것은 Lua에서 LaTeX 카운터 페이지의 값을 읽는 매우 기본적인 솔루션입니다(인쇄는 테스트용이지만 tex.count 문은 다른 위치에서도 사용할 수 있습니다).

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

답변3

여기에는 두 가지 합병증이 있습니다.

첫째, 모든 호출은 \directlua즉시 실행되므로 TeX의 일반적인 처리가 이루어지도록 하려면 제어권을 TeX에 넘겨야 합니다(그리고 코루틴 등을 사용해야 합니다). 그래서 당신이 가지고 있을 때

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

질문에서처럼 이것은 전체 호출이 완료된 후 TeX가 다음에 읽을 수 있도록 TeX의 입력 스택에 60개의 인스턴스 42(또는 페이지 번호가 무엇이든) 를 넣습니다. ( 루프가 끝나기 전에도 TeX가 각 조판 작업과 나머지 조판 작업을 즉시 처리하지 않습니다 .) 정확한 문제는 다음 질문에서 해결책과 함께 논의됩니다.\par\directlua\parLuaTeX에서 Lua와 TeX의 동시 인터리빙 실행.

둘째, TeX는 페이지 나누기가 불가피해질 때까지 수직 목록에 항목을 추가합니다(예: 지금까지 수집된 모든 자료를 단일 페이지에 넣을 수 있는 방법은 없습니다). 따라서 자료가 있는 시점의 페이지 카운터 값은 다음과 같습니다. 추가된 페이지가 반드시 끝날 페이지는 아닙니다(예를 들어 다음 페이지에서 끝날 수도 있음). 페이지 번호는 박스가 발송될 때만 최종적으로 결정됩니다. 이 사실을 처리하기 위한 몇 가지 요령이 있지만(예: 배송 중에 Lua 코드를 실행합니까?) 나는 이러한 요령을 모릅니다. 아마도 다른 사람이 대답할 것입니다. :-)

현재 페이지에 얼마나 많은 자료가 추가되었는지 보여주는 \pagetotal(또는 Lua의 ) 수량을 사용하여 대략적인 결과를 얻을 수 있습니다 . tex.pagetotal이것은 주의 사항이 있습니다: TeX가 작업을 수행하도록 하는 것에 대한 위의 첫 번째 사항(다른 호출로 Lua 코드를 분할 \directlua)과 수축 및 신축 가능한 접착제를 처리하고 이를 설명해야 할 수도 있습니다.

답변4

인터리빙의 문제는부분적으로ConTeXt에서 해결되었습니다. Lua 내에서 페이지 번호에 접근할 수 있으며 어느 시점에 업데이트되지만 David가 설명한 문제는 다음과 같습니다.그의 코멘트지속됩니다.

\starttext

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

\stoptext

여기에 이미지 설명을 입력하세요

관련 정보