
Послезапись в блоге Джозефа Райта, я хотел использовать mhchem
в chemfig
. Все шло хорошо, пока я не решил включить аббревиатуры пакетом acro
. С помощью следующего MWE аббревиатура определяется как используемая, но не включена в список аббревиатур.
\documentclass{article}
\usepackage{acro}
\usepackage{chemfig}
\usepackage[version=4]{mhchem}
\DeclareAcronym{boc}{short=Boc,long=\textit{tert}-butyloxycarbonyl}
% From http://www.texdev.net/2012/08/25/exploring-chemfig-customising-appearance/
\makeatletter
\def\CF@node@content{%
\expandafter\expandafter\expandafter%\expandafter\expandafter%
\printatom\expandafter\expandafter\expandafter%\expandafter\expandafter%
{\csname atom@\number\CF@cnt@atomnumber\endcsname}%
\ensuremath{\CF@node@strut}%
}
\makeatother
\renewcommand*{\printatom}[1]{{\ce{#1}}}
\begin{document}
\sffamily
\acifused{boc}{Boc is used}{Boc is not used}
\chemfig{\acs{boc}HN-R-NH2}
\acifused{boc}{Boc is used}{Boc is not used}
\printacronyms
\end{document}
Когда код из поста в блоге удален, все снова работает нормально, но мне очень понравилась возможность использовать его \ce
изнутри \chemfig
. Кроме того, он заставил \chemfig
использовать текстовый шрифт sans-serif вместо шрифта serif math, что мне и было нужно.
Я попробовал использовать пять \expandafter
s вокруг \printatom
макроса. Это исправило проблему с аббревиатурой, и шрифт остался таким же, как и окружающий шрифт sans-serif, но разбор по \ce
больше не выполняется правильно. Обратите внимание на неиндексную 2:
Буду весьма признателен за любые предложения о том, как получить и то, и другое acro
и mhchem
как работать внутри .chemfig
решение1
Из-за вашего переопределения \acs
команда обрабатывается более одного раза, но поскольку первая обработка — это обоснованное предположение — выполняется только для измерения содержимого, команды записи из acro не выполняются, и поэтому он не записывает необходимые данные \acro@used@once
во вспомогательный файл, а только \acro@used@twice
из фактического набора текста.
Вы бы получили похожее поведение также, если бы использовали acro внутри align
(проверено) и, вероятно, tabularx
и в другой среде, которая обрабатывает свой контент дважды. Так что imho это ошибка: acro должен проверить этот случай.
Вы должны уведомить автора, в качестве обходного пути вы можете попробовать следующее. Имейте в виду, что с точки зрения acro этот ключ был использован дважды. Поэтому специальный стиль для "одиночных" случаев не будет работать.
\documentclass{article}
\usepackage{acro}
\usepackage{chemfig,amsmath}
\usepackage[version=4]{mhchem}
\DeclareAcronym{boc}{short=Boc,long=\textit{tert}-butyloxycarbonyl}
%% From http://www.texdev.net/2012/08/25/exploring-chemfig-customising-appearance/
\makeatletter
\def\CF@node@content{%
\expandafter\expandafter\expandafter%\expandafter\expandafter%
\printatom\expandafter\expandafter\expandafter%\expandafter\expandafter%
{\csname atom@\number\CF@cnt@atomnumber\endcsname}%
\ensuremath{\CF@node@strut}%
}
\ExplSyntaxOn
\cs_set_protected:Npn \acro@used@twice #1#2#3#4
{
\bool_if:cF {g__acro_#1_in_list_bool}
{\acro@used@once {#1}{#2}{#3}{#4}}
\cs_gset_nopar:cpn {acro@#1@twice} {#1}
\tl_if_empty:nF {#2#3#4}
{ \seq_gput_right:cn {g__acro_#1_pages_seq} { {#2}{#3}{#4} } }
}
\ExplSyntaxOff
\makeatother
\renewcommand*{\printatom}[1]{{\ce{#1}}}
\begin{document}
\sffamily
\acifused{boc}{Boc is used}{Boc is not used}
\chemfig{\acs{boc}HN-R-NH2}
\acifused{boc}{Boc is used}{Boc is not used}
\printacronyms
\end{document}