2

I am trying to use the tweak provided in Display short title and long title (both) in a caption? together with the subcaption package.

Unfortunatelly it breaks:

\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}

I am using many subfigures in my document, so going away from the subcaption package is no alternative.

Edit:

Using the caption package with option \usepackage[compatibility=false]{caption} does produce figure captions of the intended format (Optional text. -- Obligatory text.) with the corresponding list of figures entry (Optional text.). Thanks to TeXnician for the remark.

1

There is more than one way to cause caption to behave differently in different floats. The usual way is to set and test \@captype, but one can also simply redefine \caption inside the float. This appears to be the approach used by KOMA. So you just need to reset it back again.

Note: the ##1 is to not confuse it with the #1 argument for \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}

From the KOMA source I found that \caption was being replaced by either \captionabove or \captionbelow. So a simpler solution would be to replace those in the preamble.

\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
  • Only remaining problem: I have no clue how this might work with lstlistings with enabled float... but for figures and tables this is perfect! – BR123 Feb 16 '17 at 0:14
  • I found a simpler solution. – John Kormylo Feb 16 '17 at 18:18
  • how can we make this work with report class ? – Ciprian Tomoiagă Mar 8 '18 at 21:51
  • @CiprianTomoiagă - The OP code should work with report class. It is KOMA that makes it difficult. – John Kormylo Mar 9 '18 at 2:04
0

You simply have to disable compatibility mode. This works:

\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}
  • 1
    Sorry, I forgot to mention that I already tried this: Then the [Optional text] does not show up in the figure caption as intended – BR123 Feb 15 '17 at 11:48
  • Than: \caption[Text in LOF.]{Text in LOF. Some more text.} ... – Zarko Feb 15 '17 at 11:55
  • I don't like this approach since then I have to write the text twice. This is vulnerable to errors – BR123 Feb 21 '17 at 13:29

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.