我如何保存要在第二次编译中使用的值(状态)?
例如,看这个简单的例子:
\definecounter[foox]
\setcounter[foox][1]
\definestartstop
[foo]
[before={\textrule[top]{Foo: \rawcountervalue[foox]}},
after={\incrementcounter[foox]}]
\starttext
Total of Foos: \rawcountervalue[foox]
\startfoo \stopfoo
\startfoo \stopfoo
\startfoo \stopfoo
\stoptext
我怎样才能打印 3?当然我不想手动Total of Foos:
计算数量startfoo ... stopfoo
在乳胶中,\immediate\write
似乎可以解决问题
已编辑
另外,有没有什么方法可以保存文本上的标记以供以后使用?例如(使用假设的命令\setmark
):
\startfoo \setmark{x} \stopfoo
...
中的值\setmark{...}
可以提前使用吗?
\definecounter[foox]
\setcounter[foox][1]
\definestartstop
[foo]
[before={\textrule[top]{Foo: \rawcountervalue[foox]}},
after={\incrementcounter[foox]}]
\starttext
Total of Foos: % those marks where retrieved from the text
Foo 1 -> mark1
Foo 2 -> mark2
Foo 3 -> mark3
\startfoo \setmark{mark1} \stopfoo
\startfoo \setmark{mark2} \stopfoo
\startfoo \setmark{mark3} \stopfoo
\stoptext
我希望我已经把这一点表达清楚了。
答案1
所有用创建的计数器\definecounter
都存储在辅助文件中,ConTeXt 已提供命令来访问其最后一个值。如果您只想打印文档中的最后一个值,您可以type=last
在第二个参数中使用\convertedcounter
。
\definecounter [amadeus]
\startbuffer [amadeus]
\starttabulate[|l|l|][before=,after=]
\NC First value \EQ \convertedcounter [amadeus] [type=first] \NC\NR
\NC Previous value \EQ \convertedcounter [amadeus] [type=previous] \NC\NR
\NC Current value \EQ \convertedcounter [amadeus] \NC\NR % \convertedcounter [amadeus] [type=number]
\NC Next value \EQ \convertedcounter [amadeus] [type=next] \NC\NR
\NC Last value \EQ \convertedcounter [amadeus] [type=last] \NC\NR
\stoptabulate
\stopbuffer
\define\ShowAmadeus
{\incrementcounter[amadeus]
\starttextrule{Amadeus \convertedcounter [amadeus]}
\getbuffer[amadeus]
\stoptextrule}
\starttext
\dorecurse{5}{\ShowAmadeus}
\stoptext
如果您想使用这些值进行计算(例如\numexpr
),您必须使用以下命令为您提供计数器的原始值,这意味着不对它们应用任何格式或转换。
\definecounter [amadeus]
\startbuffer [amadeus]
\starttabulate[|l|l|][before=,after=]
\NC First value \EQ \firstcountervalue [amadeus] \NC\NR
\NC Previous value \EQ \prevcountervalue [amadeus] \NC\NR
\NC Current value \EQ \rawcountervalue [amadeus] \NC\NR
\NC Next value \EQ \nextcountervalue [amadeus] \NC\NR
\NC Last value \EQ \lastcountervalue [amadeus] \NC\NR
\stoptabulate
\stopbuffer
\define\ShowAmadeus
{\incrementcounter[amadeus]
\starttextrule{Amadeus \convertedcounter [amadeus]}
\getbuffer[amadeus]
\stoptextrule}
\starttext
\dorecurse{5}{\ShowAmadeus}
\stoptext
答案2
在@Metafox发表评论之后,我发现了这些链接:在 tuc 文件中存储和检索数据和系统宏/键值分配我从该问题中得出了一个解决方案,它将状态存储在.tuc 文件中:
\definecounter[foox]
\setcounter[foox][1]
\definedataset[foo]
\setdataset[foo][total={\lastcountervalue[foox]}]
\define[1]\SetMark{
\setdataset[foo][pos={\rawcountervalue[foox]}, mark={#1}]
}
\definestartstop
[foo]
[before={\textrule[top]{Foo: \rawcountervalue[foox]}},
after={\incrementcounter[foox]}]
\starttext
Total of Foos:
\dostepwiserecurse{2}{\datasetvariable{foo}{1}{total}}{1}
{Foo \datasetvariable{foo}{\recurselevel}{pos} -> \datasetvariable{foo}{\recurselevel}{mark}\blank}
\startfoo \SetMark{mark1} \stopfoo
\startfoo \SetMark{mark2} \stopfoo
\startfoo \SetMark{mark3} \stopfoo
\stoptext