我想检查当前页面上是否存在 DTL 数据库中加载的节点列表,其中每个节点都有一个 tikzmark。在 \DTLforeach 中包含 \iftikzmarkoncurrentpage 会返回编译器错误:
额外的},或者被遗忘的\endgroup。}
有没有更好的方法呢?
梅威瑟:
\documentclass{article}
\usepackage{datatool}
\usepackage{pgf,tikz}
\usetikzlibrary{calc,arrows,positioning,tikzmark}
\begin{document}
\DTLnewdb{nodes}
\DTLnewrow{nodes}
\DTLnewdbentry{nodes}{Node}{d}
\begin{tikzpicture}
\node (a) {a};
\tikzmark{a}{(a)};
\node[right=2cm of a] (b) {b};
\iftikzmarkoncurrentpage{a}
\draw (b)-- (a);
\fi
\DTLforeach{nodes}{\element=Node}{%
\node[below=1cm of a] (\element){\element};
}
%This compiles correctly
\end{tikzpicture}
\newpage
\begin{tikzpicture}
\node (c) {c};
\tikzmark{c}{(c)};
\DTLforeach{nodes}{\element=Node}{%
\node[below=1cm of c] (\element){\element};
% \iftikzmarkoncurrentpage{a}%This breaks
% \draw (b) -- (a);
% \fi
}
\end{tikzpicture}
\end{document}
答案1
从您的示例中无法完全清楚您实际上想要实现什么,因为它包含一些问题,即使可以工作也无法工作\iftikzmarkoncurrentpage
。
将该选项添加
remember picture
到所有tikzpicture
包含要从 tikzpicture 外部引用的节点的环境,以及所有引用外部节点的 tikzpicture。这意味着您示例中的两个 tikzpicture。将该选项添加
overlay
到所有引用其他 tikzpicture 中的节点的 tikzpicture。这意味着您示例中的第二个 tikzpicture。overlay
告诉 tikz 不要计算边界框,这是必要的,因为你想在 tikzpicture 之外绘制。然而,这也意味着图片没有默认宽度,所以你必须告诉 tikz 如何计算边界框。但如果你不知道如何做(并且需要更多上下文),这是一个不同的问题。您必须至少运行两次 LaTeX 来传播节点位置。
如果名称是公开的(因为
remember picture
),请不要在多个 tikzpicture 中使用相同的节点名称。在您的示例中,您d
在两张图片中都进行了定义。最后,
\iftikzmarkoncurrentpage
显然在 内不起作用\DTLforeach
。后者扩展了它的参数,并且\iftikzmarkoncurrentpage
不可扩展。您可以使用较小的示例进行检查\documentclass{article} \usepackage{datatool,tikz} \usetikzlibrary{tikzmark} \begin{document} \DTLnewdb{nodes} \DTLnewrow{nodes} \DTLnewdbentry{nodes}{Node}{d} \DTLforeach{nodes}{\element=Node}{% \iftikzmarkoncurrentpage{a}\fi } \end{document}
作为一种解决方法,在
\if...
循环之前使用来定义一个可以在循环内使用的命令。\iftikzmarkoncurrentpage{a}% \def\linetoa{\draw (\element) -- (a);} \else \let\linetoa\relax \fi \DTLforeach{nodes}{\element=Node}{% \node[below=1cm of c] (\element){\element}; \linetoa }
这是完整示例的代码。
\documentclass{article}
\usepackage{datatool}
\usepackage{tikz}
\usetikzlibrary{calc,arrows,positioning,tikzmark}
\begin{document}
\DTLnewdb{nodes}
\DTLnewrow{nodes}
\DTLnewdbentry{nodes}{Node}{d}
\begin{tikzpicture}[remember picture]
\node (a) {a};
\tikzmark{a}{(a)};
\node[right=2cm of a] (b) {b};
\iftikzmarkoncurrentpage{a}
\draw (b)-- (a);
\fi
\end{tikzpicture}
\newpage
\begin{tikzpicture}[remember picture,overlay]
\node (c) {c};
\tikzmark{c}{(c)};
\iftikzmarkoncurrentpage{a}%
\def\linetoa{\draw (\element) -- (a);}
\else
\let\linetoa\relax
\fi
\DTLforeach{nodes}{\element=Node}{%
\node[below=1cm of c] (\element){\element};
\linetoa
}
\end{tikzpicture}
\end{document}