Box-Register in Lua zuweisen

Box-Register in Lua zuweisen

Ich möchte das Folgende aus verschiedenen Gründen in Lua implementieren. Rekursion in einer Makrosprache ist eine schlechte Idee - dieDefinitionunten überschreitet die Größe des Eingabestapels. Ich möchte TeX für eine Suche mit halbierter Schriftgröße vermeiden. Usw.

Dies können Sie ignorieren. Der MWE liegt weiter unten.

% 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

Die Kernoperation ist die Zuweisung zu einem Boxregister. Dies muss ich in Lua replizieren.

\setbox0=\vbox{...}

Soweit ich das beurteilen kann, stellt ConTeXt nicht die entsprechende Lua-API zur Verfügung. Die context.*Funktion ist eine Ausgabefunktion. Die vboxwird ausgegeben und erhält wahrscheinlich tex.box[0]den Rückgabewert (nicht überprüft).context.vboxnil

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

Dies ist subtiler. Der TeX-Stream wird nur ausgeführt, wenn der Lua-Codeblock beendet wird. tex.box[0]Referenziert also den Wert vonVorder Lua-Codeblock.

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

Gleiches Problem hiermit:

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

Ich habe diese E-Mail[1] gefunden, aber wow, das ist nicht das, was ich will. Darin wurde erwähnt, dass eine API auf höherer Ebene in Planung ist. Hoffentlich ähnlich wie, context.vboxaber mit Rückgabe eines Knotens (ist das ein Register?), anstatt eine Box auszugeben. Wenn es dazu gekommen ist, wäre ich für ein Beispiel dankbar. Wenn nicht, muss es einen Workaround geben. Eine Möglichkeit, den TeX-Stream zu leeren, oder etwas anderes.

[1]Lua-Äquivalent von vbox...ht

Antwort1

Es gibt eine Funktion tex.runtoks, die eine lokale TeX-Schleife ausführt:

\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

verwandte Informationen