\AtBeginDocument + \usetikzlibrary + 记住图片 = 未定义 \savepicturepage

\AtBeginDocument + \usetikzlibrary + 记住图片 = 未定义 \savepicturepage

我正在编写一个包,首先检查 tikz 包是否已加载,然后添加一些 tikz 库

但是,此包与 tikzpicture 的“记住图片,覆盖”选项有冲突

我的 MWE 将包的内容嵌入到单个 tex 文件中:

\documentclass[10pt,a4paper]{article}

\AtBeginDocument{\usetikzlibrary{tikzmark}}

\usepackage{tikz}

\begin{document}

\begin{tikzpicture}[remember picture, overlay]
\draw (0,0) -- (1,1);
\end{tikzpicture}

\end{document}

在 Texmaker 中(我不知道这是否重要),这可以在初始构建时生成 pdf 文件。但是,如果我再次构建 .tex 文件,它会给出错误消息:“未定义的控制序列\savepicturepage” 。

(参见\usetiklibarary部分在包内,应该在之前\usepackage{tikz},这就是我使用的原因\AtBeginDocument。出于另一个原因,我还应该使用 [记住图片,覆盖] 选项)

有人知道为什么吗?

答案1

你通常不能加载 Ti文档开始处的 Z 库。

使用当前的 LaTeX,您可以进行加载就在之前开始文档:

documentclass[10pt,a4paper]{article}

\makeatletter % this will go in the .sty file
\AddToHook{begindocument/before}{%
  \@ifpackageloaded{tikz}{\usetikzlibrary{tikzmark}}{}%
}
\makeatother

\usepackage{tikz}

\begin{document}

\begin{tikzpicture}[remember picture, overlay]
\draw (0,0) -- (1,1);
\end{tikzpicture}

\end{document}

如果您希望它也适用于旧版本的 LaTeX,您需要加载etoolbox并使用\AtEndPreamble

\documentclass[10pt,a4paper]{article}

\makeatletter % this will go in the .sty file
\@ifundefined{AddToHook}{%
    \RequirePackage{etoolbox}%
    \AtEndPreamble{%
      \@ifpackageloaded{tikz}{\usetikzlibrary{tikzmark}}{}%
    }%
  }{%
    \AddToHook{begindocument/before}{%
      \@ifpackageloaded{tikz}{\usetikzlibrary{tikzmark}}{}%
  }%
}
\makeatother

\usepackage{tikz}

\begin{document}

\begin{tikzpicture}[remember picture, overlay]
\draw (0,0) -- (1,1);
\end{tikzpicture}

\end{document}

相关内容