使用 \tikzexternalize 与森林时出错

使用 \tikzexternalize 与森林时出错

使用forest包来获取简单的真值树,但我想将其外部化,因为真值树有很多。以下是代码示例:

\documentclass{article}
\usepackage[external]{forest}
\tikzexternalize

\begin{document}

\begin{forest}
    [$B \rightarrow C$
        [$C$
            [$\neg A$
                [$\neg B$
                ]
                [$C$
                ]
            ]
            [$B$
                [$\neg B$
                ]
                [$C$
                ]
            ]
        ]
    ]
\end{forest}

\end{document}

错误如下:

Command Line:   texify.exe --src --tex-option=--interaction=errorstopmode
--tex-option=--synctex=-1

.....    

ABD: EveryShipout initializing macros forest: Invoking a recursive call to
generate the external picture 'Test2-fores t-1' for the following
context+code: 'dj,8.39996pt,0.4pt,.3333em,.5\pgflinewidt h
,.3333em,.5\pgflinewidth @@ [$B \rightarrow C$ [$C$ [$\neg A$ [$\neg B$ ] [$C
$ ] ] [$B$ [$\neg B$ ] [$C$ ] ] ] ] ' ! Undefined control sequence.
\forest@temp ->\path
                     [draw]([email protected] anchor)--([email protected] anchor);
l.24 \end{forest}

? x No pages of output. Transcript written on Test2.log. texify: latex failed
for some reason (see log file).

如果我注释掉,一切都会正常工作\tikzexternalize

答案1

这确实是一个错误,感谢您发现它!

begin draw我在引入键和时在 v1.03 中引入了错误end draw。(键背后的想法是能够自定义tikzpicture整个文档中使用的环境,甚至使用除了tikz绘制树之外的其他东西。)

出现此错误的原因是,上一个\tikz命令被一对 和 替换\pgfkeysalso{/forest/begin draw}\pgfkeysalso{/forest/end draw}默认为\begin{tikzpicture}\end{tikzpicture}。在处理 的扩展时\begin{tikzpicture}tikz的外部化宏正在寻找 来\end{tikzpicture}收集图片环境。但是,\end{tikzpicture}隐藏在 的扩展中\pgfkeysalso{/forest/end draw},因此无法找到。我已通过提前扩展键来更正此问题。(我还修复了在此过程中发现的另一个错误,在 中\forest@externalizing@maybeoptimize。)

修正版本暂时可以找到这里。如果它有效,请告诉我。如果有效,我会尽快将新版本发布到 CTAN。

pgf关于/的外部化机制的附注tikz。虽然我发现它总体上非常方便,但我需要对其进行破解才能使用它,而生成的代码看起来像黑魔法。(我不敢想象新版本的/forest需要进行哪些调整。)在处理这个问题时,我对如何让包编写者更容易使用它(也包括不使用/的包)有一些想法,最重要的是,如何使用多页 PDF 使其速度大大加快。那么,问题来了:大家对这样的新版本感兴趣吗?pgftikzpgftikz

答案2

我同意这看起来像是一个错误。正如@Qrrbrbirlbel 提到的,tikzpicture使用该选项时环境设置不正确external,因此编译器无法识别 tikz 命令,例如\path

我通过更改包代码中的以下几行来编译该示例forest

%% Old 
\pgfkeysalso{/forest/begin draw}%
...
\pgfkeysalso{/forest/end draw}%

%% New 
\begin{tikzpicture}
...
\end{tikzpicture}

也许有人可以帮助理解为什么仅在external设置该选项时才会出现此错误,并提出更好的解决方案。

这是可以运行的另一个版本。(注意:需要使用以下命令进行编译:pdflatex -shell-escape file.tex。)

下载 forest2.sty

\documentclass{article}
\usepackage[external]{forest2}
\tikzexternalize

\begin{document}

\begin{forest}
    [$B \rightarrow C$
        [$C$
            [$\neg A$
                [$\neg B$
                ]
                [$C$
                ]
            ]
            [$B$
                [$\neg B$
                ]
                [$C$
                ]
            ]
        ]
    ]
\end{forest}

\end{document}

相关内容