在下面的代码中,我在测试中遇到了一个问题\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})}%
}%
}