测试当前页码与所指参考页码之间的相等性

测试当前页码与所指参考页码之间的相等性

在下面的代码中,我在测试中遇到了一个问题\ifthenelse{\equal{\pageref{#1}}{\thepage}}{...}{...}。如果引用位于使用和定义它的同一页面中,为什么它无法检测到期望的相等性?

% Sources : 
%   * http://tex.stackexchange.com/questions/35095/special-footnotes-for-url/35097#35097
%   * http://tex.stackexchange.com/questions/35043/how-to-reference-different-places-to-the-same-footnote
%   * http://forum.mathematex.net/latex-f6/forcer-le-retour-a-la-ligne-dans-texttt-t13246.html#p127511
%   * http://tex.stackexchange.com/questions/33465/changing-the-catcode-of-in-one-command

\documentclass[10pt]{article}
    \usepackage[svgnames]{xcolor}
    \usepackage{manyfoot}
    \usepackage{xifthen}
    \usepackage{hyperref}
    \usepackage{varioref}

% Cosmetic
    \hypersetup{urlcolor=blue}
    \definecolor{urlColor}{named}{DarkRed}

    \newcommand{\urlText}[2][0]{%
        \textcolor{urlColor}{%
            \ifthenelse{\equal{#1}{0}}{%
                \textbf{#2}%
            }{%
                #2%
            }%
        }%
    }

% Special footnote
    \newfootnote{Url}

    \newcounter{footnoteUrl}
    \newcommand{\footnoteUrl}{%
%       \renewcommand\thefootnoteUrl{\Alph{footnoteUrl}}
        \stepcounter{footnoteUrl}%
        \Footnotemark{\urlText{\#\thefootnoteUrl}}\FootnotetextUrl{}%
    }

% New url
    \newcommand{\newUrl}[2][0]{%
        \urlText{http://link/}%
        \ifthenelse{\equal{#1}{0}}{%
            \footnoteUrl{\, \url{#2}}%
        }{%
            \footnoteUrl{\,\label{#1} \url{#2}}%
        }%
    }

%%%%%%%%%%%%%%%%%%%%%%%%%%
% THE PROBLEM IS HERE... %
%%%%%%%%%%%%%%%%%%%%%%%%%%

% Old url
    \newcommand{\oldUrl}[1]{%
        \urlText{http://link/\textsuperscript{\ref{#1}}}%
        \ifthenelse{\equal{\pageref{#1}}{\thepage}}{}{%
            \urlText[1]{(cf.\,page\,\pageref{#1})}%
        }%
    }

    \usepackage{lipsum}


\begin{document}

Let's try to indicate one URL \newUrl[linkGoogle]{http://www.google.fr/}
and another \newUrl{http://tex.stackexchange.com/}.
Let's try to indicate one old URL \oldUrl{linkGoogle}.
and one more \newUrl{http://tug.org/texlive/pkginstall.html}
and another \newUrl[ctan]{http://www.ctan.org/}
 and then the same \oldUrl{ctan}.
I would like to indicate something \footnote{... but here !}.

\lipsum

Just only old URLS \oldUrl{linkGoogle} and \oldUrl{ctan}.
I would like to indicate something \footnote{... but here !}.
\lipsum

Just only old URLS \oldUrl{linkGoogle} and \oldUrl{ctan}.
I would like to indicate something \footnote{... but here !}.

\end{document}

答案1

由于您使用了hyperref,您的\pageref不仅仅是一个数字,而是一个链接。因此它不能等于\thepage

幸运的是,varioref包提供了命令\vrefpagenum,它将第二个参数生成的页面标签分配给其第一个参数(宏!)。

这对我有用:

\newcommand{\oldUrl}[1]{%
  \vrefpagenum{\urlpage}{#1}%
    \urlText{http://link/\textsuperscript{\ref{#1}}}%
    \ifthenelse{\equal{\urlpage}{\thepage}}{}{%
        \urlText[1]{(cf.\,page\,\pageref{#1})}%
    }%
}

更新:请注意 Gonzalo Medina 的回答中关于页码的重要警告

答案2

您可以使用refcount包;来自文档:

参考文献不是数字,但是它们通常存储数字数据,例如章节或页码。\ref或者\pageref不能用于计数器分配或计算,因为它们不可扩展、会生成警告,甚至不能是链接,该包提供了可扩展的宏来从参考文献中提取数据。

因此,你可以这样说

\usepackage{refcount}

\newcommand{\oldUrl}[1]{%
    \urlText{http://link/\textsuperscript{\ref{#1}}}%
    \ifthenelse{\equal{\getpagerefnumber{#1}}{\thepage}}{}{%
        \urlText[1]{(cf.\,page\,\pageref{#1})}%
    }%
}

此外,由于异步页面构建机制,依赖 并不完全安全\thepage。一个标准技巧是使用 \label,然后为该标签调用 \pageref,因此您可以使用类似

\usepackage{refcount}

\newcounter{sp}
    \newcommand{\oldUrl}[1]{%
        \stepcounter{sp}\label{sp-\thesp}%
        \urlText{http://link/\textsuperscript{\ref{#1}}}%
        \ifthenelse{\equal{\getpagerefnumber{#1}}{\getpagerefnumber{sp-\thesp}}}{}{%
            \urlText[1]{(cf.\,page\,\pageref{#1})}%
        }%
    }

相关内容