![多次使用缩写包 \Iac 命令时无法编译](https://linux22.com/image/288642/%E5%A4%9A%E6%AC%A1%E4%BD%BF%E7%94%A8%E7%BC%A9%E5%86%99%E5%8C%85%20%5CIac%20%E5%91%BD%E4%BB%A4%E6%97%B6%E6%97%A0%E6%B3%95%E7%BC%96%E8%AF%91.png)
使用时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}