当我使用 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}