여러 가지 이유로 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
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