假设你想暂时地重新定义宏其中您使用原文。是否有一个通用的方法来记住原始定义、在临时定义中使用原始定义,然后恢复原始定义?
这是我正在尝试解决的一个实际问题:
\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
。
现在继续计算:
使用空的可选参数(\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
我会发帖斯基尔蒙在上面她/他的评论中的回答:
\begingroup
用和划定该部分\endgroup
。- 在该部分内,用来
\NewCommandCopy
记住原始定义并使用原始宏的副本重新定义该宏。 - 之后
\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}