我刚刚开始为 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