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 vbox
generará 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.vbox
pero 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.
Respuesta1
Hay una función tex.runtoks
que 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