Asignar registro de casilla en Lua

Asignar registro de casilla en Lua

Me gustaría implementar lo siguiente en Lua, por varias razones. La recursividad en un lenguaje macro es una mala idea: ladefinicióna continuación excede el tamaño de la pila de entrada. Quiero evitar TeX para una búsqueda de tamaño de fuente de bisección. Etc.

Puedes ignorar esto. El MWE está más abajo.

% 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

La operación principal es la asignación a un registro de caja. Esto es lo que necesito replicar en Lua.

\setbox0=\vbox{...}

Por lo que puedo decir, ConTeXt no proporciona la API Lua adecuada. Las context.*funciones son funciones de salida. Se vboxgenerará y tex.box[0]recibirá el valor de retorno de context.vbox, probablemente nil(no lo he verificado).

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

Esto es más sutil. La secuencia TeX solo se ejecuta cuando sale el bloque de código Lua. Entonces tex.box[0]hace referencia al valor deantesel bloque de código Lua.

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

El mismo problema con esto:

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

Encontré este correo electrónico[1] pero, vaya, eso no es lo que quiero. Mencionó que hay una API de nivel superior en el horizonte. Con suerte, es similar context.vboxpero devuelve un nodo (¿es esto lo que es un registro?) en lugar de generar un cuadro. Si se ha materializado, agradecería un ejemplo. Si no, debe haber alguna solución. Una forma de eliminar el flujo de TeX o cualquier otra cosa.

[1]lua equivalente de vbox...ht

Respuesta1

Hay una función tex.runtoksque ejecuta un bucle TeX local:

\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

información relacionada