todonotes 和 tikzexternalize

todonotes 和 tikzexternalize

在我的文档中,我使用todonotesTikZ/ pgfplots。在 中激活外部化后,TikZ我意识到 也todonotes全部导出了(因为它们基于TikZ)。

这种行为很不方便,我最好告诉tikz-external它忽略所有\todo

我知道我通常可以禁用外部化\tikzset{external/export=false}并仅为选定的图打开它,但反过来会更方便。

答案1

我之前也遇到过这个问题,只是因为命令\todo(我从来不用\missingfigure)。下面是我修复它的方法(把这个放在你的前言中,在todonotesand tikz/pgfplots被调用的某个地方):

\makeatletter
\renewcommand{\todo}[2][]{\tikzexternaldisable\@todo[#1]{#2}\tikzexternalenable}
\makeatother

现在,\todo将被外部化进程忽略。

因此,对于\missingfigure您需要的命令

\makeatletter
\renewcommand{\missingfigure}[2][]{\tikzexternaldisable\@missingfigure[#1]{#2}\tikzexternalenable}
\makeatother

答案2

对我来说,这两个解决方案都不起作用。考虑到接受的答案获得了大量赞成票,这可能是平台相关的。

然而,mSSM 的方法与之\let接近。它无法正常工作的原因\missingfigure是后者消耗了一个可选参数。简单方法\let无法将所有必需信息复制到新宏中。根据件,应该使用letltxmacro包。最终,我的工作版本是:

\usepackage{letltxmacro}

\LetLtxMacro{\oldmissingfigure}{\missingfigure}
\renewcommand{\missingfigure}[2][]{\tikzexternaldisable\oldmissingfigure[{#1}]{#2}\tikzexternalenable}

\LetLtxMacro{\oldtodo}{\todo}
\renewcommand{\todo}[2][]{\tikzexternaldisable\oldtodo[#1]{#2}\tikzexternalenable}

答案3

我已经尝试过\missingfigure,但是简单的\renewcommand{\missingfigure}...方法不起作用,正如@Frits 的回答所示。

我发现的唯一解决方案是定义一个新命令:

\newcommand{\extmissingfigure}[2][]{\tikzexternaldisable\missingfigure[#1]{#2}\tikzexternalenable}

使用\let,即:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{external}
\usepackage{todonotes}

\tikzexternalize

\let\oldmissingfigure\missingfigure
\renewcommand{\missingfigure}[2][]{\tikzexternaldisable\oldmissingfigure[#1]{#2}\tikzexternalenable}

\begin{document}

\missingfigure{Ah!}

\end{document}

不幸的是引发了一个错误:

! TeX capacity exceeded, sorry [input stack size=5000].
<to be read again> 
\tikzexternal@orig@tikzfadingfrompicture 
l.18 \missingfigure{Ah!}

答案4

我找到了另一种解决方法,它只是修改了命令的原始实现todo。只需修改

\newcommand{\todo}[1]{%
  % Add to todo list
  \addcontentsline{tdo}{todo}{\protect{#1}}%
  %
  \begin{tikzpicture}[remember picture, baseline=-0.75ex]%
    \node [coordinate] (inText) {};
  \end{tikzpicture}%
  %
  % Make the margin par
  \marginnote{%
    \begin{tikzpicture}[remember picture]%
      \definecolor{orange}{rgb}{1,0.5,0}
      \draw node[draw=black, fill=orange, text width = 3cm] (inNote)
      {#1};%
    \end{tikzpicture}%
  }%
  %
  \begin{tikzpicture}[remember picture, overlay]%
    \draw[draw = orange, thick]
      ([yshift=-0.2cm] inText)
      -| ([xshift=-0.2cm] inNote.west)
      -| (inNote.west);
  \end{tikzpicture}%
  %
}%

\tikzexternaldisable通过在环境之前和\tikzexternalenable之后插入tikzpicture

\newcommand{\todo}[1]{%
  \tikzexternaldisable
  % Add to todo list
  \addcontentsline{tdo}{todo}{\protect{#1}}%
  %
  \begin{tikzpicture}[remember picture, baseline=-0.75ex]%
    \node [coordinate] (inText) {};
  \end{tikzpicture}%
  %
  % Make the margin par
  \marginnote{%
    \begin{tikzpicture}[remember picture]%
      \definecolor{orange}{rgb}{1,0.5,0}
      \draw node[draw=black, fill=orange, text width = 3cm] (inNote)
      {#1};%
    \end{tikzpicture}%
  }%
  %
  \begin{tikzpicture}[remember picture, overlay]%
    \draw[draw = orange, thick]
      ([yshift=-0.2cm] inText)
      -| ([xshift=-0.2cm] inNote.west)
      -| (inNote.west);
  \end{tikzpicture}%
  \tikzexternalenable
  %
}%

相关内容