首字母缩略词 \acresetall & cleveref:多重定义标签

首字母缩略词 \acresetall & cleveref:多重定义标签

我正在使用acronym包来扩展首字母缩略词,我也在使用该cleveref包。我希望每章扩展一次首字母缩略词。例如,在以下代码中,两个首字母缩略词都应产生扩展:

\documentclass{report}
\usepackage{acronym}
\usepackage{cleveref}

\acrodef{ac}{Acronym}

\begin{document}
\chapter{one}

\ac{ac} 

\acresetall
\chapter{two}

\ac{ac}
\end{document}

根据acronym手册,我发现在每章之前调用\acresetall会产生所需的结果,但我会收到有关重复标签的警告(某种程度上与 冲突cleveref)。还有其他方法可以获得所需的结果或避免警告吗?

答案1

您可以尝试以下操作:

\documentclass{report}
\usepackage{acronym}
\usepackage{cleveref}
\makeatletter
\renewcommand*\@verridelabel[1]{%
  \@bsphack
  \protected@write\@auxout{}{\string\undonewlabel{#1}}%
  \protected@write\@auxout{}{\string\undonewlabel{#1@cref}}%Added for cleverref
  \label{#1}%
  \@overriddenmessage rs{#1}%
  \@esphack
}%
\makeatother
\acrodef{ac}{Acronym}

\begin{document}
\chapter{one}

\ac{ac}

\acresetall
\chapter{two}

\ac{ac}
\end{document}

答案2

cleveref扩展\label{<name>}为 add \label{<name>@cref}。并且包在第一章和第二章中acronym设置了两次标签\label{acro:ac}。但是它在设置第二个标签之前撤消了第一个标签,来自文件.aux

\AC@undonewlabel{acro:ac}
\newlabel{acro:ac}{{1}{1}}

2015/03/21 v1.41 之前的版本acronym使用\undonewlabel代替\AC@undonuewlabel(参见 gtownescapee 的回答)。

下面的补丁对添加的标签做了相同的处理cleveref

\documentclass{report}
\usepackage{acronym}
\usepackage{cleveref}

\makeatletter
\newcommand*{\org@overidelabel}{}
\let\org@overridelabel\@verridelabel
\@ifpackagelater{acronym}{2015/03/21}{% v1.41
  \renewcommand*{\@verridelabel}[1]{%
    \@bsphack
    \protected@write\@auxout{}{\string\AC@undonewlabel{#1@cref}}%
    \org@overridelabel{#1}%
    \@esphack
  }%
}{% older versions
  \renewcommand*{\@verridelabel}[1]{%
    \@bsphack
    \protected@write\@auxout{}{\string\undonewlabel{#1@cref}}%
    \org@overridelabel{#1}%
    \@esphack
  }%
}
\makeatother

\acrodef{ac}{Acronym}

\begin{document}
\chapter{one}

\ac{ac} 

\acresetall
\chapter{two}

\ac{ac}
\end{document}

文件.aux

relax 
\reset@newl@bel
\newacro{ac}[ac]{Acronym}
\@writefile{toc}{\contentsline {chapter}{\numberline {1}one}{1}}
\@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }}
\AC@undonewlabel{acro:ac@cref}
\AC@undonewlabel{acro:ac}
\newlabel{acro:ac}{{1}{1}}
\newlabel{acro:ac@cref}{{[chapter][1][]1}{1}}
\acronymused{ac}
\@writefile{toc}{\contentsline {chapter}{\numberline {2}two}{2}}
\@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }}
\AC@undonewlabel{acro:ac@cref}
\AC@undonewlabel{acro:ac}
\newlabel{acro:ac}{{2}{2}}
\newlabel{acro:ac@cref}{{[chapter][2][]2}{2}}
\acronymused{ac}

答案3

接受的答案和@Heiko的答案都为我解决了这个问题,直到2015-03-21将首字母缩略词包更新为版本1.41。在此版本中,实现发生了变化,命令\undonewlabel被替换为\AC@undonewlabel命令。为了与v1.41兼容,我推荐@Heiko的答案,但将实例替换\undonewlabel\AC@undonewlabel

我本来想以评论的形式回复,但我还没有足够的声誉。

相关内容