(可能与这,但示例和错误与我所想的非常不同。另外,这是 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
在\tikzexternaldisable
and中\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.)为tikzmark
64819(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 不会导致此错误的发生。
(我还要指出的是,据我所知,这个错误实际上并没有造成任何影响 - 图片仍然会被处理 - 所以你可以忽略它。)