
По сути, я хотел бы добавить «под-подметку» к нумерации моих соединений, используя chemnnum
.
Почему и как именно я этого хочу
Я описываю ряд хиральных соединений, нумеруя их1а,1би т. д. Иногда у меня есть еще один диастереомер соединения: скажем,1бэпимеризировался во 2-й позиции - я хотел бы назвать его2-эпи-1б(по усмотрению руководителя).
Как я это делаю сейчас
В настоящее время я просто повторно использую существующие ссылки на1бс жирным префиксом, например: \textbf{2-epi-}\refcmpd{one.b}
, но я считаю, что это неудобно и подвержено ошибкам.
Как бы я хотел это сделать
Я думал об уменьшении соответствующего подсчетчика на 1 сразу после первого \cmpd{one.b}
и немедленном объявлении эпимеризованного соединения следующим образом: \labelcmpd[pre-label-code=\textbf{2-epi-}]{one.b:epi}
. К сожалению, я узнал, что подсчетчика нет, поскольку chemnum
он хранит текущий идентификационный номер подметки как 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}.
будет производить: