断开带有反向链接和 ocgcolorlinks 设置的参考书目中的链接和转义字符

断开带有反向链接和 ocgcolorlinks 设置的参考书目中的链接和转义字符

我遇到以下情况:我必须使用ocgcolorlinks中的选项hyperref,这样链接才不会断开。所以我想到用 来将每个字符设置为链接\href。在整理了一些代码并只理解了一半的工作后,我找到了一个可行的解决方案:链接以及使用 catcode 转义 URL 中特殊字符的问题。

不幸的是,我们原本打算主要在参考书目中使用它,而当在中使用backref和时,一些宏或某些东西会被重新定义,因此转义在这里不起作用。我无法解决这个问题。pagebackrefhyperref

下面你会看到一个使用我的丑陋黑客的最小示例:

\documentclass{report}
\usepackage[T1]{fontenc}
\usepackage[ocgcolorlinks,breaklinks=true,backref=page,pagebackref=true]{hyperref}
\usepackage{url}

%adapted from http://tex-and-stuff.blogspot.com/2011/03/counting-number-of-characters-in-tex_10.html
\newcommand{\targetlink}{}
\def\gobblechar{\let\char= }
\newcount\charcount
\def\countunlessnil{%
  \ifx\char\nil \let\next=\relax%
  \else%
    \let\next=\auxcountchar%
    \advance\charcount by 1%
  \fi\next
}%
\def\assignthencheck{\afterassignment\checknil\gobblechar}
\def\checknil{%
  \ifx\char\nil%
     \let\next=\relax%
  \else%
     \oldhref{\targetlink}{\char}\allowbreak\let\next=\assignthencheck% %%this is the place where each char is processed
  \fi%
  \next%
}
\let\oldhref\href%
%inspired of http://tex.stackexchange.com/questions/20890/define-an-escape-underscore-environment and https://texfaq.org/FAQ-actinarg
\def\href#1{
    \renewcommand{\targetlink}{#1}%
\begingroup
\catcode`\_=12
\catcode`\&=12
\catcode`\~=12
\xhref
}
\def\xhref#1{
    \assignthencheck #1\nil%
    \endgroup
}%
\def\url{%
\begingroup
\catcode`\_=12
\catcode`\&=12
\catcode`\~=12
\xurl
}%
\def\xurl#1{
    \renewcommand{\targetlink}{#1}%
    \assignthencheck #1\nil%
    \endgroup
}%

\begin{document}
\url{http://a_b/c&d/~e}
\href{http://a_b/c&d/~e}{http://a_b/c&d/~e}
$\begin{array}{cc}s&ep\end{array}up_down$no~tilde

\bibliographystyle{diss1}
\begin{thebibliography}{1}
\bibitem[t]{test}
\newblock
\url{http://a_b/c&d/~e} %error here
\href{http://a_b/c&d/~e}{http://a_b/c&d/~e} %error here
$\begin{array}{cc}s&ep\end{array}up_down$no~tilde
\end{thebibliography}
\end{document}

输出应该是两倍:

 http://a_b/c&d/~e http://a_b/c&d/~e s epdownno tilde

知道发生了什么事吗?我该如何解决?请注意,转义源中的字符实际上不是一个选择,因为我是从数据库中获取的,而且它还会错误地设置链接。

我们也欢迎任何有关清理代码或\allowbreak仅插入非字母/空格的其他建议。

答案1

编辑于 2012 年 7 月 17 日,添加了一个解决方法,以解决 XeLaTeX 的不足\pdfliteral

编辑于 2012 年 8 月 1 日,以一致地处理 XeLaTeX 的不同原点位置

我一直在研究 ocgcolorlinks 的替代方法,该方法不会阻止设置文本中的换行符。而且它也不必做任何花招来重新定义宏、更改 catcode,甚至两次排版文本。(注意:我想我已经给正确的维护者发了电子邮件,hyperref看看这个解决方案是否对他们有用,但没有收到回复;与此同时,如果它对其他人有帮助,我会发布它。)因为我认为你的问题是问,“有没有一种相当强大的方法可以在保留奇数字符和宏的同时启用换行符ocgcolorlinks?”,我会回答这个问题,而不是尝试调试 catcode 和宏重新定义。这种方法对任何已经可以处理的东西都有效\url

下面的代码依赖于 PDF 中可选内容组含义的一个怪癖:虽然无论是否启用 OCG 都会发生颜色变化操作,但填充路径等图形操作是有条件的。而且,PDF 有一种模式,其中文本用于设置剪切路径,而不是渲染为实际文本。以下代码重新定义了一个hyperref内部函数,并生成可换行的可选颜色超链接:

\documentclass{article}
\usepackage[hyphens]{url}
\usepackage[ocgcolorlinks]{hyperref}
\usepackage{geometry}
\geometry{paperheight=2in,paperwidth=2in,margin=0.25in}

\makeatletter
\AtBeginDocument{%
    \newlength{\temp@x}%
    \newlength{\temp@y}%
    \newlength{\temp@w}%
    \newlength{\temp@h}%
    \def\my@coords#1#2#3#4{%
      \setlength{\temp@x}{#1}%
      \setlength{\temp@y}{#2}%
      \setlength{\temp@w}{#3}%
      \setlength{\temp@h}{#4}%
      \adjustlengths{}%
      \my@pdfliteral{\strip@pt\temp@x\space\strip@pt\temp@y\space\strip@pt\temp@w\space\strip@pt\temp@h\space re}}%
    \ifpdf
      \typeout{In PDF mode}%
      \def\my@pdfliteral#1{\pdfliteral page{#1}}% I don't know why % this command...
      \def\adjustlengths{}%
    \fi
    \ifxetex
      \def\my@pdfliteral #1{\special{pdf: literal direct #1}}% isn't equivalent to this one
      \def\adjustlengths{\setlength{\temp@h}{-\temp@h}\addtolength{\temp@y}{1in}\addtolength{\temp@x}{-1in}}%
    \fi%
    \def\Hy@colorlink#1{%
      \begingroup
        \ifHy@ocgcolorlinks
          \def\Hy@ocgcolor{#1}%
          \my@pdfliteral{q}%
          \my@pdfliteral{7 Tr}% Set text mode to clipping-only
        \else
          \HyColor@UseColor#1%
        \fi
    }%
    \def\Hy@endcolorlink{%
      \ifHy@ocgcolorlinks%
        \my@pdfliteral{/OC/OCPrint BDC}%
        \my@coords{0pt}{0pt}{\pdfpagewidth}{\pdfpageheight}%
        \my@pdfliteral{F}% Fill clipping path (the url's text) with
                           % current color
        %
        \my@pdfliteral{EMC/OC/OCView BDC}%
        \begingroup%
          \expandafter\HyColor@UseColor\Hy@ocgcolor%
          \my@coords{0pt}{0pt}{\pdfpagewidth}{\pdfpageheight}%
          \my@pdfliteral{F}% Fill clipping path (the url's text)
                             % with \Hy@ocgcolor
        \endgroup%
        \my@pdfliteral{EMC}%
        \my@pdfliteral{0 Tr}% Reset text to normal mode
        \my@pdfliteral{Q}%
      \fi
      \endgroup
    }%
}
\makeatother

\begin{document}
Text before a long url that can break at hyphens, followed by the url itself
\url{http://long-url-that-can-break.com}, then a little bit more
text after that lengthy url\dots
\end{document} 

它将文本渲染到剪切路径中,然后用当前(普通文本)颜色填充剪切路径。然后,在OCView内容组内,它将颜色更改为\Hy@ocgcolor并再次填充剪切路径。最终结果是屏幕上显示彩色文本,打印输出中显示普通文本。文本甚至仍然可以选择为文本,并且可以从文档中复制和粘贴 :)

两个注意事项:

  1. 如果你创建超链接文本,那么整个页面就会被填满\Hy@ocgcolor,因为默认的剪切路径是整个页面,直到您在其中添加了至少一个字符的路径......我尝试使用W nPDF 运算符创建一个新的剪切路径,但失败了;如果有人知道原因,欢迎改进。

  2. 不要让 URL 跨越分页符,否则第二页将再次被填充\Hy@ocgcolor,因为命令的后半部分(重置剪切模式并填充剪切路径)直到第二页才运行。但由于填充命令发生在第二页,而剪切路径没有发生,因此整个页面都会被填充……我尝试使用各种类似AtBeginPage- 的钩子来清理和恢复剪切路径,但它们没有在正确的时间运行。再次,欢迎任何专家建议。

答案2

B. Lerner 在此处建议的方法成为了hyperrefsocgcolorlinksocgx2软件包,v0.24 [2017/03/30]。此外,问题 1(空链接文本) 和 2 (分页符)可以解决。如果需要,可以链接↗嵌套

\usepackage{hyperref}
\usepackage[ocgcolorlinks]{ocgx2}

示例(打开分享LaTeX

\documentclass[a6paper]{scrartcl}

\usepackage[hyphens]{url}

\usepackage{hyperref}
\usepackage[ocgcolorlinks]{ocgx2}

\begin{document}\raggedright\huge
Empty links $\Rightarrow$\href{https://tex.stackexchange.com/q/47267}{\quad}$\Leftarrow$ don't do any harm.\\[1ex]

Text before a long url that can break at hyphens, followed by the url itself: \url{http://long-url-that-wraps-around-line-breaks-and-page-breaks-long-url-that-wraps-around-line-breaks-and-page-breaks-long-url-that-wraps-around-line-breaks-and-page-breaks.com}, then a little bit more
text after that lengthy url\dots
\end{document}

相关内容