删除所有 pdf 超链接,同时保留超链接格式

删除所有 pdf 超链接,同时保留超链接格式

我想将pdflatexPDF 文档拆分成两部分。第二部分引用了第一部分,这些引用是超链接,我想删除它们,不改变视觉外观。因此,我希望链接有颜色、有边框、有相同的文本、字体……无论它们看起来如何 - 我只是不想让它们再处于活动/可点击状态。例如,该draft选项使所有链接都显示为无色。

有没有一种快速的方法可以实现这一目标pdflatex

我曾尝试弄乱\pdfstartlink\pdfendlink,但似乎只需将它们重新定义为{}即可出现以下 pdf 参数\pdfstartlink- 否则它可以正常工作。

我尝试过的 MWE:

\documentclass{revtex4-1}
\usepackage[colorlinks]{hyperref}
\hypersetup{allcolors=[RGB]{0,0,255}}
\makeatletter
\let\pdfendlink\relax
\let\pdfstartlink\relax
%\let\pdfstartlink\@gobble
%\let\pdfstartlink\@gobbletwo
%\let\pdfstartlink\@gobblethree
%\let\pdfstartlink\@gobblefour
%\def\pdfstartlink#1{}
%\def\pdfstartlink#1#2{}
%\def\pdfstartlink#1#2#3{}
\makeatother
\begin{document}
    Reference to \ref{Test}.
    \section{Test}
    \label{Test}
\end{document}

\pdfstartlink该问题似乎与如下使用方式有关:

\pdfstartlink attr{#1}goto name{#2}\relax

因此,我基本上需要\def \pdfstartlink接受直到第二个封闭}(或\relax)的论点,但我发现自己无法做到这一点。

这是一个更复杂的测试用例:

\documentclass{revtex4-1}
\usepackage{hyperref}
\makeatletter
\def\Hy@StartlinkName#1#2{}
\def\close@pdflink{%
    \Hy@endcolorlink
    \Hy@VerboseLinkStop
}
\makeatother
\begin{document}
    \href{X}{Y} \href{X}{Y} \href{X}{Y} \href{X}{Y} \href{X}{Y} \href{X}{Y} \href{X}{Y} \href{X}{Y} \href{X}{Y} \href{X}{Y} \href{X}{Y}
\end{document}

答案1

这是一个稍微删节的版本,也允许开关(激活/停用补丁):

在此处输入图片描述

\documentclass{article}
\usepackage[colorlinks]{hyperref}
\hypersetup{allcolors=[RGB]{0,0,255}}

\usepackage{etoolbox}

\def\pdfnolink#1\relax{}% \pdfnolink gobbles everything up to the next \relax
\def\pdfendnolink{}% Just a marker for replacement purposes

\makeatletter
\newcommand{\DisableHyperlinks}{%
  \patchcmd{\close@pdflink}{\pdfendlink}{\pdfendnolink}{}{}
  \patchcmd{\Hy@StartlinkName}{\pdfstartlink}{\pdfnolink}{}{}% for references
  \patchcmd{\hyper@linkurl}{\pdfstartlink}{\pdfnolink}{}{}% for \href{http://...}{...}
  \patchcmd{\hyper@linkfile}{\pdfstartlink}{\pdfnolink}{}{}% for \href{XYZ...}{...}
}
\newcommand{\EnableHyperlinks}{%
  \patchcmd{\close@pdflink}{\pdfendnolink}{\pdfendlink}{}{}
  \patchcmd{\Hy@StartlinkName}{\pdfnolink}{\pdfstartlink}{}{}% for references
  \patchcmd{\hyper@linkurl}{\pdfnolink}{\pdfstartlink}{}{}% for \href{http://...}{...}
  \patchcmd{\hyper@linkfile}{\pdfnolink}{\pdfstartlink}{}{}% for \href{XYZ...}{...}
}
\makeatother

\setlength{\parindent}{0pt}% Just for this example
\begin{document}

\section{Many hyperlinks}\label{Hyperlinks}

Reference to Section~\ref{Hyperlinks}.

\href{http://www.google.com}{Google}

\hrulefill Hyperlinks disabled\hrulefill
% Disable all links
\DisableHyperlinks

Reference to Section~\ref{Hyperlinks}.

\href{http://www.google.com}{Google}

\hrulefill Hyperlinks enabled\hrulefill
%Enable all links
\EnableHyperlinks

Reference to Section~\ref{Hyperlinks}.

\href{http://www.google.com}{Google}

\end{document}

答案2

据我了解,“普通”链接的相关命令似乎是,\Hy@StartlinkName并且,驱动程序也是。\close@pdflinkhpdftex.defpdftexhyperref

删除\pdfstartlink\pdfendlink保留格式,但禁用可点击性。

注意:我并不认为此方法对所有出现的链接都适用,尤其是书签中的链接不是已禁用!

\documentclass{revtex4-1}
\usepackage{mathtools}
\usepackage[colorlinks]{hyperref}
\usepackage{cleveref}
\hypersetup{allcolors=[RGB]{0,0,255}}
\makeatletter

\newif\ifdisablelinks
\disablelinkstrue
\ifdisablelinks
\def\Hy@StartlinkName#1#2{%
  % \pdfstartlink attr{#1}goto name{#2}\relax
}

\def\close@pdflink{%
  \Hy@endcolorlink
  \Hy@VerboseLinkStop
  %\pdfendlink
}
\fi

\makeatother
\begin{document}
Reference to \ref{Test}.
\section{Test}
\label{Test}

\clearpage
\begin{equation}
  E=mc^2 \label{einstein}
\end{equation}
\pdfbookmark{einstein}{Einsteins equation}
\clearpage
In \cref{einstein} we see
\end{document}

答案3

我扩展了@Christian Hupfer 的解决方案;其思想原理是一样的。

\documentclass{revtex4-1}
\usepackage[colorlinks]{hyperref}
\hypersetup{allcolors=[RGB]{0,0,255}}

\usepackage{xpatch}
\makeatletter
\patchcmd{\close@pdflink}{\pdfendlink}{}{}{error}

% for references
\patchcmd{\Hy@StartlinkName}{\pdfstartlink attr{#1}goto name{#2}\relax}{}{}{error}

% for \href{http://...}{...}
\patchcmd{\hyper@linkurl}{\pdfstartlink
    attr{%
        \Hy@setpdfborder
        \ifx\@pdfhightlight\@empty
        \else
        /H\@pdfhighlight
        \fi
        \ifx\@urlbordercolor\relax
        \else
        /C[\@urlbordercolor]%
        \fi
    }%
    user{%
        /Subtype/Link%
        \ifHy@pdfa /F 4\fi
        /A<<%
        /Type/Action%
        /S/URI%
        /URI(\Hy@pstringURI)%
        \ifHy@href@ismap
        /IsMap true%
        \fi
        \Hy@href@nextactionraw
        >>%
    }%
    \relax}{}{}{error}

% for \href{XYZ...}{...}
\patchcmd{\hyper@linkfile}{\pdfstartlink
    attr{%
        \Hy@setpdfborder
        \ifx\@pdfhighlight\@empty
        \else
        /H\@pdfhighlight
        \fi
        \ifx\@filebordercolor\relax
        \else
        /C[\@filebordercolor]%
        \fi
    }%
    user {%
        /Subtype/Link%
        \ifHy@pdfa /F 4\fi
        /A<<%
        /F(\Hy@pstringF)%
        /S/GoToR%
        \Hy@SetNewWindow
        \ifx\\#3\\%
        /D[\Hy@href@page\@pdfremotestartview]%
        \else
        /D(\Hy@pstringD)%
        \fi
        \Hy@href@nextactionraw
        >>%
      }%
      \relax}{}{}{error}
\makeatother

\begin{document}
    Reference to section \ref{Hyperlinks}.

    \section{Many hyperlinks}
    \label{Hyperlinks}

    \href{http://www.google.com}{Google}
    \href{A}{A}
    \href{B}{B}
    \href{C}{C}
    \href{X}{X}
    \href{Y}{Y}
    \href{Z}{Z}
    \href{1}{1}
    \href{2}{2}
    \href{3}{3}
    \href{4}{4}
    \href{5}{5}
\end{document}

对于其他类型的链接可能需要进一步扩展,但到目前为止,我很高兴。

相关内容