多次使用缩写包 \Iac 命令时无法编译

多次使用缩写包 \Iac 命令时无法编译

使用时acronym软件包(当前版本 2012/10/29 v1.38)带有 hyperref,大写不定冠词命令\Iac在某些情况下无法编译。此代码

\documentclass{article}

\usepackage{acronym}
\usepackage{hyperref}

\begin{document}
\begin{acronym}
  \acro {HMM} {Hidden Markov Model}
  \acroindefinite {HMM} {an} {a}
\end{acronym}

\Iac{HMM}
\Iac{HMM}


\end{document}

结果是

! Undefined control sequence.
\hyper@@link ->\let \Hy@reserved@a 
                                   \relax \@ifnextchar [{\hyper@link@ }{\hyp...
l.13 \Iac{HMM}

我联系了软件包维护者,他没有时间修复此问题,但如果提交给他,他会将补丁合并到 .sty 文件中。因此,我的问题是是否有人可以为我提供可以在 .tex 文件中使用的解决方法或针对 .sty 文件中错误的补丁。

到目前为止,我检查了以下不定冠词命令的组合:

\Iac used once works fine
\Iac used twice for the same acronym DOES NOT WORK

\Iac* works multiple times
\Iac* then \Iac on the same acronym works
\Iac then \Iac* on the same acronym DOES NOT WORK

\iac works multiple times
\iac then \Iac on the same acronym DOES NOT WORK
\Iac then \iac on the same acronym works
Note: \iac's behaviour is inverse to that of \Iac*

\iac* and \Iac on the same acronym works in both orders

由于我自己几乎不了解乳胶,所以任何帮助我都会非常感激。

答案1

正如怀疑的那样埃格尔问题是由 引起的\@firstupper。如果hyperref加载,则第一个标记是\AC@hyperlink,但它应该应用于 的第二个参数中的字符串\AC@hyperlink

以下示例修补程序\@Iac包含调用,如果存在则\@firstupper传播\@firstupper到第二个参数。\AC@hyperlink

\documentclass{article}

\usepackage{acronym}
\usepackage{hyperref}

\makeatletter
\newcommand*{\FU@iaci}[1]{%
   \ifcsname fn@#1@IL\endcsname
     \ifAC@dua
        \expandafter\FU@H\csname fn@#1@IL\endcsname%
     \else
        \expandafter\ifx\csname ac@#1\endcsname\AC@used
        \expandafter\FU@H\csname fn@#1@IS\endcsname
      \else
        \expandafter\FU@H\csname fn@#1@IL\endcsname
      \fi
     \fi
   \else
   A%
   \fi
}
\newcommand*{\FU@H}[1]{%
  \expandafter\futurelet\expandafter\@let@token\expandafter\FU@@H#1\@nil
}
\def\FU@@H#1\@nil{%
  \ifx\@let@token\AC@hyperlink
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi
  {%
    \FU@@@H#1\@nil
  }{%
    \@firstupper#1%
  }%
}
\def\FU@@@H\AC@hyperlink#1#2#3\@nil{%
  \AC@hyperlink{#1}{\@firstupper#2}%
  \ifx\\#3\\%
  \else
    \errmessage{Stuff after \string\hyperlink}%
  \fi
}
\renewcommand*{\@Iac}[1]{%
  \FU@iaci{#1} \ifAC@starred\ac*{#1}\else\ac{#1}\fi
}
\makeatother

\begin{document}
\begin{acronym}
  \acro {HMM} {Hidden Markov Model}
  \acroindefinite {HMM} {an} {a}
\end{acronym}

\Iac{HMM}

\Iac{HMM}

\end{document}

结果

在我看来,将不定冠词变成超链接有点奇怪。如果不定冠词保持原样,它甚至可以简化补丁:

\documentclass{article}

\usepackage{acronym}
\usepackage{hyperref}

\makeatletter
\renewcommand\AC@acroindefinite[3]{
  \@bsphack
  \protected@write\@auxout{}%
    {\string\newacroindefinite{#1}{#2}{#3}}%
  \@esphack
}
\makeatother

\begin{document}
\begin{acronym}
  \acro {HMM} {Hidden Markov Model}
  \acroindefinite {HMM} {an} {a}
\end{acronym}

\Iac{HMM}

\Iac{HMM}

\end{document}

结果,文章没有链接

相关内容