同时使用 TikZ 外部库和 tikzmark 库时出错

同时使用 TikZ 外部库和 tikzmark 库时出错

(可能与,但示例和错误与我所想的非常不同。另外,这是 2015 年的问题,答案已在 2017 年更新,不会更晚,所以我预计在此期间情况可能会发生变化。)

这是 MWE

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{
external,
tikzmark
}

\tikzexternalize[only named=true, prefix=externalized/]

\begin{document}

\tikzsetnextfilename{green}
\tikz{\draw[fill=green] (0,0) circle (12pt);}\dots

A node: \tikzmarknode{NodeName}{TikZ mark node}
% the following env is not actually necessary to trigger the error
\begin{tikzpicture}[remember picture, overlay]
  \node[yshift=-0.9em] at (NodeName) {some text under it};
\end{tikzpicture}

\end{document}

出现这样的错误

...
===== Image 'externalized/green' is up-to-date. ======

! Package tikz Error: Giving up on this path. Did you forget a semicolon?.

See the tikz package documentation for explanation.
Type  H <return>  for immediate help.
 ...                                              
                                                  
l.16 A node: \tikzmarknode{NodeName}{TikZ mark node}
                                                  
[1{/usr/local/texlive/2023/texmf-var/fonts/map/pdftex/updmap/pdftex.map}<./exte
rnalized/green.pdf>] (./externalizing.aux))
(see the transcript file for additional information)
 413 words of node memory still in use:
   3 hlist, 1 vlist, 1 rule, 2 glue, 3 kern, 1 glyph, 5 attribute, 48 glue_spec
, 5 attribute_list, 2 write nodes
   avail lists: 2:179,3:87,4:10,5:24,6:4,7:196,9:78,11:2
</usr/share/fonts/OTF/lmroman10-regular.otf>
Output written on externalizing.pdf (1 page, 5387 bytes).
SyncTeX written on externalizing.synctex.gz.
Transcript written on externalizing.log.

正如示例所示,在我的实际用例中,我曾经使用过\tikzmarknode一种方法来定位带有一些文本的 tikz 节点,使其与内联文本保持一致。我对外部化这张图片不感兴趣,甚至因为我认为这没有意义,因为它所做的只是提供定位。

不过,我确实还有其他“普通”的 TikZ 图片,我想将其外部化。

因此,仅靠注释来\tikzexternalize避免错误显然是不可行的。

到目前为止,我采用的显而易见的解决方案是将每次使用\tikzmarknode+的地方都括tikzpicture\tikzexternaldisableand中\tikzexternalenable,如下所示:

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{
external,
tikzmark
}

\tikzexternalize[only named=true, prefix=externalized/]

\begin{document}

\tikzsetnextfilename{green}
\tikz{\draw[fill=green] (0,0) circle (12pt);}\dots

\tikzexternaldisable
A node: \tikzmarknode{NodeName}{TikZ mark node}
% the following env is not actually necessary to trigger the error
\begin{tikzpicture}[remember picture, overlay]
  \node[yshift=-0.9em] at (NodeName) {some text under it};
\end{tikzpicture}
\tikzexternalenable

\end{document}

然而,我想知道为什么会这样,以及是否有比传播更好的解决\tikzexternaldisable方案\tikzexternalenable

此外,由于我使用only named=true,我不明白为什么 TikZ 在遇到时应该尝试任何外部化\tikzmarknode


tlmgr gui我看到的表格本地版本 (ver.)tikzmark64819(1.15)

答案1

这实际上不是一个tikzmark问题,而是与 TikZ 中使用该库和不使用该库时的不同行为有关external。我可以阻止错误发生,tikzmark但这并不能解决根本问题。

简而言之,以下代码在未external加载该库的情况下也可以运行,但在加载该库的情况下则不行:

\tikz {\draw (0,0) -- (1,0)}

使用该external库后,Tikz 会抱怨命令末尾缺少分号\draw。事实上,这样做(当external未加载库时)是经过设计的 - 查看 TikZ 代码,然后通过条件对此进行显式检查,\iftikz@auto@end@path如果此条件尚未由分号触发,则完成路径。\tikz在命令定义之前,代码中有一个没有分号的示例:

% Example:
%
% The rectangle \tikz{\draw (0,0) rectangle (1em,1ex)} has width 1em and
% height 1ex.

您看到此问题的原因\tikzmarknode是,当所有多余的部分被删除后,它就不再\tikz {\node[node contents={Stuff}]}有分号了。现在,我可以把分号放进去 -tikzlibrarytikzmark.code.tex应该将 507 行改为];}%- 但这并不能解释到底发生了什么。

我在 TikZ/pgf 问题跟踪器上提出了一个问题TikZ/pgf 团队回应说,外部库目前无人维护,但有更强大的替代方案。所以我在 tikzmark 库中添加了分号在 github 上(下次我发送东西给他们时会发送给 CTAN)如上所述以阻止错误的发生,因为这至少意味着 tikzmark 不会导致此错误的发生。

(我还要指出的是,据我所知,这个错误实际上并没有造成任何影响 - 图片仍然会被处理 - 所以你可以忽略它。)

相关内容