问题出在 \newtheorem
并不会展开第 2 个参数,所以保留的是 \l_theorem_chinese_tl
的最后一个定义。
这里提供使用 \keyval_parse:nnn
的方法,比用 prop 更为简洁、快速。
\ExplSyntaxOn
% 使用方法 \addtheorem{<style>}{<environment name>=<Chinese name>, <environment name>, ...}
\NewDocumentCommand \addtheorem { m m }
{
\tl_set:Nn \l_theorem_style_tl {#1}
\keyval_parse:nnn { \__theorem_new_theorem:nn { } } { \__theorem_new_theorem:nn } {#2}
}
\cs_new:Npn \__theorem_new_theorem:nn #1#2
{
\theoremstyle { \l_theorem_style_tl }
\tl_if_empty:nTF {#1}
{
\exp_last_unbraced:Ne \newtheorem { {#2} { \text_titlecase_first:n {#2} } }
\exp_last_unbraced:Ne \newtheorem { * {#2*} { \text_titlecase_first:n {#2} } }
}
{
\newtheorem {#1} {#2}
\newtheorem * {#1*} {#2}
}
}
\ExplSyntaxOff
还额外支持没有给出 <chinese name>
的情况,此时把 <environment name>
第一个字母大写作为 <chinese name>
。如果不想要这个特性,把 \tl_if_empty:nTF
的 true 分支删掉即可。
比如:
\addtheorem{definition}{
definition = 定义,
assume = 假设,
lemma = 引理,
question = 问题,
corollary
}
\addtheorem{remark}{
remark = 注
}
如果不知道某一个命令会不会展开它的参数,最好的解决办法是先展开参数(用 \exp_args:N..
或 \exp_last_unbraced:N..
),再传递给这个命令。
问 L3 展开提问——定理环境扩展