如何使 pgfplots 垂直标签具有适当的超引用框?

如何使 pgfplots 垂直标签具有适当的超引用框?

对于垂直文本,PGFPlots 和 hyperref 似乎不能很好地协同工作。例如,ylabel(垂直)将其 hyperref 框显示在中间,而不是垂直标签的位置和方向上。

有人知道解决方法吗?

(请注意两点:hyperref 框适用于 rotatebox 和水平标签)

错误的垂直标签

\documentclass{article}
\usepackage[]{hyperref}
\usepackage[]{pgfplots}  
\begin{document}
\rotatebox{90}{\href{http://www.google.com}{hello}}bye
\newline
\begin{tikzpicture} 
\begin{axis}[xlabel = {\href{http://www.google.com}{Time}},  ylabel = {\href{http://www.google.com}{Length}}] 
\end{axis}
\end{tikzpicture}
\end{document}

编辑:尽管杰克的答案(和马丁的答案)可以解决问题,但标签的“单位”部分仍然存在问题。(我应该在我的问题中发布完整的问题,而不是简化问题)。如下面的图片和代码所示,旋转单位部分并使其出现在预期位置(在单词“Length”结尾之后)似乎并不是一件容易的事:

链接未旋转的单元

\documentclass{article}
\usepackage[]{hyperref}
\usepackage[]{pgfplots}
\usepackage[]{tikz}
\usepgfplotslibrary{units}
\begin{document}
A plot with units:\newline
\begin{tikzpicture}
\begin{axis}[y label style={rotate=-90}, x unit = {\href{http://www.google.com}{\mathrm{s}}}, y unit = {\href{http://www.google.com}{\mathrm{m}}}, xlabel = {Time}, ylabel = {\rotatebox{90}{Length}}, title = {Axis}]
\end{axis}
\end{tikzpicture}
\end{document}

答案1

pgfplots您可以使用旋转标签以y label style={rotate=-90}使hyperref框正确,然后使用 提供标签rotatebox。使用此解决方法,hyperref框具有正确的大小和位置。

(我还添加了\pgfplotsset{compat=1.3},这改善了轴标签的位置。但这对于解决方案来说不是必需的)

\documentclass{article}
\usepackage[]{hyperref}
\usepackage[]{pgfplots}
\pgfplotsset{compat=1.3}
\begin{document}
\begin{tikzpicture} 
\begin{axis}[
  xlabel = {\href{http://www.google.com}{Time}},
  ylabel = {\rotatebox{90}{\href{http://www.google.com}{Length}}},
  y label style={rotate=-90}
] 
\end{axis}
\end{tikzpicture}
\end{document}

带有垂直超链接的 pgfplots 轴


为了使此功能与units库配合使用,您可以重新定义units库中负责组装标签和单位的宏之一。以下代码检查我们是否正在定义 y 轴的标签,如果是,它将整个标签字符串(即标签和单位)括在 中rotatebox

\documentclass{article}
\usepackage{hyperref}
\usepackage{pgfplots}
\usepgfplotslibrary{units}

\makeatletter
\def\pgfplots@label@units#1{
    \if#1y\rotatebox{90}{\fi%
    \pgfkeysgetvalue{/pgfplots/#1label}{\pgfplots@loc@TMPa}%
    \pgfplots@loc@TMPa\space\pgfplots@label@units@@{#1}%
    \if#1y}\fi
}
\makeatother

\begin{document}
\begin{tikzpicture}
\begin{axis}[y label style={rotate=-90},
  x unit = {\href{http://www.google.com}{\mathrm{s}}},
  y unit = {\href{http://www.google.com}{\mathrm{m}}},
  xlabel = {Time}, ylabel = {Length}, title = {Axis}]
\end{axis}
\end{tikzpicture}
\end{document}

链接单位

答案2

似乎 PGF/TikZ 的底层旋转代码不会旋转创建的额外hrefhyperref。一种解决方法是使用\rotatebox\phantom内容手动旋转它。\phantom宏创建一个与内容尺寸相同的框,但不打印任何内容。\llap然后使用宏使其与实际内容重叠,而不会将其推到一侧。通常\rlap应该使用,但由于 90 度旋转,它必须重叠到左侧。

\documentclass{article}
\usepackage[]{hyperref}
\usepackage[]{pgfplots}
\usepackage[]{graphicx}
\begin{document}
\rotatebox{90}{\href{http://www.google.com}{hello}}bye
\newline
\begin{tikzpicture}
    \begin{axis}[xlabel = {\href{http://www.google.com}{Time}},  ylabel = {%
             \llap{\rotatebox{90}{\href{http://www.google.com}{\phantom{Length}}}}%
             Length}] 
\end{axis}
\end{tikzpicture}
\end{document}

这并不完美。生成的href框不是 100% 处于其正确的水平位置,但它已经很接近并且在我看来已经足够好了。

结果

您可能希望将其发送给 的作者pgfplots,或许也发送给 的作者hyperref

相关内容