Atribuir Box Register em Lua

Atribuir Box Register em Lua

Gostaria de implementar o seguinte em Lua, por vários motivos. A recursão em uma linguagem macro é uma má ideia - odefiniçãoabaixo excede o tamanho da pilha de entrada. Quero evitar o TeX para uma pesquisa de tamanho de fonte de bissecção. Etc.

Você pode ignorar isso. O MWE está mais abaixo.

% 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

A operação principal é a atribuição a uma caixa registradora. Isso é o que preciso replicar em Lua.

\setbox0=\vbox{...}

Pelo que sei, o ConTeXt não fornece a API Lua apropriada. As context.*funções são funções de saída. O vboxserá gerado e tex.box[0]receberá o valor de retorno de context.vbox, provavelmente nil(não verificado).

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

Isso é mais sutil. O fluxo TeX só é executado quando o bloco de código Lua termina. Então tex.box[0]faz referência ao valor deanteso bloco 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

O mesmo problema com isso:

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

Encontrei este e-mail[1], mas uau, não é isso que eu quero. Ele mencionou que uma API de nível superior está no horizonte. Esperançosamente semelhante, context.vboxmas retornando um nó (isso é um registro?) Em vez de gerar uma caixa. Se isso se materializar, eu apreciaria um exemplo. Caso contrário, deve haver alguma solução alternativa. Uma maneira de liberar o fluxo do TeX ou qualquer outra coisa.

[1]lua equivalente a vbox...ht

Responder1

Existe uma função tex.runtoksque executa um loop local do 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

informação relacionada