冲突:TikZ 外部化、名称为空的局部边界框、分叉边和 Forest 中的多线节点

冲突:TikZ 外部化、名称为空的局部边界框、分叉边和 Forest 中的多线节点

以下冲突的原因是什么?我该如何解决?

当文档包含以下元素时,冲突涉及编译错误:

  • Z 外化;
  • Z 使用的图片local bounding box/.expanded=\macro,其中\macro为空;
  • forked edges使用包含多线节点的样式的森林树。

如果注释掉该树,则tikzpicture成功外部化。如果随后取消注释该树,则代码将按预期进行编译。

tikzpicture但是,如果在外部化之前取消注释树,则外部化会tikzpicture失败。如果允许编译继续,则会出现许多错误,包括术语forest结果。

如果为空,这是否只是预期会失败\macro?树是否取消注释有什么关系?或者树的样式和内容是什么?

MNME(使用 编译pdflatex --shell-escape):

\documentclass{article}
\usepackage[edges]{forest}
\usetikzlibrary{external}
\tikzexternalize
\tikzset{%
   person name/.store in=\personname,
   person name=,
}

\begin{document}

\begin{tikzpicture}
  \begin{scope}[local bounding box/.expanded=\personname]
    \node (-pen) [circle, minimum size=40mm] {};
  \end{scope}
\end{tikzpicture}

\begin{forest}
  forked edges,
  for tree={
    align=center,
  },
  [Root Starts Here
    [Something Else
      [All\\Other\\Things
      ]
    ]
  ]
\end{forest}

\end{document}

外部化的初始失败以及前几个forest相关错误:

==== 'mode=convert with system call': Invoking 'pdflatex -shell-escape -halt-o
n-error -interaction=batchmode -jobname "prawf-figure0" "\def\tikzexternalrealj
ob{prawf}\input{prawf}"' ========
This is pdfTeX, Version 3.14159265-2.6-1.40.17 (TeX Live 2016) (preloaded format=pdflatex)
 \write18 enabled.
entering extended mode
system returned with code 256

! Package tikz Error: Sorry, the system call 'pdflatex -shell-escape -halt-on-e
rror -interaction=batchmode -jobname "prawf-figure0" "\def\tikzexternalrealjob{
prawf}\input{prawf}"' did NOT result in a usable output file 'prawf-figure0' (e
xpected one of .pdf:.jpg:.jpeg:.png:). Please verify that you have enabled syst
em calls. For pdflatex, this is 'pdflatex -shell-escape'. Sometimes it is also 
named 'write 18' or something like that. Or maybe the command simply failed? Er
ror messages can be found in 'prawf-figure0.log'. If you continue now, I'll try
 to typeset the picture.

See the tikz package documentation for explanation.
Type  H <return>  for immediate help.
 ...                                              

l.16 \end{tikzpicture}

? 
! Argument of \forest@referencednodename@stripafter has an extra }.                                                                           
<inserted text>                                                                                                                               
                \par                                                                                                                          
l.29 \end{forest}                                                                                                                             

?                                                                                                                                             
Runaway argument?                                                                                                                             
\relax \fi \if \relax \relax \fi \endcsname                                                                                                   
! Paragraph ended before \forest@referencednodename@stripafter was complete.                                                                  
<to be read again>                                                                                                                            
                   \par                                                                                                                       
l.29 \end{forest} 

<... 等等 ...>

答案1

进一步剥离 OP 的 MWE,我们发现以下代码产生了相同的错误。

\documentclass{article}
\usepackage{forest}

\begin{document}

\begin{tikzpicture}
  \begin{scope}[local bounding box=]
    \node {};
  \end{scope}
\end{tikzpicture}

\begin{forest}
  []
  \path (.child anchor);
\end{forest}

\end{document}

local bounding box定义具有给定名称的新节点。给定名称在范围结束后仍然存在;事实上,如下一个示例所示,即使在图片之外也是如此。

\documentclass{article}
\usepackage{forest}

\begin{document}

\begin{tikzpicture}
  \begin{scope}[local bounding box=bla]
    \node {};
  \end{scope}
\end{tikzpicture}

\begin{forest}
  []
  \path (bla.south);
\end{forest}

\end{document}

在上面的第一个例子中(以及 OP 的原始代码),给出的名称local bounding box为空,因此 forest 在包含空节点的环境中工作。这严重破坏了 forest 对 tikz 隐式坐标系的破解:构造中的空节点名称<node name>.<anchor name>旨在表示使用相对节点名称,但在存在空节点的情况下,它会尝试检索空名称节点的锚点。在上面的第一个例子中,这是child anchor,它没有为非森林节点定义,因此编译崩溃。(如果child anchor在第一个例子中被替换为例如`south˙,代码会编译,尽管结果不是它应该的那样。)

forked edges总结一下,原始错误与外部化、森林语言学库的密钥或多行节点无关。它是三个因素的共谋:

  • 给节点一个空名。这是用户的错。虽然我不确定 tikz 文档是否明确说明了这一点,但我猜想让节点具有空名从来就不是个好主意。;-)(Forest 实际上阻止用户给节点一个空名。)

  • 指定的节点名称local bounding box在图片范围之外仍然存在。这可以看作是 tikz 错误:对我来说,预期的行为是将节点名称保持在范围之外,但在图片结束后忘记它。(这不是最容易实现的事情......)

  • Forest 及其库不应该依赖于 forest 对 tikz 隐式坐标系的破解(事实上,可以通过包选项禁用破解tikzcshack),而是forest cs明确使用。

相关内容