在带有副标题的标题中显示短标题和长标题(两者)

在带有副标题的标题中显示短标题和长标题(两者)

我正在尝试使用提供的调整在标题中显示短标题和长标题(两者)吗?与子标题包一起。

不幸的是它坏了:

\documentclass{scrartcl}
\usepackage{subcaption}

\makeatletter
\let\x@caption\caption % original \caption
\def\x@@caption[#1]#2{\x@caption[{#1}]{#1 --- #2}} % with optional arg
\def\x@@@caption#1{\x@caption[{#1}]{#1}} % without optional arg
\def\caption{\@ifnextchar[\x@@caption\x@@@caption} % new \caption
\makeatother

\begin{document}

\listoffigures

\begin{figure}
\centering
\rule{5cm}{5cm}
\caption[Optional text.]{Obligatory text.}
\end{figure}

\begin{figure}
\centering
\rule{5cm}{5cm}
\caption{Obligatory text only.}
\end{figure}

\end{document}

我在我的文档中使用了许多子图,因此放弃子标题包是唯一的选择。

编辑:

使用带有选项的 caption 包\usepackage[compatibility=false]{caption}确实会生成预期格式的图形标题(可选文本。-- 必填文本。)以及相应的图形条目列表(可选文本。)。感谢 TeXnician 的评论。

答案1

有多种方法可以让标题在不同的浮点数中表现不同。通常的方法是设置并测试\@captype,但也可以简单地\caption在浮点数内重新定义。这似乎是 KOMA 使用的方法。所以你只需要重新设置它。

注意:不要将和的论点##1相混淆。#1\captionreset

\documentclass{scrartcl}
\usepackage[compatibility=false]{caption}
\usepackage{subcaption}

\makeatletter
\newcommand{\captionreset}{%
  \let\x@caption\caption % original (caption package) \caption
  \renewcommand{\caption}[2][\empty]{\ifx\empty##1\relax\x@caption{##2}%
    \else\x@caption[##1]{##1 -- ##2}%
    \fi}% new \caption
}
\let\x@figure=\figure % original figure
\renewcommand{\figure}{\x@figure\captionreset}
\makeatother

\begin{document}

\listoffigures

\begin{figure}
\centering
\rule{5cm}{5cm}
\caption[Optional text.]{Obligatory text.}
\end{figure}

\begin{figure}
\centering
\rule{5cm}{5cm}
\caption{Obligatory text only.}
\end{figure}

\end{document}

我从 KOMA 源中发现被或\caption替换。因此,更简单的解决方案是替换序言中的那些。\captionabove\captionbelow

\makeatletter
\let\x@caption\caption% original (caption package) \caption
\newcommand{\x@@caption}[2][\empty]{%
  \ifx\empty#1\relax\x@caption{#2}%
  \else\x@caption[#1]{#1 -- #2}%
  \fi}% modified caption
\let\caption\x@@caption% new global \caption for other float types
\renewcommand{\captionabove}[2][\empty]{\captionsetup{position=above}%
  \x@@caption[#1]{#2}%
}% new \captionabove
\renewcommand{\captionbelow}[2][\empty]{\captionsetup{position=below}%
  \x@@caption[#1]{#2}%
}% new \captionbelow
\makeatother

答案2

你只需禁用兼容模式即可。这有效:

\documentclass{scrartcl}
\usepackage[compatibility=false]{caption}
\usepackage{subcaption}

\makeatletter
\let\x@caption\caption % original \caption
\def\x@@caption[#1]#2{\x@caption[{#1}]{#1 --- #2}} % with optional arg
\def\x@@@caption#1{\x@caption[{#1}]{#1}} % without optional arg
\def\caption{\@ifnextchar[\x@@caption\x@@@caption} % new \caption
\makeatother

\begin{document}

\listoffigures

\begin{figure}
\centering
\rule{5cm}{5cm}
\caption[Optional text.]{Obligatory text.}
\end{figure}

\begin{figure}
\centering
\rule{5cm}{5cm}
\caption{Obligatory text only.}
\end{figure}

\end{document}

相关内容