Lua でボックスレジスタを割り当てる

Lua でボックスレジスタを割り当てる

さまざまな理由から、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]前にLua コード ブロック。

\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 に相当する lua...ht

答え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

関連情報