保存第二遍编译的值

保存第二遍编译的值

我如何保存要在第二次编译中使用的值(状态)?

例如,看这个简单的例子:

\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

快照: 结果

相关内容