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 vbox
wird ausgegeben und erhält wahrscheinlich tex.box[0]
den Rückgabewert (nicht überprüft).context.vbox
nil
\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.vbox
aber 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.
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