ConTeXt 文档中的调用模式列表

ConTeXt 文档中的调用模式列表

我需要这样的文档

\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在某些情况下进行设置(讨论的问题这里),因此请注意。

在此处输入图片描述

相关内容