Lua에서 Box Register 할당

Lua에서 Box Register 할당

여러 가지 이유로 Lua에서 다음을 구현하고 싶습니다. 매크로 언어의 재귀는 나쁜 생각입니다.정의아래는 입력 스택 크기를 초과합니다. 나는 이등분 글꼴 크기 검색을 위해 TeX를 피하고 싶습니다. 등.

이것을 무시할 수 있습니다. MWE는 더욱 하락했습니다.

% Exceeds input stack size.
\newbox\fittedtextbox
% {1 width} {2 height} {3 starting font size} {4 font step} {5 minimum font size}
\def\startfittedtext#1#2#3#4#5{%
    \def\boxsize#1#2#3#4#5{%
        \setbox\fittedtextbox\vbox{%
            \definebodyfontenvironment[#3]
            \switchtobodyfont[#3]
            \hsize=#1
            \emergencystretch=1ex
            \tolerance=4000
            \hyphenpenalty=8000
            \getbuffer[fittedtext]}}
    \def\stopfittedtext{%
        \stopfittedtextargs{#1}{#2}{#3}{#4}{#5}}
        \ruledvbox to #2{\unvbox\fittedtextbox}}
    \def\stopfittedtextargs#1#2#3#4#5{%
        \boxsize{#1}{#2}{#3}{#4}{#5}
        \ifdim\ht\fittedtextbox>#2
            \stopfittedtextargs{#1}{#2}{\dimexpr#3-#4\relax}{#4}{#5}
        \fi}
    \dostartbuffer[fittedtext][startfittedtext][stopfittedtext]}

\startfittedtext{7cm}{7cm}{12pt}{1pt}{1pt}
\input knuth
\stopfittedtext

핵심 작업은 박스 레지스터에 할당하는 것입니다. 이것이 Lua에서 복제해야 하는 것입니다.

\setbox0=\vbox{...}

내가 아는 한 ConTeXt는 적절한 Lua API를 제공하지 않습니다. 함수 context.*는 출력 함수입니다. 이 vbox출력되고 tex.box[0]반환 값을 받습니다 context.vbox. 아마도 nil(확인하지 않았음)일 것입니다.

\startluacode
tex.box[0] = context.vbox(function() context.input("knuth") end)
\stopluacode

이것은 더 미묘합니다. TeX 스트림은 Lua 코드 블록이 종료될 때만 실행됩니다. 따라서 tex.box[0]다음의 값을 참조합니다.~ 전에루아 코드 블록.

\def\coreop#1{\setbox0=\vbox{#1}}
\startluacode
context.coreop(function() context.input("knuth") end)
context("%spt", tex.box[0].height/65536)
\stopluacode

이것과 같은 문제:

\startluacode
context("\\setbox0=\\vbox{\\input knuth }")
context("%spt", tex.box[0].height/65536)
\stopluacode

이 이메일[1]을 찾았지만 와, 내가 원하는 건 그게 아니네요. 더 높은 수준의 API가 곧 출시될 것이라고 언급했습니다. context.vbox상자를 출력하는 대신 노드를 반환하는 것과 유사하기를 바랍니다 (레지스터가 무엇입니까?). 실현되었다면 사례를 들어주시면 감사하겠습니다. 그렇지 않다면 몇 가지 해결 방법이 있어야 합니다. TeX 스트림이나 다른 것을 플러시하는 방법입니다.

[1]vbox...ht와 동등한 lua

답변1

tex.runtoks로컬 TeX 루프를 실행하는 함수가 있습니다 :

\starttext
\def\coreop#1{\setbox0=\vbox{#1}}
\startluacode
tex.runtoks(function()
  context.coreop(function() context.input("knuth") end)
end)
context("%spt", tex.box[0].height/65536)
\stopluacode
\stoptext

관련 정보