Lua 中的分配框暫存器

Lua 中的分配框暫存器

由於各種原因,我想在 Lua 中實現以下內容。宏語言中的遞歸是個壞主意 -定義下面超出了輸入堆疊大小。我想避免使用 TeX 進行二等分字體大小搜尋。 ETC。

你可以忽略這一點。 MWE 進一步下降。

% 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

核心運算是對框暫存器的賦值。這就是我需要在 Lua 中複製的內容。

\setbox0=\vbox{...}

據我所知 ConTeXt 並沒有提供適當的 Lua API。此context.*函數是輸出函數。可能vbox會輸出 並tex.box[0]接收 的回傳值context.vboxnil尚未檢查)。

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

這個就比較微妙了。 TeX流僅在Lua程式碼區塊退出時執行。所以tex.box[0]引用來自的值Lua 代碼塊。

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

同樣的問題:

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

我確實找到了這封電子郵件[1],但是哇,這不是我想要的。它確實提到更高層級的 API 即將出現。希望類似於context.vbox但返回一個節點(這就是寄存器嗎?)而不是輸出一個框。如果它已經實現,我希望有一個例子。如果沒有,必須有一些解決方法。一種刷新 TeX 流或其他任何東西的方法。

[1]lua 相當於 vbox...ht

答案1

有一個tex.runtoks運行本地 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

相關內容