我想在两个嵌套的 tikzpicture 之间画一条线,虽然代码使用 运行没有任何问题pdflatex
,但 的结果xelatex
不可接受。我不得不使用xelatex
因为我的文档包含一些 RTL 文本。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}[remember picture,overlay]
\node (container1) {
\begin{tikzpicture}
\node [draw,] (child1) {Node 1's Child};
\end{tikzpicture}
};
\node [right= 6cm of container1] (container2) {
\begin{tikzpicture}
\node [draw,] (child2) {Node 2's Child};
\end{tikzpicture}
};
\draw [<->] (child1) to [out=0,in=180] (child2);
\end{tikzpicture}
\end{document}
我不知道这个引擎出了什么问题,是 xelatex 的 bug 吗?
主要问题由以下最小代码引发:
\documentclass[a0paper]{xebaposter}
\usepackage{color}
\usepackage{tikz}
\tikzstyle{every picture}+=[remember picture, ]
\tikzstyle{box} = [draw, rectangle, rounded corners, thick, node distance=7em, text width=6em, text centered, minimum height=2.5em]
\begin{document}
\begin{poster}
{
eyecatcher=false,
background=none,
borderColor=black,
textborder=faded,
boxColorOne=yellow,
headerColorOne=white,
headerborder=closed,
headershape=rounded,
headershade=plain,
}
{}
{title}
{subtitle}
{}
\begin{posterbox}[name=base]{Common}
\begin{tikzpicture}
\node [box] (math) {math};
\end{tikzpicture}
\end{posterbox}
\begin{posterbox}[name=kernel, column=1,]{Core}
\begin{tikzpicture}
\node [box] (stat) {statistics};
\end{tikzpicture}
\begin{tikzpicture}[overlay]
\draw [->,thick,red] (math) to [out=0,in=180] (stat);
\end{tikzpicture}
\end{posterbox}
\end{poster}
\end{document}
正如我上面所说,没有问题,pdflatex
但是输出xelatex
不正确!。
pdflatex
输出:
xelatex
输出:
*xebaposter
是的修改版本baposter
,可以处理 RTL 文本,目的是xepersian
打包。
答案1
您应该避免嵌套 tikzpictures。有几种方法可以实现您想要的效果,我假设是将一个或多个节点包含在某种容器中。一种方法是使用scope
而不是节点。在下面的示例中,我添加了一个节点container1
并在其周围画了一条红色虚线,只是为了看看会发生什么。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning,calc}
\begin{document}
\begin{tikzpicture}
\begin{scope}[local bounding box=container1]
\node [draw,] (child1) {Node 1's Child};
\node[below=1cm of child1]{Test};
\draw[dashed,red!40](container1.south west) rectangle (container1.north east);
\end{scope}
\begin{scope}[local bounding box=container2,shift={($(container1.east)+(6cm,0)$)}]
\node [draw,anchor=west] (child2) {Node 2's Child};
\end{scope}
\draw [<->] (child1) to [out=0,in=180] (child2);
\end{tikzpicture}
\end{document}
另一种方法是使用fit
来绘制一个节点围绕其他几个节点。这更接近于问题中所做的,因为它用一个节点包围节点,但它是按照另一种顺序进行的,首先是封闭的节点,然后是封闭。与上图相同的图片变成了(如果您想要更紧密的贴合,只需添加inner sep=0pt
)。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning,calc}
\usetikzlibrary{fit}
\begin{document}
\begin{tikzpicture}
\node [draw,] (child1) {Node 1's Child};
\node [below=1cm of child1](Test){Test};
\node [draw=red!40,dashed,fit={(child1) (Test)}] (container1){};
\node [draw,anchor=west,right=6cm of container1] (child2) {Node 2's Child};
\draw [<->] (child1) to [out=0,in=180] (child2);
\end{tikzpicture}
\end{document}
第三种选择是tikzpicture
使用选项执行两个独立的 s remember picture
,这意味着所有名称都被记住。然后使用第三个tikzpicture
带有附加参数的s overlay
,这意味着它不占用任何空间,它绘制箭头。(我已\usepackage{lipsum}
在序言中添加了一些文字,在图片之间写了一些文字。编译两次以获得正确的箭头。
\begin{tikzpicture}[remember picture]
\node [draw,] (child1) {Node 1's Child};
\node [below=1cm of child1](Test){Test};
\draw[dashed,red!40](current bounding box.south west) rectangle (current bounding box.north east);
\end{tikzpicture}
\begin{minipage}{6cm}
\lipsum[2]
\end{minipage}
\begin{tikzpicture}[remember picture]
\node [draw,anchor=west] (child2) {Node 2's Child};
\end{tikzpicture}
\begin{tikzpicture}[remember picture,overlay]
\draw [<->,thick,red] (child1) to [out=0,in=180] (child2);
\end{tikzpicture}