向 TikZ 树形图添加超链接会导致 pgf 错误

向 TikZ 树形图添加超链接会导致 pgf 错误

当我使用 Emacs 源块生成 TikZ 图形时,有点复杂org-babel,但我在文件中重现了这个问题.tex(见下文)。

下列的这个帖子以及许多相关的,我尝试插入 TikZ 图表的超链接 - 具体来说,使用图形绘制算法并使用 进行编译LuaLaTeX。但是,参数alias=sourcenode中的\tikzset似乎会产生错误Package pgf Error: No shape named 'sourcenode' is known.

生成的 .pdf 看起来不错,带有指向正确网页的功能性超链接。但我想消除此编译错误和/或了解其产生的原因。我尝试了许多不同版本的 LaTeX 样式,包括例如\tikz [ ...]不将其包装\graph在块中\begin{tikzpicture}[...],但错误仍然存​​在。

下面是我的最小(-ish)可重现示例,我使用

Running `LaTeX' on `latex-q6CtLl' with 
``lualatex --jobname=latex-q6CtLl  -file-line-error   
--synctex=1 -interaction=nonstopmode latex-q6CtLl.tex''
\documentclass{article}
\usepackage[usenames]{color}
\usepackage{hyperref}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric,arrows,backgrounds,calc,positioning}
\usetikzlibrary{arrows.meta,graphs,graphdrawing,quotes}
\usegdlibrary{trees,force} 
\pagestyle{empty}          
\begin{document}
\tikzset{
    background rectangle/.style={fill=white},
    hyperlink node/.style={
        alias=sourcenode,
        append after command={
            let     \p1 =(sourcenode.north west),
            \p2=(sourcenode.south east),
            \n1={\x2-\x1},
            \n2={\y1-\y2} in
            node [inner sep=0pt, outer sep=0pt,anchor=north west,at=(\p1)] 
{\href{#1}{\phantom{\rule{\n1}{\n2}}}}
        }
    }
}
\begin{tikzpicture}[nodes={minimum height=1.5em, text depth=.2em, inner sep=0.5cm, draw=black!20, thick, fill=white, align=center}, >={Stealth[round,sep]}, rounded corners, semithick]
\graph[tree layout, grow'=-10, level distance=3cm, sibling distance=2cm,, edge quotes mid,]
{
a/"Linked node" [draw=red, hyperlink node=www.google.com],
b/"Ordinary node",
a -- b,
};
\end{tikzpicture}
\end{document}

错误信息如下:

./latex-q6CtLl.tex:29: Package pgf Error: No shape named `sourcenode' is known.

答案1

图形绘制库在内部保存节点(而不是绘制它),进行计算然后才绘制它。

这就是sourcenode找不到的原因。

您需要在命令之后\graph或作为label(库有特别考虑)执行此操作。

以下是label实现方法。parse let关键是来自我自己的回答

\phantom我已经通过使用两个\rule没有宽度/高度的 s来消除这种需要。

通过 添加到链接的边框hyperref会有一些奇怪的位置,看起来很奇怪,这就是我通过 删除它的原因hidelinks。您可以使用draw = red或类似于hyperlink node样式(不是标签!)让每个超链接节点自动显示边框。

我在标签中添加了许多带有默认值的键,以抵消您所做的设置nodes。最好将nodes键移动到命令上\graph,因为这是另一个这不会影响标签。

代码

\documentclass[tikz,border=5mm]{standalone}
\usepackage{hyperref}
\usetikzlibrary{calc, graphs,graphdrawing}
\usegdlibrary{trees}
\makeatletter
\tikzset{parse let/.code={\def\tikz@cc@stop@let in{}\tikz@let@command et #1in}}
\makeatother
\pagestyle{empty}          
\begin{document}
\tikzset{
  hyperlink node/.style={
    label={[%
      parse let={\p1=($(\tikzlastnode.north east)-(\tikzlastnode.south west)$)},
      minimum size=+0pt, inner sep=+0pt, outer sep=+0pt,
      path only, text depth=, text width=, text height=,
      anchor=center, sharp corners]center:%
        \hypersetup{hidelinks}\href{#1}{\rule{0pt}{\y1}\rule{\x1}{0pt}}}}}
\begin{tikzpicture}[
  nodes={
    minimum height=1.5em, text depth=.2em, inner sep=0.5cm,
    draw=black!20, thick, fill=white, align=center},
    rounded corners, semithick]
\graph[
  tree layout, grow'=-10,
  level distance=3cm, sibling distance=2cm,
  edge quotes mid]{
    a/"Linked node" [draw=red, hyperlink node=https://www.google.com],
    b/"Ordinary node",
    a -- b,
  };
\end{tikzpicture}
\end{document}

输出

在此处输入图片描述

相关内容