我有一个巨大的文档(练习题库),其中包含大量语句(每个子练习一个文件)。为了不迷失在这个混乱中并轻松地从 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}
相同的警告,两个边注(位置很奇怪)。
来自
pic
TikZ 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
。