以下冲突的原因是什么?我该如何解决?
当文档包含以下元素时,冲突涉及编译错误:
- 钛钾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
明确使用。