Использование acro и mhchem внутри chemfig

Использование acro и mhchem внутри chemfig

Послезапись в блоге Джозефа Райта, я хотел использовать 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, что мне и было нужно.

Я попробовал использовать пять \expandafters вокруг \printatomмакроса. Это исправило проблему с аббревиатурой, и шрифт остался таким же, как и окружающий шрифт sans-serif, но разбор по \ceбольше не выполняется правильно. Обратите внимание на неиндексную 2:

Содержимое не анализируется mhchem

Буду весьма признателен за любые предложения о том, как получить и то, и другое 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}

Связанный контент