我需要这样的文档
\listcallingmodes
返回调用模式列表,也就是说,如果我运行
context --mode=mode1,mode2 file.tex
在file.tex
:
\starttext
\startmode[a1]
This is mode a1
\stopmode
Hello
\listcallingmodes
\stoptext
我想要得到
Hellp
mode1 mode2
请注意,在这个文件中,除了调用模式之外,我们还可以有其他模式
答案1
新答案:
如果您只需要通过命令行调用的那些模式,那么这项任务就更容易了。由于 ConTeXt 将命令行数据存储在environment
命名空间中,让我们利用这一点:
\startluacode
local listofcalledmodes = function()
local split = string.split
local flag = '^--c:mode='
local concat = table.concat
for _, v in pairs(environment.originalarguments) do
if v:find(flag) then
local w = split(v:gsub(flag, ""), ",")
context(concat(w, " "))
return
end
end
context("No modes set")
end
interfaces.implement{
name = "listofcalledmodes",
public = true,
actions = listofcalledmodes
}
\stopluacode
\starttext
\startTEXpage
My list of modes: \listofcalledmodes
\stopTEXpage
\stoptext
按以下方式编译您的文件(159.tex
这是我的文件):
context --mode=amode,anothermode,toomanymodes 159.tex
我得到以下结果:
旧答案:
我会向邮件列表请求功能,以便提供合适的宏。与此同时,以下内容在大多数情况下应该可以完成工作。由于模式在 TeX 端注册为以前缀命名的命令序列mode>
(在core-env.mkiv 和 core-env.mkxltex.hashtokens
),我们可以在(相关讨论)中查看它们这里)然而,如果我没记错的话,你不想系统模式(内部,标有星号),因此它们将被过滤掉:
\startluacode
local function listofmodes()
local s1, s2 = "^mode>[^%*]+", "^mode>"
context.blank() -- change this ad libitum
for _, v in pairs(tex.hashtokens()) do
if v:find(s1) and tex.modes[v:gsub(s2, "")] then
context(v:gsub(s2, ""))
context.par() -- also change this if needed
end
end
end
interfaces.implement{
name = "listofmodes",
public = true,
actions = listofmodes
}
\stopluacode
\starttext
Hi, there's a list of used modes: \listofmodes
\stoptext
但是,您可能需要一种解决方法,hash_extra=0
在某些情况下进行设置(讨论的问题这里),因此请注意。