在 TikZ 中重复使用图像或盒子,但只产生一次副作用

在 TikZ 中重复使用图像或盒子,但只产生一次副作用

我有一个巨大的文档(练习题库),其中包含大量语句(每个子练习一个文件)。为了不迷失在这个混乱中并轻松地从 PDF 中打开文件,我在每个和\input处都添加了一个边注,其中包含指向所含文件的链接。\input\includegraphics

现在我开始看到类似这样的警告

LaTeX Warning: Label `note.1.1' multiply defined.

我把问题缩小到这个 MFE:

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{external}
\tikzexternalize
\tikzset{external/mode=list and make,%
         external/export=true}

\usepackage{marginnote}
\newcommand{\inclimage}[2][]{%
  \marginnote{\texttt{#2}}\includegraphics[#1]{#2}%
}

\begin{document}
  \def\icon{\inclimage[width=100pt]{example-image.png}}
  \begin{tikzpicture}
    \node {\icon};
  \end{tikzpicture}
  \begin{tikzpicture}
    \node {\icon};
  \end{tikzpicture}
\end{document}

该文件需要两次运行才能翻译,中间还要编译外部化的图片。我相当确定这list and make与问题无关,但我就是这样使用的。

现在,在 aux 文件中我发现:

\def \dpthimport {\newmarginnote {note.1.1}{{\themn@abspage }{0sp}}}\dpthimport

删除 TikZ 外部化或边注业务,警告就会消失。事实上,如果没有外部化,辅助文件只包含

\newmarginnote{note.1.1}{{2}{10000988sp}}

的使用\dpthimport似乎与外化有关。

因此,问题似乎在于,在为每张图片本身进行翻译时(由于外部化),marginnote为每个实例选择相同的标签名称,\icon然后在编译整个文档时(再次)发生冲突。

我尝试定义一次图像并在图片中重复使用它。

  • 带有保存盒:

    \begin{document}
      \newsavebox{\IconBox}
      \sbox{\IconBox}{\tikz\node{\inclimage[width=100pt]{example-image.png}};}
    
      \begin{tikzpicture}
        \node {\usebox{\IconBox}};
      \end{tikzpicture}
      \begin{tikzpicture}
        \node {\usebox{\IconBox}};
      \end{tikzpicture}
    \end{document}
    

    相同的警告,两个边注(位置很奇怪)。

  • 来自picTikZ 3.0:

    \begin{document}
      \tikzset{%
        icon/.pic={\node {\inclimage[width=100pt]{example-image.png}};}
      }
      \begin{tikzpicture}
        \pic {icon};
      \end{tikzpicture}
      \begin{tikzpicture}
       \pic {icon};
      \end{tikzpicture}
    \end{document}
    

    同样的警告,没有边注。

我如何定义一个图像和一个框,以便

  • 它只展开一次,即副作用(如边注)只适用一次,并且
  • 它可以在 TikZ 图像中重复使用吗?

答案1

\documentclass{article}

\usepackage{tikz}
\usepackage{marginnote}
\newcommand{\inclimage}[2][]{%
  \marginnote{\texttt{#2}}\includegraphics[#1]{#2}%
}
\begin{document}
  \newsavebox{\IconBox}
  \sbox{\IconBox}{\tikz\node{\inclimage[width=100pt]{example-image.png}};}

  \begin{tikzpicture}
    \node {\usebox{\IconBox}};
  \end{tikzpicture}
  \begin{tikzpicture}
    \node {\usebox{\IconBox}};
  \end{tikzpicture}
\end{document}

生产

LaTeX Warning: There were multiply-defined labels.

因为盒子有一个\write使用两次的注释。\leaders是一个 TeX 原语,旨在多次重复一个盒子,通常用于......目录等,但您可以安排领导者只制作一个副本,因为用领导者包装盒子的一个有用的副作用是所有写入都被禁用。

所以

\documentclass{article}

\usepackage{tikz}
\usepackage{marginnote}
\newcommand{\inclimage}[2][]{%
  \marginnote{\texttt{#2}}\includegraphics[#1]{#2}%
}

\def\xusebox#1{\leavevmode\leaders\copy#1\hskip\wd#1\\kern0pt\relax}
\begin{document}
  \newsavebox{\IconBox}
  \sbox{\IconBox}{\tikz\node{\inclimage[width=100pt]{example-image.png}};}

  \begin{tikzpicture}
    \node {\xusebox{\IconBox}};
  \end{tikzpicture}
  \begin{tikzpicture}
    \node {\xusebox{\IconBox}};
  \end{tikzpicture}
\end{document}

不产生任何警告(如果您编辑文档,则需要运行两次才能摆脱辅助文件的影响)。

\leaders这种方式通常适用,但在这种情况下布局相当奇怪,因为边注无法在(水平结构,没有换行或边距)内执行任何操作\sbox

相关内容