我的文档中有一些文本在整个文档中重复出现多次,因此我定义了一个自定义宏,例如:
\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并阅读字符串编号.mkiv和 strc-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. 对此的评论。