我从不同的文件中ìnput
两次包含 (via) 相同的内容pgfplot
。一次在文本中,一次在附录中的更详细视图中。由于标签是在额外文件中定义的,因此使用最新的标签(附录中的标签)。
我希望第二个输入不会重新定义标签。我该如何实现该行为?
答案1
您可以进行设置,以便标签本身能够执行正确的操作:
\begin{filecontents}{\jobname-extra}
\begin{figure}[htp]
\centering
\includegraphics[width=3cm]{example-image}
\singlelabel{extra}{\caption{An image}}
\end{figure}
\end{filecontents}
\documentclass{article}
\usepackage{graphicx}
\makeatletter
\newcommand{\singlelabel}[2]{%
\ifcsname singlelabel#1\endcsname
% the file has already been read
\@namedef{the\@captype}{\ref{#1}}%
#2%
\else
#2\label{#1}
\global\@namedef{singlelabel#1}{}%
\fi
}
\makeatother
\begin{document}
\section{Title}
\input{\jobname-extra}
\appendix
\section{Title again}
\input{\jobname-extra}
\end{document}
我以前filecontents
只是为了使示例独立起来。
编号将与原始图形相同。如果您想要独立编号,只需注释掉
\@namedef{the\@captype}{\ref{#1}}%
线
答案2
这是一个解决方案。
\documentclass{article}
\makeatletter
\def\@newl@bel#1#2#3{{%
\@ifundefined{#1@#2}%
{\global\@namedef{#1@#2}{#3}}%
{\gdef \@multiplelabels {%
\@latex@warning@no@line{There were multiply-defined labels}}%
\@latex@warning@no@line{Label `#2' multiply defined}}%
}}
\makeatother
\begin{document}
\section{foo bar}\label{foo}
\subsection{foo baz}\label{foo}
\ref{foo}
\end{document}
解释Latex 的\label
cal 内部命令\@newl@bel
\def\@newl@bel#1#2#3{{%
\@ifundefined{#1@#2}%
\relax
{\gdef \@multiplelabels {%
\@latex@warning@no@line{There were multiply-defined labels}}%
\@latex@warning@no@line{Label `#2' multiply defined}}%
\global\@namedef{#1@#2}{#3}}}
这类似于ifundefined{label}{do nothing}{produce warning}
然后全局定义标签(以便最后使用)。
可以重新定义这个命令为ifundefined{label}{globaly define the label}{produce warning}