本质上我想使用 为我的化合物编号添加“子子标签” chemnnum
。
我为什么以及如何想要这个
我正在描述一系列手性化合物,并给它们编号1a,1b等等。有时我还会得到化合物的另一种非对映异构体:比如说1b已在第 2 位发生差向异构化 - 我想将其命名为2-表皮-1b(主管的偏好)。
我现在怎么做
目前我只是重复使用现有的参考资料1b使用粗体前缀,像这样:\textbf{2-epi-}\refcmpd{one.b}
,但我发现这不方便并且容易出错。
我想怎么做
我当时想在第一个之后直接将相应的子计数器减少 1 \cmpd{one.b}
,然后立即声明一个像这样的差向异构化合物:\labelcmpd[pre-label-code=\textbf{2-epi-}]{one.b:epi}
。不幸的是,我了解到没有子计数器,因为chemnum
将子标签的当前 ID 号存储为expl3
int
s,我不知道如何与它们交互。
问题
是否可以手动将内部子标签计数器减少 1 chemnum
?如果可以,该怎么做?或者也许有更好/替代的方法在我的化合物编号中引入“子子标签”?
答案1
chemnum
在阅读了软件包的源代码并学习了一些expl3
编程知识后,我想到了一个巧妙的方法来做到这一点。我创建了一个新命令,它定义了一个标签(但不打印它,就像\lebelcmpd
),模仿给定的标签和子标签。代码:
\ExplSyntaxOn
\int_new:N \l__chemnum_tmpnum_int
% #1: options, #2: main ID, #3: sub ID, #4: new main ID
\NewDocumentCommand {\sublabelcmpd} {O{ }mmm} {
% stash main counter value
\int_set:Nn \l__chemnum_tmpnum_int {\value{cmpdmain}}
% set main counter, that it will produce #2 label again
\setcounter {cmpdmain} {\int_eval:n {\cmpdproperty{#2}{number}-1}}
% define new compound disguised as #2 with dummy sub compound
\chemnum_cmpd:nnnn {\c_true_bool} {\c_false_bool} {#1} {#4.subundefined}
% set sub counter to produce desired sub label #3
\int_set:cn {g__chemnum_compound_#4_subcompound_int} {\subcmpdproperty{#2}{#3}{number}-1}
% define new sub compound disguised as #2.#3
\chemnum_cmpd:nnnn {\c_true_bool} {\c_false_bool} {#1} {#4.#3}
% revert previous main counter state
\setcounter {cmpdmain} {\l__chemnum_tmpnum_int}
}
\ExplSyntaxOff
这样,我可以为看似以前使用过的标签提供不同的/额外的选项。此方法需要一个新的主标签,因为选项与主标签相关联且无法更改。语法是\sublabelcmpd[<options>]{<main ID>}{<sub ID>}{<new main ID>}
,然后可以简单地用引用新化合物\cmpd{<new main ID>}{<sub ID>}
。举个例子:
Compounds \cmpd{one.a} and \cmpd{one.b} are defined as usual.
Then a new compound is defined using
\verb#\sublabelcmpd[pre-label-code=\textbf{2-epi-}]{one}{b}{epi:one}#.
\sublabelcmpd[pre-label-code=\textbf{2-epi-}]{one}{b}{epi:one}
This newly defined compound will have the same label as \cmpd{one.b},
but with additional options, and can be referenced normally: \cmpd{epi:one.b}.
将产生: