对所有图形进行全局重新标记

对所有图形进行全局重新标记

我可以从图 10 开始全局更改所有图形和对图的引用吗?

那么数字 10 以及所有对 10 的引用都变成 11 等等?

我可能应该补充一下,我有大约 30 个图,并在图 9 上方添加了一个图,取代了我当前的数量。这就是为什么我需要重新标记所有图和对图的引用。

当前图形标签:

\label{fig:fig1}\label{fig:fig2}, 等等

答案1

不建议用数字来标记图形或其他元素。标签只是一个任意字符串,它应该容易记住或至少有意义,并且与引用对象分配的任何特定数字无关。

你遇到了一个很常见的问题:一份文件只有在完成后才算完成。重复?也许吧,但直到一份文件完成,你不能知道某个部分或某个图形将被分配什么编号,因为您或您的主管或编辑可能会要求将一个部分分成两个,合并两个部分,将一个图形移动到另一个图形之后;可能性是无穷无尽的。

因此,如果你的章节是关于毕达哥拉斯定理的,最好用一个字符串标记它,以提醒你该章节的内容:

\section{Pythagoras' theorem}\label{sec:pythagoras}

您可以使用它来引用\ref{sec:pythagoras},然后就会出现正确的数字。无需知道实际数字。

对于图形来说也是一样:

\begin{figure}
\centering

\includegraphics{duck}

\caption{Picture of a duck}\label{fig:duck}
\end{figure}

要获取图形编号,只需输入\ref{fig:duck}

在编写文档时,加载这样的包showkeys非常有用,因为它会显示它们引用的元素旁边的标签,因此在引用时很容易选择正确的名称。


如何解决您的特定问题?只需加载showkeys包并在引用时查找您已经拥有的名称。\label{fig:new}为新图添加或任何您喜欢的内容,保持其他不变。下一个图仍将具有\label{fig:fig10},但具有

\ref{fig:fig10}

你会得到正确的11号,无需其他干预。引用时记住它即可。

警告对于文档的最终版本,删除了 的加载showkeys

答案2

根据 @texenthusiast 的想法,也可以使用图形的文件名作为标签。由于两者都应该是描述性的,因此保持它们同步是合乎逻辑的。这可能是代码:

\documentclass{article}

\usepackage{graphicx}
\usepackage{letltxmacro}

% Save the figure's name in a macro to use the name at the end of the figure environment.
% This is needed, as the label has to be given after the caption command and directly before
% the end of the figure environment is the only place where this is guaranteed.
\LetLtxMacro{\includegraphicsOld}{\includegraphics}
\renewcommand{\includegraphics}[2][]{%
    \includegraphicsOld[#1]{#2}%
    \def\currentFigureName{#2}%
}
\let\endfigureOld\endfigure
\renewcommand{\endfigure}{%
    \label{fig:\currentFigureName}%
    \endfigureOld
}

\begin{document}
    \begin{figure}
        \includegraphics{mtsbwy}
        \caption{Description of my figure}
    \end{figure}
    This is my figure \ref{fig:mtsbwy}.
\end{document}

尽管没有明确设置标签,但引用是正确的。请注意,也可以手动设置和使用标签,因此如果默认启用标签,则不会出现任何问题。

如果一个图形在一个文档中第二次使用,则添加的功能可能会破坏第一个标签。但这似乎相当奇怪,可以通过将所有图形名称保存在全局宏中轻松修复。然后会检查图形是否已加载,并且可以选择新标签(fig:mtsbwy2或类似的东西,甚至可能是递归的)。

我可以想象一个包含此代码的包,如果加载了 subfloat 命令,可能还会支持它们。这是个好主意吗,还是有理由最好不要这样做?我期待评论。

相关内容