我正在学习 ConTeXt。吸引我的原因之一是缓冲区的概念。到目前为止,我一直在使用datatool
包来获得类似的功能(涉及间接成本)。
我想知道是否有一个命令或选项允许将内容附加到已经使用的缓冲区,而不是将缓冲区保存为\savebuffer
文件.tex
然后\input
再次保存。
我希望我清楚地说明了这个问题。希望 MWE 也能说明这一点:
梅威瑟:
\starttext
\definebuffer[MyBuffer]
\startbuffer[MyBuffer]
First part of buffer content.
\stopbuffer
\savebuffer[MyBuffer]
[mybuffer.tex]
Used here:
\getbuffer[MyBuffer]
\blank
\startbuffer[MyBuffer]
\input \jobname-mybuffer.tex
Adding more:
The additional stuff.
\stopbuffer
Now all together:
\getbuffer[MyBuffer]
\stoptext
如果没有,我想知道是否可以使用 luacode 来处理那些已保存的缓冲区(处理=删除它们)以免弄乱项目目录。
提前感谢您对此提供的任何帮助。
答案1
当您标记缓冲区时,它已经可以访问\getbuffer[label]
。\definebuffer
还有其他用途。为了回答您的问题,我建议两种方法:
来自邮件列表的一个好方法
下面的例子更好地处理了buffers.append
。我刚刚改编自邮件列表。它定义了\startappendbuffer
,\stopappendbuffer
因此使用起来更舒服:
\startluacode
userdata = userdata or { }
function userdata.addTempToBuffer(buffername)
buffers.append(
buffername,
'\n' .. buffers.getcontent('APPENDTEMP')
)
end
\stopluacode
\def\startappendbuffer[#1]%
{\def\stopappendbuffer%
{\ctxlua{userdata.addTempToBuffer('#1')}}
\dostartbuffer[APPENDTEMP][startappendbuffer][stopappendbuffer]}
\starttext
\startbuffer[x]
Hola
\stopbuffer
\startlines
\getbuffer[x]
\stoplines
\startappendbuffer[x]
\input knuth
\stopappendbuffer
\startlines
\getbuffer[x]
\stoplines
\stoptext
一种简单的方法:包装buffers.append
已经有一个 Lua 函数可以将内容附加到缓冲区,即buffers.append(buffer, text)
(参见LuaTeX 中的缓冲区)。因此我们将使用 来包装它\ctxlua
,它用于在 TeX 中调用 Lua 函数:
%#1 is the name of the buffer
%#2 is the content to append
\unprotect
\def\appendtobuffer#1#2{\ctxlua{buffers.append("#1", \!!bs#2\!!es)}}
\protect
\starttext
\startbuffer[lol]
\dorecurse{6}{hello! }
\stopbuffer
\getbuffer[lol]
\appendtobuffer{lol}{\startformula e^{i\pi}+1=0\stopformula \input knuth}
\getbuffer[lol]
\stoptext
注意使用\!!bs
and,\!!es
这样您的内容将作为字符串传递给 Lua。如果我想添加更简单、更短的文本片段,我会使用它,因为正如 Henri Menke 指出的那样(谢谢!