如何检查这是第一次还是最后一次在 ConTeXt 中使用宏?

如何检查这是第一次还是最后一次在 ConTeXt 中使用宏?

我的文档中有一些文本在整个文档中重复出现多次,因此我定义了一个自定义宏,例如:

\define\mymacro{
    \section{A}
        There is some text.
    \section{B}
        This is some more text.
    \section{C}
        This is yet some more text.
}

看起来是这样的:

 _______________________
|                       |
| 1.1 A                 |
|    This is some text. |
| 1.2 B                 |
|    This is some more  |
|    text.              |
| 1.3 C                 |
|    This is yet some   |
|    more text.         |
|_______________________|

我需要在两种情况下使用不同的宏来呈现效果。

  • 宏第一次出现在文档中时,A 部分的标题和内容不应该出现。相反,会出现替代文本。
  • 最后一次宏出现在文档中时,C 部分的标题和内容不应该出现。相反,那里什么也没有出现。

如何创建一个条件来检查这是第一次还是最后一次使用宏,并相应地修改显示的文本?

答案1

计数器很有用。在这里,我主要从 Lua 端访问它们,用于structures.counters.value访问值、structures.counters.add递增以及structures.counters.last获取文档中出现的最高值。从 TeX 端,我会使用\rawcounter\incrementcounter\lastcounter。有关计数器 API 的更多信息,请参阅http://wiki.contextgarden.net/Counters并阅读字符串编号.mkivstrc-num.lua

\definecounter[mystuff]

\startluacode
    userdata = userdata or { }
    function userdata.domystuff() 
        -- * We must increment before, not after, or else the last value
        --   of the counter will always be one more than the value at last
        --   printing
        -- * I don't know why all these functions need a 1 as their second argument.
        structures.counters.add("mystuff", 1, 1)
        counter_val = structures.counters.value("mystuff", 1)
        if counter_val == 1 then
            context.section("A")
            context("We are at counter %s, the first counter.", counter_val)
        else
            context.section("A")
            tex.sprint("We are at counter \\rawcountervalue[mystuff]")
        end

        context.section("B")
        tex.sprint("section B's text")

        if not (counter_val == structures.counters.last("mystuff", 1)) then
            context.section("C")
            context("Last", counter_val)
        else
            context.par() -- start a new paragraph
            context("(Last section omitted)")
        end
        context.hairline()
    end
\stopluacode

% Define a TeX command to call the Lua function
\def\domystuff{\ctxlua{userdata.domystuff()}}

% Let's try it out
\starttext
    \startcolumns[n=2]
        \dorecurse{3}{
            \domystuff
        }
    \stopcolumns
\stoptext

感谢 Aditya 的回答这里,并感谢 Scott H. 对此的评论。

相关内容