使用 command=list 和多个实例的命名空间定义

使用 command=list 和多个实例的命名空间定义

我刚刚开始为 ConTeXt(版本 2017.05.09)创建一个模块,遇到了一个相当奇怪的问题,参数command=list似乎不受尊重。为了给这些问题提供一些背景信息,最好先放我的代码:

\startmodule[era]
\definenamespace[era][
    type=module,
    name=era,
    command=list,
    setup=list,
]

\setupera[
    start=,
]

\define[2]\namedordefaulteraparameter{%
    \doifsomethingelse
        {\namederaparameter{#1}{#2}}
        {\namederaparameter{#1}{#2}}
        {\eraparameter{#2}}%
}


\define[1]\doplaceera{%
    #1: \namedordefaulteraparameter{#1}{start}\par
}
\def\placeera[#1]{%
    \processcommalist[#1]\doplaceera%
}


\stopmodule
\endinput

在另一个文件中引用:

\usemodule[era]

\defineera[be,ah,rc,rs][start=0]
\setupera[be][start=1]


\starttext

\placeera[be,rs]

\stoptext

从此,我希望生成一个包含以下内容的文件:

是: 1

回覆: 0

这不是我想要的结果。“be: 1”运行正常,如果我start在模块文件中更改默认值或包含\setupera[start=0](不引用任何特定实例),所有内容都会按预期显示,所以我知道大多数代码都有效。但出于某种原因,除非我包含其中一种补偿方式,否则第二行只是“rs:”,就好像start=0从未设置过一样。

我查看了邮件列表,据我所知这条信息(似乎是讨论这个问题的少数人之一),一切都应该正确。然而,特别奇怪的是,\defineera如果我仅有的尝试定义rs——好像\definenamespace刚刚被传递command=yes——但\setupera非常乐意接受列表(\setupera[be,rs][start=1]将两者都设置为 1)。这是我自己的代码中的问题,还是 ConTeXt 中的错误?

答案1

这更像是一个界面错误。该选项command=list不应该是一个有效的选择。ConTeXt 核心中没有实例

\define<NAME>[...,...][...=...,...=...]

是有效的。我已将这个问题发布在邮件列表

但是,既然您想使用它,那么您可以对其进行修补。

\definenamespace
  [era]
  [
    type=module,
    name=era,
    command=list,
    setup=list,
    set=list,
  ]

\setupera[
    start=,
]

\define[2]\namedordefaulteraparameter{%
    \doifsomethingelse
        {\namederaparameter{#1}{#2}}
        {\namederaparameter{#1}{#2}}
        {\eraparameter{#2}}%
}


\define[1]\doplaceera{%
    #1: \namedordefaulteraparameter{#1}{start}\par
}
\def\placeera[#1]{%
    \processcommalist[#1]\doplaceera
}

\unprotect
\unexpanded\def\defineera{\dotripleempty\patch_define_era}
\def\patch_define_era[#1][#2][#3]{\processcommalist[#1]{\patch_define_era_nested{#2}{#3}}}
\def\patch_define_era_nested#1#2#3{\define_era[#3][#1][#2]}
\protect

\defineera[be,ah,rc,rs][start=0]
\setupera[be][start=1]

\starttext

\placeera[be,rs]

\stoptext

相关内容