记住,调用原始宏,并在更新命令时恢复宏

记住,调用原始宏,并在更新命令时恢复宏

假设你想暂时地重新定义宏其中您使用原文。是否有一个通用的方法来记住原始定义、在临时定义中使用原始定义,然后恢复原始定义?

这是我正在尝试解决的一个实际问题:

\begin{figure}
\ContinuedFloat
% . . . some figure . . .
% ??? Preserve the original ???
\renewcommand{\thefigure}{\originalTheFigure~(continued)}
\caption{} % -> prints "Figure 3 (continued)"
\renewcommand{\thefigure}{\originalTheFigure}

对于这个特定的例子,可能存在(并且确实存在)其他解决方案,但我认为该技术可以用于解决许多其他问题。

答案1

如果您不使用包caption重新定义,\thefigure则不会产生“图 3(续)”而是“图 3(续):”(请注意末尾的冒号)。这不会发生在包中caption,但尽管如此,我还是建议定义一个命令\ContinuedCaption,它会更改labelformat而不是重新定义\thefigure

\documentclass{article}

\usepackage{caption}

\newcommand*{\ContinuedCaption}{%
  \ContinuedFloat% Because \ContinuedCaption makes only sense inside continued floats
  \begingroup% only needed, if \ContinuedCaption should be mixed with standard \caption in the same float
    \captionsetup{labelsep=space}%
    \caption[]{(continued)}%
  \endgroup% to end the group started with \begingroup and therefore the effect of \captionsetup
}

\usepackage{mwe}

\begin{document}
\listoffigures

\section{Test}
\blindtext

\begin{figure}[ht!]
  \centering
  \includegraphics{example-image-a}
  \caption{This is an example caption for the first part of the example image}
\end{figure}

\blindtext

\begin{figure}
  \centering
  \includegraphics{example-image-b}
  \ContinuedCaption
\end{figure}

\end{document}

我已经将 的更改封装labelformat到了本地组中。因此效果仅限于 的使用\ContinuedCaption

现在继续计算:

续图为“图 1(续)”

使用空的可选参数(\caption[]{(continued)}如图所示)确实会阻止将条目添加到图形列表中。如果您将其删除,图形列表中也会有一个条目“图 1(续)”。您还可以向定义添加可选参数,仅用于图形列表中的可选条目:

\newcommand*{\ContinuedCaption}[1][]{%
  \ContinuedFloat% Because \ContinuedCaption makes only sense inside continued floats
  \begingroup
    \captionsetup{labelsep=space}%
    \caption[{#1}]{(continued)}%
  \endgroup
}

或者

\newcommand*{\ContinuedCaption}[1][\emph{(continued)}]{%
  \ContinuedFloat% Because \ContinuedCaption makes only sense inside continued floats
  \begingroup
    \captionsetup{labelsep=space}%
    \caption[{#1}]{(continued)}%
  \endgroup
}

但是,如果你坚持要改变\thefigure,你可以将其添加到的定义中\ContinuedCaption

\documentclass{article}
\usepackage{caption}

\newcommand*{\ContinuedFigureCaption}{%
  \ContinuedFloat% Because \ContinuedCaption makes only sense inside continued floats
  \begingroup
    \NewCommandCopy\OriginalTheCaption\thefigure
    \renewcommand*\thefigure{\OriginalTheCaption~(continued)}%
%    \captionsetup{labelsep=space}% not needed because package caption does this with empty captions automatically
    \caption[]{}% empty optional argument needed (see below)
  \endgroup
}

\usepackage{mwe}

\begin{document}
\listoffigures

\section{Test}
\blindtext

\begin{figure}[ht!]
  \centering
  \includegraphics{example-image-a}
  \caption{This is an example caption for the first part of the example image}
\end{figure}

\blindtext

\begin{figure}
  \centering
  \includegraphics{example-image-b}
  \ContinuedFigureCaption
\end{figure}

\end{document}

但是,这个定义不太通用,因为它不能用于没有变化的表格。如果没有可选参数[]\caption它对于图列表也会有问题,因为现在“(继续)”是其中的一部分,如果图列表中的数字和为数字保留的空间是有限的。因此,它会导致文本和点不必要的重叠:

图表条目问题列表

\l@figure因此,如果您想要(可选)图列表条目,您还必须重新定义。但是,对于主要图条目,数字和文本之间也会有很大差距。因此\thefigure,如果您想要继续图列表的条目,我不建议使用重新定义。

第一个建议更为通用,因为它不仅可以用于,figure还可以用于table(和其他浮点数)。并且它不会导致图表列表或表格列表的条目出现问题。

注意:\NewCommandCopy需要较旧的 LaTeX 内核。如果您使用的是较旧的 LaTeX,您可以将其替换为(在本例中)\let。但我建议更新 LaTeX。

答案2

我会发帖斯基尔蒙在上面她/他的评论中的回答:

  1. \begingroup用和划定该部分\endgroup
  2. 在该部分内,用来\NewCommandCopy记住原始定义并使用原始宏的副本重新定义该宏。
  3. 之后\endgroup,自动恢复原有定义。

米科他的上述评论也帮助了我。

以下是针对问题帖中给出的示例的解决方案的实现方式。(但是,当然,科博哈对于这个特定的例子来说, 的解决方案要好得多。

\documentclass{article}
\usepackage{caption}
\begin{document}
\begin{figure}
\caption{First part}
\end{figure}
\begin{figure}
  \ContinuedFloat
  \begingroup
  \NewCommandCopy{\originalTheFigure}{\thefigure}
  \renewcommand{\thefigure}{\originalTheFigure~(continued)}
  \caption{}% Empty
  \endgroup
\end{figure}
\end{document}

相关内容