Назначить регистр ящика в 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 не предоставляет соответствующий API Lua. Функции 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]lua эквивалент vbox...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

Связанный контент