无法将 acmsmall 的 narrowfig 与 hyperref 一起使用

无法将 acmsmall 的 narrowfig 与 hyperref 一起使用

我正在尝试使用narrowfig来自acmsmall类。下面的操作没有问题:

\documentclass{acmsmall}
\begin{document}
\begin{narrowfig}{.5\linewidth}
  Foo
  \caption{Bar}
\end{narrowfig}
\end{document}

hyperref但是,当包含时,这会因以下错误而中断:

!缺失数字,视为零。
 
                   {
l.6 \caption{酒吧}

我认为hyperref这是以一种不兼容的方式重新定义了一些图形机制,acmsmall但是,遗憾的是,我没有必要的 LaTeX 知识来找出确切的问题。

答案1

acmsmall期望\r@@nf<n>(其中<n>是图形的数字)扩展为

{<figure number>}{<page number>}

以便根据奇数或偶数页码设置条件。相反,使用ishyperref的扩展\r@@nf<n>

{<figure number>}{<page number>}{...}{...}{...}

有五个支撑组,而不是两个。这打破了机制。

最简单的解决方法是使用refcount包,它自己知道是否hyperref已加载并且在每种情况下都执行正确的操作。

我们需要改变\@seteven类中的宏:

\documentclass{acmsmall}

\usepackage{refcount}
\usepackage{hyperref}

\usepackage{lipsum} % just to fill with some mock text

\makeatletter
\def\@seteven{%
    \@nfeventrue
    \edef\@tmpnf{\getpagerefnumber{@nf\thefigure}}%
    \ifodd\@tmpnf\relax
        \@nfevenfalse
    \fi
    \label{@nf\thefigure}%
    \edef\@tmpnfx{\if@nfeven e\else o\fi}%
    \edef\@tmpnf{%
        \write\@unused{%
            \noexpand\ifodd \noexpand\c@page
                \noexpand\if \@tmpnfx e%
                    \noexpand\@nfmsg{\thefigure}
                \noexpand\fi
            \noexpand\else
                \noexpand\if \@tmpnfx o%
                    \noexpand\@nfmsg{\thefigure}%
                \noexpand\fi
            \noexpand\fi
        }%
    }%
    \@tmpnf
}
\makeatother

\begin{document}
\lipsum[1-2]

\begin{narrowfig}{.5\linewidth}[htp]
  Foo
  \caption{Bar}
\end{narrowfig}

\lipsum

\begin{narrowfig}{.5\linewidth}[htp]
  Foo
  \caption{Bar}
\end{narrowfig}

\end{document}

相关内容