添加

添加

cases从 amsmath.sty 复制了代码,并尝试将其包装\lbrace在宏中,然后添加一个\left.以使其编译。这当然会丢失大小信息,因此括号的大小不正确:

在此处输入图片描述

使用可调整大小但也可包裹在宏中的括号的一般步骤是什么?

笔记:

可能的解决方案:

  • 如果找不到通用解决方案,则可以选择通过可选参数手动指定括号的大小。
  • 我尝试将案例的内容排版成\savebox但遇到了困难,因为右侧有对齐点。

代码:

\documentclass{article}
\usepackage{amsmath}
\usepackage{hyperref}
\usepackage{xcolor}

%% https://tex.stackexchange.com/questions/85033/colored-symbols
\newcommand*{\mathcolor}{}
\def\mathcolor#1#{\mathcoloraux{#1}}
\newcommand*{\mathcoloraux}[3]{%
  \protect\leavevmode
  \begingroup
    \color#1{#2}#3%
  \endgroup
}

\makeatletter% 
    \renewenvironment{cases}{%  From amsmath.sty
      \matrix@check\cases\env@cases
    }{%
      \endarray\right.%
    }
    \def\env@cases{%
      \let\@ifnextchar\new@ifnextchar
      %\left\lbrace%                        <--- How do I replace this,
      \left.\hyperlink{sec:cases}{\mathcolor{red}{\lbrace}}% <-- with something like this, but get the right size
      \def\arraystretch{1.2}%
      \array{@{}l@{\quad}l@{}}%
    }
\makeatother

\begin{document}
\section{Cases Environment}\label{sec:cases}
The \verb|cases| environment is used for \dots.

\clearpage
\section{Piecewise Defined Function}

\[
f(x)  = 
    \begin{cases}
        1 & x < 0 \\
        0 & x = 0 \\
       -1 & x > 0.
    \end{cases}
\]

\end{document}

答案1

你可以尝试调整你的解决方案如何为分隔符着色,它基于收集材料并将其用于\vphantom。该amsmath包有方便的\collect@body帮助,但您还需要使用\ifnum0Knuth 的技巧,如https://tex.stackexchange.com/a/319031/15925align以避免在、gatherarray基于 s 构建的类似构造中使用时出现分组问题halign

示例输出

\documentclass{article}

\usepackage{amsmath}
\usepackage{hyperref}
\usepackage{xcolor}

\newcommand{\BracKern}{\kern-\nulldelimiterspace}
\makeatletter
\newcommand{\@Brach}[2]{%
  %left bracket with hyperlink
  \mathopen{\hyperlink{sec:cases}{\color{red}\left#1\vphantom{#2}\BracKern\right.}}
    #2%  content
}

\renewenvironment{cases}{% From amsmath.sty
  {\ifnum0=`}\fi\matrix@check\cases\collect@body\env@cases}%
  {\ifnum0=`{\fi}}

\def\env@cases#1{%
  \@Brach{\lbrace}%
    {\let\@ifnextchar\new@ifnextchar
    \def\arraystretch{1.2}%
    \array{@{}l@{\quad}l@{}}%
    #1
    \endarray}%
}

\makeatother

\begin{document}

\section{Cases Environment}\label{sec:cases}
The \verb|cases| environment is used for \dots.

\clearpage
\section{Piecewise Defined Function}

\begin{equation*}
f(x)  =
    \begin{cases}
        1 & x < 0, \\
        0 & x = 0, \\
       -1 & x > 0.
    \end{cases}
\end{equation*}

\begin{align*}
  g(x) &= e^x,\\
  f(x) &=
    \begin{cases}
        1 & x < 0, \\
        0 & x = 0, \\
       -1 & x > 0,
     \end{cases}\\
  h(x) &= x^2.
\end{align*}

\end{document}

答案2

我使用原始命令,为括号添加颜色\color{red}\left\lbrace\normalcolor,向后移动一个空格,在该空格上创建超链接\hyperlink{sec:cases}{\hspace{-1em}\ },然后向前移动\hspace{1em}。它似乎有效。 在此处输入图片描述

\expandafter\newif\csname ifGin@setpagesize\endcsname
\documentclass{article}
\usepackage{amsmath}
\usepackage{hyperref}
\usepackage{xcolor}

%% http://tex.stackexchange.com/questions/85033/colored-symbols
\newcommand*{\mathcolor}{}
\def\mathcolor#1#{\mathcoloraux{#1}}
\newcommand*{\mathcoloraux}[3]{%
  \protect\leavevmode
  \begingroup
    \color#1{#2}#3%
  \endgroup
}

\makeatletter% 
    \renewenvironment{cases}{%  From amsmath.sty
      \matrix@check\cases\env@cases
    }{%
      \endarray\right.%
    }
    \def\env@cases{%
      \let\@ifnextchar\new@ifnextchar
      \color{red}\left\lbrace%                        <--- How do I replace this,
        \normalcolor
        \hyperlink{sec:cases}{\hspace{-1em}\ }\hspace{1em}% <-- with something like this, but get the right size
      \def\arraystretch{1.2}%
      \array{@{}l@{\quad}l@{}}%
    }
\makeatother

\begin{document}
\section{Cases Environment}\label{sec:cases}
The \verb|cases| environment is used for \dots.

\clearpage
\section{Piecewise Defined Function}

\begin{align*}
  \exp(x) &= e^x\\
  f(x) &=
    {\begin{cases}
        1 & x < 0, \\
       -1 & x > 0,
     \end{cases}} \\
  g(x) &= x^2.
\end{align*}
\begin{align*}
  \exp(x) &= e^x\\
  f(x) &=
    {\begin{cases}
        1 & x < 0, \\
        0 & x = 0, \\
        0 & x = 0, \\
        0 & x = 0, \\
       -1 & x > 0,
     \end{cases}} \\
  g(x) &= x^2.
\end{align*}

\end{document}

答案3

Andrew Swann 的解决方案是我模糊地想到的第二个解决方案(当然,模糊的直觉是一回事,将其转化为工作代码又是另一回事!),然而,我的第一个想法是尝试在 TeX 原始命令级别实现所需的行为。这个答案的目的只是提供一种如何实现这一目标的概念证明:在我看来,Andrew 的策略仍然是最好的。当然,实际的实现取决于所使用的排版引擎,但原理(IE,在数学列表中正确放置“whatsit”节点)在所有引擎中应该保持不变。不过,以下内容特别指的是 pdfTeX。

众所周知,在构建数学列表后,TeX 会根据附录 G 中详述的规则将其转换为水平列表。TeXbook。在此转换中,边界项(生成的节点类型 \left\{)最终会转换为一个简单的框,因此我们实际上想要实现的是,此框被正确地括在适当的\pdfstartlink\pdfendlink节点之间。这个想法是,了解第 26 章中解释的数学列表构造的确切规则,以及 TeX 在将数学列表转换为水平列表时如何打乱顺序的细节,人们可以设计出正确的命令序列,最终在正确的位置产生正确的节点。

但是,有一个小问题:\left<delim><math mode material>\right<delim>构造总是会产生一个内部原子(第 292 页),其原子核包含<math mode material>,在从数学列表转换为水平列表的过程中,该原子总是被封装在一个额外的装箱级别中(第 443 页,规则 7,以及第 445 页,规则 17,第一句)。这意味着,仅仅将一个\pdfstartlink节点放在它前面\left\{,将一个\pdfendlink节点放在它后面是行不通的,因为这两个节点最终处于不同的装箱级别。一个简单的实验证实了这一点:

% My standard header for TeX.SX answers:
\documentclass[a4paper]{article} % To avoid confusion, let us explicitly 
                                 % declare the paper format.

\usepackage[T1]{fontenc}         % Not always necessary, but recommended.
% End of standard header.  What follows pertains to the problem at hand.

\newcommand*{\ShowLists}{%
    \begingroup
        \showboxbreadth = 1000
        \showboxdepth = 10
        \tracingonline = 1
        \showlists
    \endgroup
}



\begin{document}

Very simple:
\(
    \special{Comment: B}
    \left(
    \special{Comment: E}
    xyz
    \right)
    \ShowLists
\).\ShowLists

\end{document}

第一个\ShowLists显示数学列表,如下所示:

### math mode entered at line 22
\special{Comment: B}
\mathinner
.\left"28300
.\special{Comment: E}
.\mathord
..\fam1 x
.\mathord
..\fam1 y
.\mathord
..\fam1 z
.\right"29301

第二个显示了上述结果的水平列表:

### horizontal mode entered at line 21
\hbox(0.0+0.0)x15.0
\T1/cmr/m/n/10 V
\kern-0.83313
\T1/cmr/m/n/10 e
\T1/cmr/m/n/10 r
\T1/cmr/m/n/10 y
\glue 3.33252 plus 1.66626 minus 1.11084
\T1/cmr/m/n/10 s
\T1/cmr/m/n/10 i
\T1/cmr/m/n/10 m
\T1/cmr/m/n/10 p
\T1/cmr/m/n/10 l
\T1/cmr/m/n/10 e
\T1/cmr/m/n/10 :
\glue 4.44336 plus 3.33252 minus 0.55542
\mathon
\special{Comment: B}
\hbox(7.5+2.5)x23.84497
.\hbox(7.5+2.5)x3.8889
..\OT1/cmr/m/n/10 (
.\special{Comment: E}
.\OML/cmm/m/it/10 x
.\OML/cmm/m/it/10 y
.\kern0.35878
.\OML/cmm/m/it/10 z
.\kern0.4398
.\hbox(7.5+2.5)x3.8889
..\OT1/cmr/m/n/10 )
\mathoff
\T1/cmr/m/n/10 .
spacefactor 3000

我们看到,正如上面所说,两人\special最终处于不同的拳击水平,这并不好。

但是 (pdf-)e-TeX 也有\middle。现在,我必须承认,我不知道有任何文档来源可以像附录 G 一样精确地参考 e-TeX 中的数学列表转换细节TeXbook适用于 TeX(当然,非常欢迎提出建议);但我们始终可以进行实验。一个几乎不言而喻的想法如下:

% My standard header for TeX.SX answers:
\documentclass[a4paper]{article} % To avoid confusion, let us explicitly 
                                 % declare the paper format.

\usepackage[T1]{fontenc}         % Not always necessary, but recommended.
% End of standard header.  What follows pertains to the problem at hand.

\newcommand*{\ShowLists}{%
    \begingroup
        \showboxbreadth = 1000
        \showboxdepth = 10
        \tracingonline = 1
        \showlists
    \endgroup
}



\begin{document}

Still pretty simple:
\(
    \left. \kern -\nulldelimiterspace
    \special{Comment: B}
    \middle(
    \special{Comment: E}
    xyz
    \right)
    \ShowLists
\).\ShowLists

\end{document}

最终的水平列表是

### horizontal mode entered at line 21
\hbox(0.0+0.0)x15.0
\T1/cmr/m/n/10 S
\T1/cmr/m/n/10 t
\T1/cmr/m/n/10 i
\T1/cmr/m/n/10 l
\T1/cmr/m/n/10 l
\glue 3.33252 plus 1.66626 minus 1.11084
\T1/cmr/m/n/10 p
\T1/cmr/m/n/10 r
\T1/cmr/m/n/10 e
\T1/cmr/m/n/10 t
\T1/cmr/m/n/10 t
\kern-0.27771
\T1/cmr/m/n/10 y
\glue 3.33252 plus 1.66626 minus 1.11084
\T1/cmr/m/n/10 s
\T1/cmr/m/n/10 i
\T1/cmr/m/n/10 m
\T1/cmr/m/n/10 p
\T1/cmr/m/n/10 l
\T1/cmr/m/n/10 e
\T1/cmr/m/n/10 :
\glue 4.44336 plus 3.33252 minus 0.55542
\mathon
\hbox(7.5+2.5)x23.84497
.\hbox(0.0+0.0)x1.2, shifted -2.5
.\kern -1.2
.\special{Comment: B}
.\hbox(7.5+2.5)x3.8889
..\OT1/cmr/m/n/10 (
.\special{Comment: E}
.\OML/cmm/m/it/10 x
.\OML/cmm/m/it/10 y
.\kern0.35878
.\OML/cmm/m/it/10 z
.\kern0.4398
.\hbox(7.5+2.5)x3.8889
..\OT1/cmr/m/n/10 )
\mathoff
\T1/cmr/m/n/10 .
spacefactor 3000

这次我们确实成功了:两个“whatsit”节点处于同一级别,并将包含括号的框括起来。

我们现在准备提供我们所承诺的概念证明:

\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage{amsmath}

\makeatletter

\newcommand*\hyperleft[3]{%
    \left. \kern -\nulldelimiterspace
    \pdfstartlink attr{#2} user{#3}
    \middle #1%
    \pdfendlink
}

% We prefer to keep the original "cases":
\newenvironment*{hypercases}{% From amsmath.sty
    % \matrix@check\cases % obviously not needed in our case
    \env@hyper@cases
}{%
    \endarray\right.%
}
\newcommand*\env@hyper@cases{%
    \let\@ifnextchar\new@ifnextchar
    \hyperleft\lbrace
        % the following two lines are obviously just a stub:
        {/Border[0 0 1]/H/I/C[0 1 1]}%
        {/Subtype/Link/A<</Type/Action/S/URI/URI(http://www.tug.org/)>>}%
    \def\arraystretch{1.2}%
    \array{@{}l@{\quad}l@{}}%
}

\makeatother



\begin{document}

\section{Piecewise Defined Function}

Two examples follow, so that you can compare results.

The first one uses the \texttt{cases} environment:
\[
f(x)  = 
    \begin{cases}
        1 & x < 0 \\
        0 & x = 0 \\
       -1 & x > 0.
    \end{cases}
\]

The second one uses the \texttt{hypercases} environment:
\[
f(x)  = 
    \begin{hypercases}
        1 & x < 0 \\
        0 & x = 0 \\
       -1 & x > 0.
    \end{hypercases}
\]

\end{document}

当然,还需要进一步的研究来使其成为可用的形式。


添加

我浏览了一下该hperref包的代码,似乎我在评论中提到的“粗略破解”应该可以按预期工作,尽管需要改进。

这个想法是使用本答案第一部分中显示的方法,但使用hyperref提供链接创建的常规命令将\pdfstartlink\pdfendlink节点传递到正确的位置,将生成低级 PDF 语法的所有负担放在hyperref包本身上。作为初步估计,可以尝试使用

\left. \kern -\nulldelimiterspace
\href{http://www.tug.org/}{\middle\lbrace}

(用于网页链接)并希望这将把\middle节点封闭在适当的“whatsit”节点之间(其确切类型取决于驱动程序),如上所示,当数学列表转换为水平列表时,它将出现在正确的位置。不幸的是,这不起作用。

原因是hyperref包将链接的文本包含在几个组中,这显然会干扰构造\left. ... \middle\lbrace ... \right.。这就是我们的“粗暴黑客”介入的地方:我们在前面添加尽可能\middle\lbrace多的\endgroup标记,以便返回到\left组级别,并在其后附加相同数量的标记。检查包和驱动程序的\begingroup代码表明,这不会破坏和节点的正确放置,而且它确实似乎有效。但请注意,它hyperrefhpdftex\pdfstartlink\pdfendlink将要破坏任何依赖于\aftergroup在链接末端传递“whatsit”节点的机制;特别是,该colorlinks选项将不是使用我们的链接(见下文)。

必须退出的组数不仅取决于用于生成链接的命令(例如\href{...}{...}\hyperref[...]{...}),但也取决于其他因素,原则上取决于所使用的驱动程序;例如,在命令的情况下\href,它可能取决于所引用的 URL 的类型(例如http:file:…… run:)。因此,最好的策略是动态地确定这个数字,要么通过 要么\currentgrouplevel通过\currentgrouptype:在下面显示的代码中,我们选择了第二个测试。如果它们不一致,也可以同时执行测试并发出错误消息。

实际上,上面概述的想法可以应用于更一般的情况。在下面的代码中,我们定义了以下四个命令:

  • \leftLinkToLabel<delim>{<label>}排版<delim>为可变大小的左分隔符,它是指向文档中标有 的位置的链接\label{<label>}

  • \rightLinkToLabel<delim>{<label>}执行相同操作,但使用右分隔符。

  • \leftLinkToURL<delim>{<URL>}排版<delim>为可变大小的左分隔符,作为指向的链接<URL>

  • \rightLinkToURL<delim>{<URL>}执行相同操作,但使用右分隔符。

当然,这个集合并不详尽,但很容易扩展它(例如,提供\middle...上述命令的变体)。完成此操作后,我们使用\leftLinkTo...来实现两个\cases类似环境,我们希望它们能够表现出所需的行为。不幸的是,我们不能\newcases这样做,因为我们的新环境带有一个参数。

以下是代码:

\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{hyperref}

\makeatletter

% Common syntax: #1 = delimiter, #2 = link.
\newcommand*\leftLinkToLabel[2]{%
   \@left@delimiter@wrapper{#1}{\hyperref[#2]}%
}
\newcommand*\rightLinkToLabel[2]{%
   \@right@delimiter@wrapper{#1}{\hyperref[#2]}%
}
\newcommand*\leftLinkToURL[2]{%
   \@left@delimiter@wrapper{#1}{\href{#2}}%
}
\newcommand*\rightLinkToURL[2]{%
   \@right@delimiter@wrapper{#1}{\href{#2}}%
}

\newcommand*\@left@delimiter@wrapper[2]{%
   \left. \kern -\nulldelimiterspace
   \@general@link@helper{#1}{#2}%
}
\newcommand*\@right@delimiter@wrapper[2]{%
   \@general@link@helper{#1}{#2}%
   \kern -\nulldelimiterspace \right.
}

\@ifdefinable\@restore@groups@at@end@of@link{} % just check that we can use it
\newcommand*\@exit@to@leftright@group{%
   \ifnum \currentgrouptype=\sixt@@n \else
       % \typeout{Exiting group level \number\currentgrouplevel.}%
       \endgroup
       \xdef\@restore@groups@at@end@of@link{%
           \@restore@groups@at@end@of@link
           \begingroup
       }%
       \expandafter\@exit@to@leftright@group
   \fi
}
\newcommand*\@general@link@helper[2]{%
   \global\let \@restore@groups@at@end@of@link \@empty
   #2{% #2 is either "\hyperref[...]" or "\href{...}"
       \@exit@to@leftright@group
       \middle #1%
       \@restore@groups@at@end@of@link
   }%
}

\newenvironment*{linkToLabelCases}{% From amsmath.sty
   % \matrix@check\cases % obviously not needed in our case
   \env@hyper@cases\leftLinkToLabel
}{%
   \endarray\right.%
}
\newenvironment*{linkToURLCases}{% From amsmath.sty
   % \matrix@check\cases % obviously not needed in our case
   \env@hyper@cases\leftLinkToURL
}{%
   \endarray\right.%
}
\newcommand*\env@hyper@cases[2]{%
   \let\@ifnextchar\new@ifnextchar
   #1\lbrace{#2}%
   \def\arraystretch{1.2}%
   \array{@{}l@{\quad}l@{}}%
}


\makeatother



\begin{document}

\section{Target}
\label{S:Target}

This is the target of our links.

\newpage

\section{Links}
\label{S:Links}

Some examples of links follow.

A simple bracket:
\begin{align*}
   \left[xyz\right] &= \left[xyz\right] \\
   \leftLinkToLabel[{S:Target}xyz\right]
       &= \left[xyz\rightLinkToLabel]{S:Target}
\end{align*}

Now with fractions:
\begin{align*}
   \left\{\frac{x}{y}\right\} &= \left\{\frac{x}{y}\right\} \\
   \leftLinkToLabel\{{S:Target}\frac{x}{y}\right\}
       &= \left\{\frac{x}{y}\rightLinkToLabel\}{S:Target}
\end{align*}

Now with matrices:
\begin{align*}
   \left(
       \begin{matrix}
           1 & 0 & 0 \\
           0 & 1 & 0 \\
           0 & 0 & 1
       \end{matrix}
   \right) &= \left(
       \begin{matrix}
           1 & 0 & 0 \\
           0 & 1 & 0 \\
           0 & 0 & 1
       \end{matrix}
   \right) \\
   \leftLinkToLabel({S:Target}
       \begin{matrix}
           1 & 0 & 0 \\
           0 & 1 & 0 \\
           0 & 0 & 1
       \end{matrix}
   \right) &= \left(
       \begin{matrix}
           1 & 0 & 0 \\
           0 & 1 & 0 \\
           0 & 0 & 1
       \end{matrix}
   \rightLinkToLabel){S:Target}
\end{align*}

Again with matrices, but this time linking to a URL\@:
\begin{align*}
   \left(
       \begin{matrix}
           1 & 0 & 0 & 0 \\
           0 & 1 & 0 & 0 \\
           0 & 0 & 1 & 0 \\
           0 & 0 & 0 & 1
       \end{matrix}
   \right) &= \left(
       \begin{matrix}
           1 & 0 & 0 & 0 \\
           0 & 1 & 0 & 0 \\
           0 & 0 & 1 & 0 \\
           0 & 0 & 0 & 1
       \end{matrix}
   \right) \\
   \leftLinkToURL({http://www.tug.org/}
       \begin{matrix}
           1 & 0 & 0 & 0 \\
           0 & 1 & 0 & 0 \\
           0 & 0 & 1 & 0 \\
           0 & 0 & 0 & 1
       \end{matrix}
   \right) &= \left(
       \begin{matrix}
           1 & 0 & 0 & 0 \\
           0 & 1 & 0 & 0 \\
           0 & 0 & 1 & 0 \\
           0 & 0 & 0 & 1
       \end{matrix}
   \rightLinkToURL){http://www.tug.org/}
\end{align*}

\section{Piecewise defined function}
\label{S:Piece}

No link at all:
\[
   f(x) = \begin{cases}
            1 & x < 0 \\
            0 & x = 0 \\
           -1 & x > 0
       \end{cases}
\]

Linking to a label:
\[
   f(x) = \begin{linkToLabelCases}{S:Target}
            1 & x < 0 \\
            0 & x = 0 \\
           -1 & x > 0
       \end{linkToLabelCases}
\]

Linking to a URL\@:
\[
   f(x) = \begin{linkToURLCases}{http://www.tug.org/}
            1 & x < 0 \\
            0 & x = 0 \\
           -1 & x > 0
       \end{linkToURLCases}
\]

% \showboxbreadth = 1000
% \showboxdepth = 10
% \showlists

\end{document}

linkToURLCases您可以取消注释末尾附近的诊断命令,以检查节点是否排列正确。例如,以下是与环境括号(最后一个)相关的列表的摘录:

\hbox(24.09993+19.09991)x89.71133, shifted 127.64433, display
.\OML/cmm/m/it/10 f
.\kern1.0764
.\OT1/cmr/m/n/10 (
.\OML/cmm/m/it/10 x
.\OT1/cmr/m/n/10 )
.\glue(\thickmuskip) 2.77771 plus 2.77771
.\OT1/cmr/m/n/10 =
.\glue(\thickmuskip) 2.77771 plus 2.77771
.\hbox(24.09993+19.09991)x56.91278
..\hbox(0.0+0.0)x1.2, shifted -2.5
..\kern -1.2
..\pdfstartlink(*+*)x* attr{/Border[0 0 1]/H/I/C[0 1 1]} action user{/Subtype/L
ink/A<</Type/Action/S/URI/URI(http://www.tug.org/)>>}
..\vbox(0.0+42.00043)x8.8889, shifted -23.50021
...\hbox(0.0+9.00009)x8.8889
....\OMX/cmex/m/n/10 8
...\hbox(0.0+3.00003)x8.8889
....\OMX/cmex/m/n/10 >
...\hbox(0.0+18.00018)x8.8889
....\OMX/cmex/m/n/10 <
...\hbox(0.0+3.00003)x8.8889
....\OMX/cmex/m/n/10 >
...\hbox(0.0+9.00009)x8.8889
....\OMX/cmex/m/n/10 :
..\pdfendlink
..\vbox(24.09993+19.09991)x46.82388

如果您想要 DVI 输出,您可以检查我们的解决方案是否(或多或少)hypertex也适用于该驱动程序。如果您指定该驱动程序并使用latex而不是使用进行编译,则会获得以下相应的跟踪pdflatex

\hbox(24.09993+19.09991)x89.71133, shifted 127.64433, display
.\OML/cmm/m/it/10 f
.\kern1.0764
.\OT1/cmr/m/n/10 (
.\OML/cmm/m/it/10 x
.\OT1/cmr/m/n/10 )
.\glue(\thickmuskip) 2.77771 plus 2.77771
.\OT1/cmr/m/n/10 =
.\glue(\thickmuskip) 2.77771 plus 2.77771
.\hbox(24.09993+19.09991)x56.91278
..\hbox(0.0+0.0)x1.2, shifted -2.5
..\kern -1.2
..\special{html:<a href="http://www.tug.org/">}
..\vbox(0.0+42.00043)x8.8889, shifted -23.50021
...\hbox(0.0+9.00009)x8.8889
....\OMX/cmex/m/n/10 8
...\hbox(0.0+3.00003)x8.8889
....\OMX/cmex/m/n/10 >
...\hbox(0.0+18.00018)x8.8889
....\OMX/cmex/m/n/10 <
...\hbox(0.0+3.00003)x8.8889
....\OMX/cmex/m/n/10 >
...\hbox(0.0+9.00009)x8.8889
....\OMX/cmex/m/n/10 :
..\special{html:</a>}
..\vbox(24.09993+19.09991)x46.82388

另一方面,如上所述,该colorlinks选项将不会按预期工作,并且以下跟踪(使用获得pdflatex)显示了发生的情况:

\hbox(24.09993+19.09991)x89.71133, shifted 127.64433, display
.\OML/cmm/m/it/10 f
.\kern1.0764
.\OT1/cmr/m/n/10 (
.\OML/cmm/m/it/10 x
.\OT1/cmr/m/n/10 )
.\glue(\thickmuskip) 2.77771 plus 2.77771
.\OT1/cmr/m/n/10 =
.\glue(\thickmuskip) 2.77771 plus 2.77771
.\hbox(24.09993+19.09991)x56.91278
..\hbox(0.0+0.0)x1.2, shifted -2.5
..\kern -1.2
..\pdfstartlink(*+*)x* attr{/Border[0 0 0]/H/I/C[0 1 1]} action user{/Subtype/L
ink/A<</Type/Action/S/URI/URI(http://www.tug.org/)>>}
..\pdfcolorstack 0 push {0 1 0 0 k 0 1 0 0 K}
..\pdfcolorstack 0 pop
..\vbox(0.0+42.00043)x8.8889, shifted -23.50021
...\hbox(0.0+9.00009)x8.8889
....\OMX/cmex/m/n/10 8
...\hbox(0.0+3.00003)x8.8889
....\OMX/cmex/m/n/10 >
...\hbox(0.0+18.00018)x8.8889
....\OMX/cmex/m/n/10 <
...\hbox(0.0+3.00003)x8.8889
....\OMX/cmex/m/n/10 >
...\hbox(0.0+9.00009)x8.8889
....\OMX/cmex/m/n/10 :
..\pdfendlink
..\vbox(24.09993+19.09991)x46.82388

如您所见,\pdfcolorstack 0 pop节点过早交付,因此链接没有任何颜色;但是,由于节点\pdfendlink位于正确的位置,因此链接仍然处于活动状态。

相关内容