根据为变量赋值并检索以供日后使用的推荐方法是什么?在 ConTeXt 中,可以使用\setvalue{name}{value}
来设置值,\getvalue{name}
然后使用 来稍后检索该值。这似乎仅在需要\setvalue
之前使用时才有效\getvalue
。当值在文档中设置得更晚时,我如何在文档的早期检索该值?
答案1
Marco 的说法是:使用 ConTeXt 的多通道数据机制。方法如下。
% Define a dataset that will store our key-value tables
\definedataset[mydataset]
\starttext
\framed[
% Here we use \datasetvariable to retrieve the values of myheight and mywidth.
% Notice that we only define those values further on in the document.
% Notice also that we don't worry about the first pass: through some black magic,
% we don't get 'variable undefined' problems.
% Ah, the wonders of automatic multi-pass compiling.
height=\datasetvariable{mydataset}{mytable}{myheight},
width=\datasetvariable{mydataset}{mytable}{mywidth}
]{
This is my text in a framed box
}
% Observe how we define myheight and mywidth here at the end,
% *after* having already invoked their values.
\setdataset[mydataset][mytable][myheight=3cm, mywidth=3cm]
\stoptext
通常myheight
,这mywidth
取决于文档中其他对象的高度或宽度,但为了这个例子,我懒得摆弄这些框。
答案2
OP 要求提供 ConTeXt 解决方案,该解决方案由 Esteis 提供(仅起作用和语境)。 为了 ”过度杀伤“这里是一个非 ConTeXt 解决方案(仅起作用没有语境):
在该文件的序言中:
\setvalue{name}{1}
或者一些其他“无害”的值,只是为了在第一次编译运行中设置该值。
在文档中
\getvalue{name}
文档后面部分提到:
\makeatletter%
\immediate\write\@mainaux{\string\setvalue{name}{value}}%
\makeatother%
它将写入\setvalue{name}{value}
。\jobname.aux
(\string
是必需的,因为\setvalue
命令应被写入而不是执行,例如\string\thepage
写入\thepage
,而\thepage
将写入页码,例如49
。)下次编译文档时,文件.aux
(这次包含)在文档开头\setvalue{name}{value}
之后(实际上紧接着 的内容之前)进行处理,并执行(在 之前)。文件也在的内容和之间进行处理,但这对此处的情况没有影响。\setvalue{name}{1}
\AtBeginDocument{...}
\setvalue{name}{value}
\getvalue{name}
.aux
\AtEndDocument{...}
\end{document}