% \iffalse meta-comment
% 
% This is file `caption3.dtx'.
% 
% Copyright (C) 1994-2011 Axel Sommerfeldt (axel.sommerfeldt@f-m.fm)
% 
% --------------------------------------------------------------------------
% 
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% of this license or (at your option) any later version.
% The latest version of this license is in
%   http://www.latex-project.org/lppl.txt
% and version 1.3 or later is part of all distributions of LaTeX
% version 2003/12/01 or later.
% 
% This work has the LPPL maintenance status "maintained".
% 
% This Current Maintainer of this work is Axel Sommerfeldt.
% 
% This work consists of the files caption.ins, caption.dtx, caption2.dtx,
% caption3.dtx, bicaption.dtx, ltcaption.dtx, and subcaption.dtx,
% the derived files caption.sty, caption2.sty, caption3.sty, bicaption.sty,
% ltcaption.sty, and subcaption.sty, and the user manuals caption-deu.tex,
% caption-eng.tex, and caption-rus.tex.
% 
% \fi
% \CheckSum{4127}
%
% \iffalse
%<*driver>
\NeedsTeXFormat{LaTeX2e}[1994/12/01]
\ProvidesFile{caption3.drv}[2011/08/06 v1.3 Implementation of the caption kernel]
\hbadness=9999 \newcount\hbadness \hfuzz=100pt % Make TeX shut up.
%\errorcontextlines=3
%
\documentclass{ltxdoc}
\setlength\parindent{0pt}
\setlength\parskip{\smallskipamount}
%
%\let\ORIsubsection\subsection
%\def\subsection{\clearpage\ORIsubsection}
%
\makeatletter % make room for subsections like 2.16.14 in the TOC
%\newcommand*\l@subsection{\@dottedtocline{2}{1.5em}{2.3em}}
\renewcommand*\l@subsection{\@dottedtocline{2}{1.5em}{2.7em}}
\makeatother
%
\usepackage{ifpdf}
\ifpdf
  \usepackage{mathptmx,courier}
  \usepackage[scaled=0.90]{helvet}
  \addtolength\marginparwidth{15pt}
\fi
%
\usepackage{hypdoc}
\ifpdf\usepackage{hypdestopt}\fi
\hypersetup{pdfkeywords={LaTeX, package, caption},pdfstartpage={},pdfstartview={}}
%
\usepackage[debug]{caption3}[2011/07/01]
%
\DeclareRobustCommand*\eTeX{\texorpdfstring
  {\leavevmode\hbox{$\varepsilon$}-\TeX}%
  {e-TeX}}
\DeclareRobustCommand*\AmS{\texorpdfstring
  {{\protect\usefont{OMS}{cmsy}{m}{n}A\kern-.1667em\lower.5ex\hbox{M}\kern-.125emS}}%
  {AMS}}
\DeclareRobustCommand*\KOMAScript{\texorpdfstring
  {\textsf{K\kern.05em O\kern.05em M\kern.05em A\kern.1em-\kern.1em Script}}%
  {KOMA-Script}}
\DeclareRobustCommand*\NTG{NTG}
\DeclareRobustCommand*\SmF{SMF}
%
\begin{document}
  \DocInput{caption3.dtx}
\end{document}
%</driver>
% \fi
%
% \newcommand*\purerm[1]{{\upshape\mdseries\rmfamily #1}}
% \newcommand*\puresf[1]{{\upshape\mdseries\sffamily #1}}
% \newcommand*\purett[1]{{\upshape\mdseries\ttfamily #1}}
% \let\class\puresf \let\package\puresf
% \let\env\purett \let\opt\purett
%
% \def\thispackage{the \package{caption} kernel}
% \def\Thispackage{The \package{caption} kernel}
%
% \newcommand*\csmarg[1]{\texttt{\char`\{#1\char`\}}}
% \newcommand*\csoarg[1]{\texttt{\char`\[#1\char`\]}}
% \newcommand*\version[2][]{\textit{v#2}}
% \newcommand*\x{\discretionary{-}{}{}}
% \newcommand*\xx{\discretionary{}{}{}}
%
% \GetFileInfo{caption3.drv}
% \let\docdate\filedate
% \GetFileInfo{caption3.sty}
%
% \title{The Implementation of
%        \texorpdfstring{\thispackage\thanks{%^^A
%          This package has version number \fileversion, last revised \filedate.}}%^^A
%        {the caption kernel}}
% \author{Axel Sommerfeldt\\
%         \href{mailto:axel.sommerfeldt@f-m.fm}{\texttt{axel.sommerfeldt@f-m.fm}}}
% \date{\docdate}
% \maketitle
%
% \begin{abstract}
% \Thispackage\ consists of two parts -- the kernel
% (|caption3.sty|) and the main package (|caption.sty|).
%
% The kernel provides all the user commands and internal macros which are
% necessary for typesetting captions and setting parameters regarding these.
% While the standard \LaTeX\ document classes provide an internal command
% called |\@makecaption| and no options to control its behavior (except the
% vertical skips above and below the caption itself), we provide similar
% commands called |\caption@make| and |\caption@@make|, but with a lot of
% options which can be selected with |\captionsetup|.
% Loading the kernel part do not change the output of a \LaTeX\ document
% -- it just provides functionality which can be used by \LaTeXe\ packages
% which typesets captions, for example the \package{caption} and
% \package{subfig} packages.
% \end{abstract}
% 
% \StopEventually{}
% \clearpage
% \tableofcontents
% 
% \iffalse
% --------------------------------------------------------------------------- %
% \fi
%
% \DoNotIndex{\\,\_,\ ,\@@par}
% \DoNotIndex{\@bsphack}
% \DoNotIndex{\@car,\@cdr,\@classoptionslist,\@cons,\@currext,\@currname}
% \DoNotIndex{\@ehc,\@ehd,\@empty,\@esphack,\@expandtwoargs}
% \DoNotIndex{\@for,\@firstofone,\@firstoftwo}
% \DoNotIndex{\@gobble,\@gobblefour,\@gobbletwo,\@hangfrom}
% \DoNotIndex{\if@minipage\@ifnextchar,\@ifpackagelater,\@ifpackageloaded}
% \DoNotIndex{\@ifstar,\@ifundefined,\@latex@error,\@minipagefalse,\@minipagetrue}
% \DoNotIndex{\@namedef,\@nameuse}
% \DoNotIndex{\@onlypreamble,\@parboxrestore,\@plus,\@ptionlist}
% \DoNotIndex{\@removeelement,\@restorepar,\@secondoftwo,\@setminipage,\@setpar}
% \DoNotIndex{\@tempa,\@tempboxa,\@tempdima,\@tempdimb,\@tempdimc,\@tempb,\@tempc}
% \DoNotIndex{\@testopt}
% \DoNotIndex{\@undefined,\@unprocessedoptions,\@unusedoptionlist}
% \DoNotIndex{\p@,\z@}
% \DoNotIndex{\active,\addtocounter,\addtolength,\advance,\aftergroup}
% \DoNotIndex{\baselineskip,\begin,\begingroup,\bfseries,\box}
% \DoNotIndex{\catcode,\centering,\changes,\csname,\def,\divide,\do,\downarrow}
% \DoNotIndex{\edef,\else,\empty,\end,\endcsname,\endgraf,\endgroup,\expandafter}
% \DoNotIndex{\fi,\footnotesize,\global}
% \DoNotIndex{\hangindent,\hbox,\hfil,\hsize,\hskip,\hspace,\hss}
% \DoNotIndex{\ifcase,\ifdim,\ifnum,\ifodd,\ifvoid,\ifvmode}
% \DoNotIndex{\ifx,\ignorespaces,\itshape}
% \DoNotIndex{\Large,\large,\leavevmode,\leftmargini,\leftskip,\let,\linewidth}
% \DoNotIndex{\llap,\long,\m@ne,\margin,\mdseries,\message}
% \DoNotIndex{\newcommand,\newdimen,\newlength,\newline,\newif,\newsavebox}
% \DoNotIndex{\next,\nobreak,\nobreakspace,\noexpand,\noindent,\numberline}
% \DoNotIndex{\normalcolor,\normalfont,\normalsize,\or,\par,\parbox,\parfillskip}
% \DoNotIndex{\parindent,\parskip,\prevdepth,\protect,\protected@edef,\protected@write}
% \DoNotIndex{\providecommand,\quad}
% \DoNotIndex{\raggedleft,\raggedright,\relax,\renewcommand,\RequirePackage}
% \DoNotIndex{\rightskip,\rmfamily}
% \DoNotIndex{\sbox,\scriptsize,\scshape,\setbox,\setlength,\sffamily,\slshape}
% \DoNotIndex{\small,\string,\space,\strut}
% \DoNotIndex{\textheight,\the,\toks@,\typeout,\ttfamily}
% \DoNotIndex{\unvbox,\uparrow,\upshape,\usebox,\usepackage}
% \DoNotIndex{\value,\vbox,\vsize,\vskip,\wd,\width,\z@skip}
% \DoNotIndex{\AtBeginDocument,\AtEndOfPackage,\CurrentOption,\DeclareOption}
% \DoNotIndex{\ExecuteOptions,\GenericWarning,\IfFileExists,\InputIfFileExists}
% \DoNotIndex{\NeedsTeXFormat,\MessageBreak}
% \DoNotIndex{\PackageError,\PackageInfo,\PackageWarning,\PackageWarningNoLine}
% \DoNotIndex{\PassOptionsToPackage,\ProcessOptions,\ProvidesPackage}
%
% \iffalse
% --------------------------------------------------------------------------- %
% \fi
%
% \setlength{\parskip}{0pt plus 1pt}
% \newcommand*\Note[2][Note]{\par{\small\emph{#1:} #2}\par}
%
% \changes{v1.0}{2003/12/20}{Rewritten; many new commands and features}
% \changes{v1.0c}{2004/11/28}{Split into two packages:
%                             \package{caption} \& \package{caption3}}
%
% \iffalse
% --------------------------------------------------------------------------- %
% \fi
%
% \clearpage
% \let\subsubsection\subsection
% \let\subsection\section
%
% \iffalse
%<*package>
% \fi
%
% \subsection{Identification}
%
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}[1994/12/01]
\ProvidesPackage{caption3}[2011/08/18 v1.3b caption3 kernel (AR)]
%    \end{macrocode}
%
% \subsection{Generic helpers}
%
% \begin{macro}{\@nameundef}
%  This is the opposite to |\@namedef| which is offered by the \LaTeX\ kernel.
%  We use it to remove the definition of some commands and keyval options after
%  |\begin{document}| (to save \TeX\ memory) and to remove caption options defined
%  with |\captionsetup|\oarg{type}.
%    \begin{macrocode}
\providecommand*\@nameundef[1]{%
  \expandafter\let\csname #1\endcsname\@undefined}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\l@addto@macro}
%  The \LaTeXe\ kernel offers the internal helper macro |\g@addto@macro| which
%  globally adds tokens to existing macros, like in |\AtBeginDocument|.
%  This is the same but it works local, not global
%  (using \cs{edef} instead of \cs{xdef}).
%    \begin{macrocode}
\providecommand\l@addto@macro[2]{%
  \begingroup
    \toks@\expandafter{#1#2}%
    \edef\@tempa{\endgroup\def\noexpand#1{\the\toks@}}%
  \@tempa}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bothIfFirst}
% \begin{macro}{\bothIfSecond}
%  |\bothIfFirst| tests if the first argument is not empty, |\bothIfSecond|
%  tests if the second argument is not empty. If yes both arguments get
%  typeset, otherwise none of them.
%    \begin{macrocode}
\def\bothIfFirst#1#2{%
  \protected@edef\caption@tempa{#1}%
  \ifx\caption@tempa\@empty \else
    #1#2%
  \fi}
%    \end{macrocode}
%    \begin{macrocode}
\def\bothIfSecond#1#2{%
  \protected@edef\caption@tempa{#2}%
  \ifx\caption@tempa\@empty \else
    #1#2%
  \fi}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\caption@ifundefined}
% \changes{v1.3a}{2011/08/12}{This macro added}
% \changes{v1.3b}{2011/08/18}{Made expandable}
% Similar to \cs{@ifundefined} offered by the \LaTeX kernel, but does
% not define the undefined macro as \cs{relax}.
%    \begin{macrocode}
\newcommand*\caption@ifundefined[1]{%
  \ifx#1\@undefined
    \expandafter\@firstoftwo
  \else\ifx#1\relax
    \expandafter\expandafter\expandafter\@firstoftwo
  \else
    \expandafter\expandafter\expandafter\@secondoftwo
  \fi\fi}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@ifinlist}
% \changes{v1.1}{2007/07/29}{Rewritten}
%  This helper macro checks if the first argument is in the comma separated
%  list which is offered as second argument. So for example
%  \begin{quote}
%    |\caption@ifinlist{frank}{axel,frank,olga,steven}{yes}{no}|
%  \end{quote}
%  would expand to |yes|.
%    \begin{macrocode}
\newcommand*\caption@ifinlist{%
  \@expandtwoargs\caption@@ifinlist}
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\caption@@ifinlist[2]{%
  \begingroup
  \def\@tempa##1,#1,##2\@nil{%
    \endgroup
    \ifx\relax##2\relax
      \expandafter\@secondoftwo
    \else
      \expandafter\@firstoftwo
    \fi}%
  \@tempa,#2,#1,\@nil}%
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@ifin@list}
% \changes{v1.1}{2007/08/12}{This macro added}
% |\caption@ifin@list|\marg{cmd}\marg{list entry}\marg{yes}\marg{no}
%    \begin{macrocode}
\newcommand*\caption@ifin@list[2]{%
  \caption@ifempty@list#1%
    {\@secondoftwo}%
    {\@expandtwoargs\caption@@ifinlist{#2}{#1}}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@g@addto@list}
% \changes{v1.1}{2007/07/29}{This macro added}
% |\caption@g@addto@list|\marg{cmd}\marg{list entry}
%    \begin{macrocode}
\newcommand*\caption@g@addto@list[2]{%
  \caption@ifempty@list#1{\gdef#1{#2}}{\g@addto@macro#1{,#2}}}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\caption@l@addto@list}
% \changes{v1.1}{2007/07/29}{This macro added}
% |\caption@l@addto@list|\marg{cmd}\marg{list entry}
%    \begin{macrocode}
\newcommand*\caption@l@addto@list[2]{%
  \caption@ifempty@list#1{\def#1{#2}}{\l@addto@macro#1{,#2}}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@g@removefrom@list}
% \changes{v1.1}{2007/07/29}{This macro added}
% |\caption@g@removefrom@list|\marg{cmd}\marg{list entry}
%    \begin{macrocode}
\newcommand*\caption@g@removefrom@list[2]{%
  \caption@l@removefrom@list#1{#2}%
  \global\let#1#1}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\caption@l@removefrom@list}
% \changes{v1.1}{2007/07/29}{This macro added}
% |\caption@l@removefrom@list|\marg{cmd}\marg{list entry}\par
% \Note[Caveat]{\meta{cmd} will be expanded during this process since
%               \cs{@removeelement} is using \cs{edef} to build the new list!}
%    \begin{macrocode}
\newcommand*\caption@l@removefrom@list[2]{%
  \caption@ifempty@list#1{}{\@expandtwoargs\@removeelement{#2}#1#1}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@for@list}
% \changes{v1.1}{2007/07/29}{This macro added}
% |\caption@for@list|\marg{cmd}\marg{code with \#1}
%    \begin{macrocode}
\newcommand*\caption@for@list[2]{%
  \caption@ifempty@list#1{}{%
    \def\caption@tempb##1{#2}%
    \@for\caption@tempa:=#1\do{%
      \expandafter\caption@tempb\expandafter{\caption@tempa}}}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@ifempty@list}
% \changes{v1.1}{2007/07/29}{This macro added}
% |\caption@ifempty@list|\marg{cmd}\marg{true}\marg{false}
%    \begin{macrocode}
\newcommand*\caption@ifempty@list[1]{%
  \ifx#1\@undefined
    \expandafter\@firstoftwo
  \else\ifx#1\relax
    \expandafter\expandafter\expandafter\@firstoftwo
  \else\ifx#1\@empty
    \expandafter\expandafter\expandafter\expandafter
      \expandafter\expandafter\expandafter\@firstoftwo
  \else
    \expandafter\expandafter\expandafter\expandafter
      \expandafter\expandafter\expandafter\@secondoftwo
  \fi\fi\fi}
%    \end{macrocode}
% \end{macro}
%
% \pagebreak[3]
% \begin{macro}{\caption@setbool}
% \begin{macro}{\caption@set@bool}
% \changes{v1.1}{2007/04/05}{\cs{caption@set@bool}\marg{cmd}\marg{value} added}
% \begin{macro}{\caption@ifbool}
% \begin{macro}{\caption@undefbool}
%  For setting and testing boolean options we offer these three helper macros:
%  \begin{quote}
%  |\caption@setbool|\marg{name}\marg{value}\\
%  |                |(with |value = false/true/no/yes/off/on/0/1|)\\
%  |\caption@ifbool|\marg{name}\marg{if-clause}\marg{else-clause}\\
%  |\caption@undefbool|\marg{name}
%  \end{quote}
%    \begin{macrocode}
\newcommand*\caption@setbool[1]{%
  \expandafter\caption@set@bool\csname caption@if#1\endcsname}
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\caption@set@bool[2]{%
  \caption@ifinlist{#2}{1,true,yes,on}{%
    \let#1\@firstoftwo
  }{\caption@ifinlist{#2}{0,false,no,off}{%
    \let#1\@secondoftwo
  }{%
    \caption@Error{Undefined boolean value `#2'}%
  }}}
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\caption@ifbool[1]{\@nameuse{caption@if#1}}
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\caption@undefbool[1]{\@nameundef{caption@if#1}}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\caption@teststar}
% \changes{v1.1}{2007/05/08}{This macro and its usage added}
% \changes{v1.1e}{2007/10/28}{\cs{caption@teststar@} added}
%  |\caption@teststar|\marg{cmd}\marg{star arg}\marg{non-star arg}\\
%  |\caption@teststar@|\marg{cmd}\marg{star arg}\marg{non-star arg}
%    \begin{macrocode}
\newcommand*\caption@teststar[3]{\@ifstar{#1{#2}}{#1{#3}}}
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\caption@teststar@[3]{%
  \@ifstar{#1{#2}}{\caption@ifatletter{#1{#2}}{#1{#3}}}}
\AtBeginDocument{\let\caption@teststar@\caption@teststar}
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\caption@ifatletter{%
  \ifnum\the\catcode`\@=11
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi}
\AtBeginDocument{\let\caption@ifatletter\@secondoftwo}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@withoptargs}
% \changes{v1.1}{2007/08/12}{This macro added}
%  |\caption@withoptargs|\marg{cmd}
%    \begin{macrocode}
\newcommand*\caption@withoptargs[1]{%
  \@ifstar
    {\def\caption@tempa{*}\caption@@withoptargs#1}%
    {\def\caption@tempa{}\caption@@withoptargs#1}}
%    \end{macrocode}
%    \begin{macrocode}
\def\caption@@withoptargs#1{%
  \@ifnextchar[%]
    {\caption@@@withoptargs#1}%
    {\caption@@@@withoptargs#1}}
%    \end{macrocode}
%    \begin{macrocode}
\def\caption@@@withoptargs#1[#2]{%
  \l@addto@macro\caption@tempa{[{#2}]}%
  \caption@@withoptargs#1}
%    \end{macrocode}
%    \begin{macrocode}
\def\caption@@@@withoptargs#1{%
  \expandafter#1\expandafter{\caption@tempa}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@CheckCommand}
% \changes{v1.1}{2007/04/10}{This macro added}
% \begin{macro}{\caption@IfCheckCommand}
% \changes{v1.1}{2007/04/10}{This macro added}
% \changes{v1.2b}{2008/08/02}{Revised so \cs{next} is no longer used}
%  |\caption@CheckCommand|\marg{macro}\marg{definition of macro}\par
%  checks if a command already exists, with the same definition.
%  It can be used more-than-once to check if one of multiple definitions will
%  finally match.
%  (It redefines itself later on to |\@gobbletwo| if the two commands match
%   fine, making further checks harmless.)\par
%  |\caption@IfCheckCommand|\marg{true}\marg{false}\par
%  will execute the \meta{true} code if one match was finally given,
%  the \meta{false} code otherwise.
%  (It simply checks if |\caption@CheckCommand| is |\@gobbletwo| and
%   restores the starting definition of |\caption@CheckCommand|.)
%    \begin{macrocode}
\newcommand\caption@DoCheckCommand[2]{%
  \begingroup
    \let\@tempa#1%
    #2%
    \ifx\@tempa#1%
      \endgroup
      \let\caption@CheckCommand\@gobbletwo
    \else
      \endgroup
    \fi}
\@onlypreamble\caption@DoCheckCommand
%    \end{macrocode}
%    \begin{macrocode}
\let\caption@CheckCommand\caption@DoCheckCommand
\@onlypreamble\caption@CheckCommand
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\caption@IfCheckCommand{%
  \ifx\caption@CheckCommand\@gobbletwo
    \let\caption@CheckCommand\caption@DoCheckCommand
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi}
\@onlypreamble\caption@IfCheckCommand
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\caption@AtBeginDocument}
% \changes{v1.1}{2007/04/13}{This macro and its usage added}
% \changes{v1.2e}{2010/01/09}{Adapted to the combine document class}
%  |\caption@AtBeginDocument*|\marg{code}\\
%  Same as |\AtBeginDocument| but the execution of code
%  will be surrounded by two |\PackageInfo|s.
%  The starred variant causes the code to be executed after all code
%  specified using the non-starred variant.
%    \begin{macrocode}
\let\caption@begindocumenthook\@empty
\let\caption@@begindocumenthook\@empty
%    \end{macrocode}
%    \begin{macrocode}
\def\caption@AtBeginDocument{%
  \caption@teststar\g@addto@macro
    \caption@@begindocumenthook\caption@begindocumenthook}
%\@onlypreamble\caption@AtBeginDocument
%    \end{macrocode}
%    \begin{macrocode}
\AtBeginDocument{%
   \caption@InfoNoLine{Begin \noexpand\AtBeginDocument code}%
%    \end{macrocode}
%    \begin{macrocode}
   \def\caption@AtBeginDocument{%
     \@ifstar{\g@addto@macro\caption@@begindocumenthook}\@firstofone}%
   \caption@begindocumenthook
   \let\caption@begindocumenthook\relax
%    \end{macrocode}
%    \begin{macrocode}
   \def\caption@AtBeginDocument{%
     \@ifstar\@firstofone\@firstofone}%
   \caption@@begindocumenthook
   \let\caption@@begindocumenthook\relax
%    \end{macrocode}
%    \begin{macrocode}
   \caption@InfoNoLine{End \noexpand\AtBeginDocument code}}
%    \end{macrocode}
% \end{macro}
%
% \subsection{Information, Warnings, and Errors}
%
% \begin{macro}{\caption@Info}
% \changes{v1.3}{2010/10/25}{Moved from package to kernel}
%  |\caption@Info|\marg{message}
%    \begin{macrocode}
\newcommand*\caption@Info[1]{%
  \PackageInfo{caption}{#1}}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\caption@InfoNoLine}
% \changes{v1.3}{2010/10/25}{Moved from package to kernel}
%  |\caption@InfoNoLine|\marg{message}\\
%  \Note{The \cs{@gobble} at the end of the 2nd argument of
%   \cs{PackageInfo} suppresses the line number info.
%   See TLC2\cite{TLC2}, A.4.7, p885 for details.}
%    \begin{macrocode}
\newcommand*\caption@InfoNoLine[1]{%
  \PackageInfo{caption}{#1\@gobble}}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\caption@Warning}
% \changes{v1.1c}{2007/10/14}{This macro added, will now be used for warnings}
%  |\caption@Warning|\marg{message}
%    \begin{macrocode}
\newcommand*\caption@Warning[1]{%
  \caption@WarningNoLine{#1\on@line}}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\caption@WarningNoLine}
% \changes{v1.1c}{2007/10/14}{This macro added, will now be used for warnings}
%  |\caption@WarningNoLine|\marg{message}
%    \begin{macrocode}
\newcommand*\caption@WarningNoLine[1]{%
  \PackageWarning{caption}{#1.^^J\caption@wh\@gobbletwo}}
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\caption@wh{%
  See the caption package documentation for explanation.}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\caption@Error}
% \changes{v1.0j}{2007/01/20}{This macro added, will now be used for errors}
% \changes{v1.0o}{2007/04/11}{Renamed from \cs{caption@error} to \cs{caption@Error}}
% \changes{v1.1b}{2007/09/18}{Usage of \cs{caption@Package} removed}
%  |\caption@Error|\marg{message}
%    \begin{macrocode}
\newcommand*\caption@Error[1]{%
  \PackageError{caption}{#1}\caption@eh}
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\caption@eh{%
  If you do not understand this error, please take a closer look\MessageBreak
  at the documentation of the `caption' package, especially the\MessageBreak
  section about errors.\MessageBreak\@ehc}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\caption@KV@err}
% \changes{v1.1b}{2007/09/18}{This macro added}
%    \begin{macrocode}
\let\caption@KV@err\caption@Error
%    \end{macrocode}
% \end{macro}
%
% \subsection{Using the keyval package}
%
% We need the \package{keyval} package for option handling, so we load it here.
%    \begin{macrocode}
\RequirePackage{keyval}[1997/11/10]
%    \end{macrocode}
%
% \begin{macro}{\undefine@key}
% |\undefine@key|\marg{family}\marg{key}\par
% This helper macro is the opposite of |\define@key|, it removes a keyval
% definition.
%    \begin{macrocode}
\providecommand*\undefine@key[2]{%
  \@nameundef{KV@#1@#2}\@nameundef{KV@#1@#2@default}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@onlypreamble@key}
% \changes{v1.1}{2007/07/22}{This macro added}
% \changes{v1.1e}{2007/11/01}{\cs{KV@err} will be used now instead of \cs{@notprerr}}
%  |\onlypreamble@key|\marg{family}\marg{key}\par
%  Analogous to |\@onlypreamble| from \LaTeXe.
%    \begin{macrocode}
\providecommand*\@preamble@keys{}
\providecommand*\@onlypreamble@key[2]{\@cons\@preamble@keys{{#1}{#2}}}
\@onlypreamble\@onlypreamble@key
\@onlypreamble\@preamble@keys
%    \end{macrocode}
%    \begin{macrocode}
\providecommand*\@notprerr@key[1]{\KV@err{Can be used only in preamble}}
%    \end{macrocode}
%    \begin{macrocode}
\caption@AtBeginDocument*{%
  \def\@elt#1#2{\expandafter\let\csname KV@#1@#2\endcsname\@notprerr@key}%
  \@preamble@keys
  \let\@elt\relax}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\DeclareCaptionOption}
%  |\DeclareCaptionOption|\marg{option}\oarg{default value}\marg{code}\\
%  |\DeclareCaptionOption*|\marg{option}\oarg{default value}\marg{code}\par
%  We declare our options using these commands (instead of using
%  |\DeclareOption| offered by \LaTeXe), so the keyval package is used.
%  The starred form makes the option available during the lifetime of the
%  current package only, so they can be used with |\usepackage|, but
%  \emph{not} with |\captionsetup| later on.
%    \begin{macrocode}
\newcommand*\DeclareCaptionOption{%
  \caption@teststar\caption@declareoption\AtEndOfPackage\@gobble}
\@onlypreamble\DeclareCaptionOption
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\caption@declareoption[2]{%
  #1{\undefine@key{caption}{#2}}\define@key{caption}{#2}}
\@onlypreamble\caption@declareoption
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\DeclareCaptionOptionNoValue}
% \changes{v1.1c}{2007/10/06}{This macro added}
%  |\DeclareCaptionOptionNoValue|\marg{option}\marg{code}\\
%  |\DeclareCaptionOptionNoValue*|\marg{option}\marg{code}\par
% Same as \cs{DeclareCaptionOption} but issues an error if a value is given.
%    \begin{macrocode}
\newcommand*\DeclareCaptionOptionNoValue{%
  \caption@teststar\caption@declareoption@novalue\AtEndOfPackage\@gobble}
\@onlypreamble\DeclareCaptionOptionNoValue
%    \end{macrocode}
%    \begin{macrocode}
\newcommand\caption@declareoption@novalue[3]{%
  \caption@declareoption{#1}{#2}[\KV@err]{%
    \caption@option@novalue{#2}{##1}{#3}}}
\@onlypreamble\caption@declareoption@novalue
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\caption@option@novalue[2]{%
  \ifx\KV@err#2%
    \expandafter\@firstofone
  \else
    \KV@err{No value allowed for #1}%
    \expandafter\@gobble
  \fi}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ifcaptionsetup@star}
% \changes{v1.2a}{2008/01/12}{This macro added}
% If the starred form of |\captionsetup| is used, this will be set to |true|.
% (It will be reset to |false| at the end of |\caption@setkeys|.)
%    \begin{macrocode}
\newif\ifcaptionsetup@star
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\captionsetup}
% \changes{v1.0a}{2004/01/17}{Bugfix: Missing \% added}
% \changes{v1.1}{2007/07/22}{Starred-variant added}
% \changes{v1.1e}{2007/07/27}{Inside packages the starred variant will be used automatically}
% \changes{v1.2}{2007/11/16}{Bugfix 07-11-09: `space hack' added}
% \changes{v1.2a}{2008/01/12}{\cs{ifcaptionsetup@star} will be set now}
%  |\captionsetup|\oarg{type}\marg{keyval-list of options}\\
%  |\captionsetup*|\oarg{type}\marg{keyval-list of options}\par
%  If the optional argument `type' is specified, we simply save or append
%  the option list, otherwise we `execute' it with |\setkeys|.
%  (The non-starred variant issues a warning if \meta{keyval-list of options}
%   is not used later on.)
%  \Note{The starred variant will be used inside packages automatically.}
%    \begin{macrocode}
\newcommand*\captionsetup{%
  \caption@teststar@\@captionsetup\@gobble\@firstofone}
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\@captionsetup[1]{%
  \captionsetup@startrue#1\captionsetup@starfalse
  \@ifnextchar[\caption@setup@options\caption@setup}
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\caption@setup{\caption@setkeys{caption}}
%    \end{macrocode}
%    \begin{macrocode}
\def\caption@setup@options[#1]#2{%
  \@bsphack
    \ifcaptionsetup@star\captionsetup@starfalse\else\caption@addtooptlist{#1}\fi
    \expandafter\caption@l@addto@list\csname caption@opt@#1\endcsname{#2}%
  \@esphack}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\clearcaptionsetup}
% \changes{v1.1}{2007/07/29}{Optional argument added}
% \changes{v1.1}{2007/08/17}{Starred variant added}
% \changes{v1.1e}{2007/07/27}{Inside packages the starred variant will be used automatically}
% \changes{v1.2}{2007/11/16}{Bugfix 07-11-09: `space hack' added}
%  |\clearcaptionsetup|\oarg{option}\marg{type}\\
%  |\clearcaptionsetup*|\oarg{option}\marg{type}\par
%  This removes the saved option list associated with \meta{type}.
%  If \meta{option} is given, only this option will be removed from the list.
%  (The starred variant does not issue warnings.)
%  \Note{The starred variant will be used inside packages automatically.}
%    \begin{macrocode}
\newcommand*\clearcaptionsetup{%
  \caption@teststar@\@clearcaptionsetup\@gobble\@firstofone}
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\@clearcaptionsetup[1]{%
  \let\caption@tempa#1%
  \@testopt\@@clearcaptionsetup{}}
%    \end{macrocode}
%    \begin{macrocode}
\def\@@clearcaptionsetup[#1]#2{%
  \@bsphack
    \expandafter\caption@ifempty@list\csname caption@opt@#2\endcsname
      {\caption@tempa{\caption@Warning{Option list `#2' undefined}}}%
      {\ifx,#1,%
         \caption@clearsetup{#2}%
       \else
         \caption@@removefromsetup{#1}{#2}%
       \fi}%
  \@esphack}
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\caption@clearsetup[1]{%
  \caption@removefromoptlist{#1}%
  \@nameundef{caption@opt@#1}}
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\caption@removefromsetup{%
  \let\caption@tempa\@gobble
  \caption@@removefromsetup}
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\caption@@removefromsetup[2]{%
  \expandafter\let\expandafter\@tempa\csname caption@opt@#2\endcsname
  \expandafter\let\csname caption@opt@#2\endcsname\@undefined
  \def\@tempb##1=##2\@nil{##1}%
  \edef\@tempc{#1}%
  \@for\@tempa:=\@tempa\do{%
    \edef\@tempd{\expandafter\@tempb\@tempa=\@nil}%
    \ifx\@tempd\@tempc
      \let\caption@tempa\@gobble
    \else
      \expandafter\expandafter\expandafter\caption@l@addto@list
        \expandafter\csname caption@opt@#2\expandafter\endcsname
        \expandafter{\@tempa}%
    \fi}%
  \expandafter\caption@ifempty@list\csname caption@opt@#2\endcsname
    {\caption@removefromoptlist{#2}}{}%
  \caption@tempa{\caption@Warning{%
    Option `#1' was not in list `#2'\MessageBreak}}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\showcaptionsetup}
% \changes{v1.0d}{2005/05/03}{Optimized for memory usage}
% \changes{v1.1}{2007/07/29}{Bugfix: Does not expand option list anymore}
% \changes{v1.2}{2007/11/16}{Bugfix 07-11-09: `space hack' added}
%  |\showcaptionsetup|\oarg{package}\marg{type}\par
%  This comes for debugging issues: It shows the saved option list which
%  is associated with \meta{type}.
%    \begin{macrocode}
\newcommand*\showcaptionsetup[2][\@firstofone]{%
  \@bsphack
    \GenericWarning{}{%
      #1 Caption Info: Option list on `#2'\MessageBreak
      #1 Caption Data: \@ifundefined{caption@opt@#2}{%
        -none-%
      }{%
        {\expandafter\expandafter\expandafter\strip@prefix
           \expandafter\meaning\csname caption@opt@#2\endcsname}%
      }}%
  \@esphack}
%    \end{macrocode}
% \end{macro}
%
% \changes{v1.1}{2007/07/02}{Option \opt{options=} added}
% \changes{v1.3}{2010/09/05}{Option \opt{options*=} added}
%    \begin{macrocode}
\DeclareCaptionOption{options}{\caption@setoptions{#1}}
\DeclareCaptionOption{options*}{\caption@setoptions*{#1}}
%    \end{macrocode}
%
% \begin{macro}{\caption@setoptions}
% \changes{v1.0g}{2006/01/03}{Optional argument added}
% \changes{v1.0h}{2006/01/26}{Revised}
% \changes{v1.0j}{2007/01/30}{Optional argument removed}
% \changes{v1.1}{2007/04/11}{Usage of \cs{clearcaptionsetup} added}
% \changes{v1.1}{2007/05/09}{Renamed from \cs{caption@settype} to \cs{caption@setoptions}}
% \changes{v1.2}{2007/12/03}{Definition of \cs{caption@iftypewarning} removed}
% \changes{v1.3}{2010/09/05}{Starred variant added}
%  |\caption@setoptions*|\marg{type or environment or\ldots}\par
%  Caption options which have been saved with |\captionsetup|\oarg{type} can
%  be executed by using this command.
%  It simply executes the saved option list (and clears it afterwards),
%  if there is any. (The starred variant do not clear the option list.)
%    \begin{macrocode}
\newcommand*\caption@setoptions{%
  \caption@teststar\caption@set@options\@gobble\@firstofone}
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\caption@set@options[2]{%
  \caption@Debug{options=#2}%
  \expandafter\let\expandafter\caption@opt\csname caption@opt@#2\endcsname
  \ifx\caption@opt\relax \else
    \caption@xsetup\caption@opt
    #1{\caption@clearsetup{#2}}% #1 = \@firstofone -or- \@gobble
  \fi}
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\caption@xsetup[1]{\expandafter\caption@setup\expandafter{#1}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@addtooptlist}
% \changes{v1.1}{2007/07/22}{This macro added}
% \begin{macro}{\caption@removefromoptlist}
% \changes{v1.1}{2007/07/22}{This macro added}
% \changes{v1.2c}{2008/08/24}{Fatal typo corrected}
% |\caption@addtooptlist|\marg{type}\\
% |\caption@removefromoptlist|\marg{type}\par
%  Adds or removes an \meta{type} to the list of unused caption options.
%  Note that the catcodes of \meta{type} are sanitized here so removing
%  \meta{type} from the list do not fail when the \package{float} package
%  is used (since |\float@getstyle| gives a result which tokens have catcode
%  12 $=$ ``other'').
%    \begin{macrocode}
\newcommand*\caption@addtooptlist[1]{%
  \@ifundefined{caption@opt@#1@lineno}{%
    \caption@dooptlist\caption@g@addto@list{#1}%
    \expandafter\xdef\csname caption@opt@#1@lineno\endcsname{\the\inputlineno}%
  }{}}
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\caption@removefromoptlist[1]{%
  \caption@dooptlist\caption@g@removefrom@list{#1}%
  \global\expandafter\let\csname caption@opt@#1@lineno\endcsname\@undefined}
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\caption@dooptlist[2]{%
  \begingroup
    \edef\@tempa{#2}\@onelevel@sanitize\@tempa
    \expandafter#1\expandafter\caption@optlist\expandafter{\@tempa}%
  \endgroup}
%    \end{macrocode}
%    \begin{macrocode}
\AtEndDocument{%
  \caption@for@list\caption@optlist{%
    \caption@WarningNoLine{%
      Unused \string\captionsetup[#1]
      on input line \csname caption@opt@#1@lineno\endcsname}}}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\caption@setkeys}
% \changes{v1.0g}{2006/01/03}{This macro added}
% \changes{v1.0j}{2007/01/20}{Bugfix: Usage of \cs{caption@keydepth} added}
% \changes{v1.0j}{2007/01/30}{Optional argument added}
% \changes{v1.0n}{2007/04/08}{\cs{caption@keydepth} is now a command instead of a counter}
% \changes{v1.1b}{2007/09/18}{Usage of \cs{caption@Package} removed, we use \cs{caption@KV@err} instead}
% \changes{v1.2}{2007/11/16}{Bugfix 07-11-09: `space hack' added}
% \changes{v1.2a}{2008/01/12}{\cs{captionsetup@starfalse} added}
% \changes{v1.2d}{2009/09/30}{Bugfix 09-09-29: Missing error handler will be defined automatically}
%  |\caption@setkeys|\oarg{package}\marg{family}\marg{key-values}\par
%  This one simply calls |\setkeys|\marg{family}\marg{key-values}
%  but lets the error messages not refer to the \package{keyval} package,
%  but to the \meta{package} package instead.
%    \begin{macrocode}
\newcommand*\caption@setkeys{\@dblarg\caption@@setkeys}
%    \end{macrocode}
%    \begin{macrocode}
\long\def\caption@@setkeys[#1]#2#3{%
  \@bsphack
%    \end{macrocode}
%    \begin{macrocode}
  \expandafter\let\csname ORI@KV@err\caption@keydepth\endcsname\KV@err
  \expandafter\let\csname ORI@KV@errx\caption@keydepth\endcsname\KV@errx
  \expandafter\let\expandafter\KV@err\csname #1@KV@err\endcsname
  \ifx\KV@err\relax
    \def\KV@err##1{\PackageError{#1}{##1}{%
      See the #1 package documentation for explanation.}}%
  \fi
  \let\KV@errx\KV@err
  \edef\caption@keydepth{\caption@keydepth i}%
%    \end{macrocode}
%    \begin{macrocode}
  \caption@Debug{\protect\setkeys{#2}{#3}}%
  \setkeys{#2}{#3}%
%    \end{macrocode}
%    \begin{macrocode}
  \edef\caption@keydepth{\expandafter\@gobble\caption@keydepth}%
  \expandafter\let\expandafter\KV@err\csname ORI@KV@err\caption@keydepth\endcsname
  \expandafter\let\expandafter\KV@errx\csname ORI@KV@errx\caption@keydepth\endcsname
%    \end{macrocode}
%    \begin{macrocode}
  \ifx\caption@keydepth\@empty \captionsetup@starfalse \fi
%    \end{macrocode}
%    \begin{macrocode}
  \@esphack}
%    \end{macrocode}
%    \begin{macrocode}
\let\caption@keydepth\@empty
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@ExecuteOptions}
% \changes{v1.1}{2007/07/15}{This macro added}
% \changes{v1.3}{2010/09/04}{Depends on package now}
%  |\caption@ExecuteOptions|\marg{package}\marg{key-values}\par
%  We execute our options using the keyval interface, so we use this one
%  instead of |\ExecuteOptions| offered by \LaTeXe.
%    \begin{macrocode}
\newcommand*\caption@ExecuteOptions[2]{%
  \expandafter\@expandtwoargs\csname caption@setkeys@#1\endcsname{#1}{#2}}%
\@onlypreamble\caption@ExecuteOptions
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@ProcessOptions}
% \changes{v1.0a}{2004/01/23}{Bugfix, see
%        \purett{news:400D360C.9678329F@gmx.net} for details}
% \changes{v1.0g}{2006/01/03}{Improvement, uses \cs{caption@setkeys}
%        instead of \cs{setkeys}}
% \changes{v1.0h}{2006/02/23}{Bugfix, now processes only those global
%        options which have a default value}
% \changes{v1.0j}{2007/01/30}{\cs{ProcessOptionsWithKV} renamed to
%        \cs{caption@ProcessOptions} and moved from the package to the kernel}
% \changes{v1.1}{2007/04/17}{Star variant added}
%  |\caption@ProcessOptions*|\marg{package}\par
%  We process our options using the keyval package, so we use this one
%  instead of |\ProcessOptions| offered by \LaTeXe.
%  The starred variant do not process the global options.
%  (This code was taken from the \package{hyperref} package\cite{hyperref}
%   \version{6.74} and improved.)
%    \begin{macrocode}
\newcommand*\caption@ProcessOptions{%
  \caption@teststar\caption@@ProcessOptions\@gobble\@firstofone}
\@onlypreamble\caption@ProcessOptions
%    \end{macrocode}
%    \begin{macrocode}
\newcommand\caption@@ProcessOptions[2]{%
  \let\@tempc\relax
  \let\caption@tempa\@empty
  #1{% \@firstofone -or- \@gobble
    \@for\CurrentOption:=\@classoptionslist\do{%
      \@ifundefined{KV@#2@\CurrentOption}{}{%
        \@ifundefined{KV@#2@\CurrentOption @default}{%
          \PackageInfo{#2}{Global option `\CurrentOption' ignored}%
        }{%
          \PackageInfo{#2}{Global option `\CurrentOption' processed}%
          \edef\caption@tempa{\caption@tempa\CurrentOption,}%
          \@expandtwoargs\@removeelement\CurrentOption
            \@unusedoptionlist\@unusedoptionlist
        }%
      }%
    }%
    \let\CurrentOption\@empty
  }%
  \caption@ExecuteOptions{#2}{\caption@tempa\@ptionlist{\@currname.\@currext}}%
  \AtEndOfPackage{\let\@unprocessedoptions\relax}}
\@onlypreamble\caption@@ProcessOptions
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@SetupOptions}
% \changes{v1.3}{2010/09/04}{This macro added}
%  |\caption@SetupOptions|\marg{package}\marg{code}\par
%  After calling this macro |\caption@ExecuteOptions| and
% |\usepackage|\oarg{options}\marg{package}
%  will both be mapped to \meta{code} with \meta{package} and \meta{options}
%  as arguments |#1| and |#2|. (This helps avoiding ``Option clash'' errors.)
%    \begin{macrocode}
\newcommand*\caption@packagelist{}
\@onlypreamble\caption@packagelist
%    \end{macrocode}
%    \begin{macrocode}
\newcommand\caption@SetupOptions[2]{%
  \@namedef{caption@setkeys@#1}##1##2{#2}%
  \expandafter\@onlypreamble\csname caption@setkeys@#1\endcsname
  \@cons\caption@packagelist{{#1}}}
\@onlypreamble\caption@SetupOptions
%    \end{macrocode}
%    \begin{macrocode}
\let\caption@onefilewithoptions\@onefilewithoptions
\def\@onefilewithoptions#1[#2]{%
  \begingroup
  \def\@tempa{%
    \endgroup
    \caption@onefilewithoptions{#1}[{#2}]}%
  \def\@tempb{#1}%
  \def\@elt##1{%
    \def\@tempc{##1}%
    \ifx\@tempb\@tempc
      \def\@tempa{%
        \endgroup
        \caption@ExecuteOptions{#1}{#2}%
        \caption@onefilewithoptions{#1}[]}%
    \fi}
  \caption@packagelist
  \@tempa}
\@onlypreamble\caption@onefilewithoptions
%    \end{macrocode}
% \end{macro}
%
% \subsection{Margin resp. width}
% \changes{v1.0n}{2007/04/01}{\cs{captionmarginx} renamed to \cs{captionmargin@}}
% \changes{v1.0n}{2007/04/03}{Option `twoside' added}
% \changes{v1.1}{2007/08/11}{Options `margin*', `minmargin', and `maxmargin' added}
% \changes{v1.2}{2007/11/10}{Option `oneside' added}
%
% \begin{macro}{\captionmargin}
% \begin{macro}{\captionwidth}
%  |\captionmargin| and |\captionwidth| contain the extra margin
%  resp. the total width used for captions. Please never set these values in
%  a direct way, they are just accessible in user documents to provide
%  compatibility to \version{1.x}.\par
%  Note that we can only set one value at a time, `margin' \emph{or} `width'.
%  If |\captionwidth| is not zero we will take this value afterwards,
%  otherwise |\captionmargin| and |\captionmargin@|.
%    \begin{macrocode}
\newdimen\captionmargin
\newdimen\captionmargin@
\newdimen\captionwidth
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
%    \begin{macrocode}
\DeclareCaptionOption{margin}{\setcaptionmargin{#1}}
\DeclareCaptionOption{margin*}{\setcaptionmargin*{#1}}
\DeclareCaptionOption{width}{\setcaptionwidth{#1}}
\DeclareCaptionOption{width*}{\setcaptionwidth*{#1}}
%    \end{macrocode}
%    \begin{macrocode}
\DeclareCaptionOption{calcmargin}{\caption@setcalcmargin{#1}}
\DeclareCaptionOption{calcmargin*}{\caption@setcalcmargin*{#1}}
\DeclareCaptionOption{calcwidth}{\caption@setcalcwidth{#1}}
\DeclareCaptionOption{calcwidth*}{\caption@setcalcwidth*{#1}}
%    \end{macrocode}
%    \begin{macrocode}
\DeclareCaptionOption{twoside}[1]{\caption@set@bool\caption@iftwoside{#1}}
\DeclareCaptionOptionNoValue{oneside}{\caption@set@bool\caption@iftwoside0}
%    \end{macrocode}
%    \begin{macrocode}
\DeclareCaptionOption{minmargin}{\caption@setoptcmd\caption@minmargin{#1}}
\DeclareCaptionOption{maxmargin}{\caption@setoptcmd\caption@maxmargin{#1}}
%    \end{macrocode}
%
% \begin{macro}{\setcaptionmargin}
% \changes{v1.0f}{2005/10/24}{Renamed from \cs{caption@setmargin} to \cs{setcaptionmargin}}
% \changes{v1.0f}{2005/10/24}{\cs{setcaptionmargin} enhanced so it can take
%                             left+right margin}
% \changes{v1.1}{2007/08/11}{Starred variant added}
% \changes{v1.1}{2007/08/12}{\cs{setlength}\cs{captionmargin} \&
%        \cs{setlength}\cs{captionmargin@} swapped so
%        `\texttt{margin*=}\cs{captionmargin}' works in singleline options}
% \changes{v1.3}{2010/11/07}{Support for option \opt{calcmargin} added}
%  |\setcaptionmargin|\marg{amount}\\
%  |\setcaptionmargin*|\marg{amount}\par
%  Please never use this in user documents, it's just there to
%  provide compatibility to the \package{caption2} package.
%    \begin{macrocode}
\newcommand*\setcaptionmargin{%
  \caption@resetcalcmargin
  \caption@setmargin}
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\caption@setmargin{%
  \caption@teststar\caption@@setmargin\@gobble\@firstofone}
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\caption@@setmargin[2]{%
  #1{\captionwidth\z@}%
  \caption@@@setmargin#2,#2,\@nil}
%    \end{macrocode}
%    \begin{macrocode}
\def\caption@@@setmargin#1,#2,#3\@nil{%
  \setlength\captionmargin@{#2}%
  \setlength\captionmargin{#1}%
  \addtolength\captionmargin@{-\captionmargin}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\setcaptionwidth}
% \changes{v1.0f}{2005/10/24}{Renamed from \cs{caption@setwidth} to \cs{setcaptionwidth}}
% \changes{v1.3}{2010/11/07}{Starred variant added}
% \changes{v1.3}{2010/11/07}{Support for option \opt{calcwidth} added}
%  |\setcaptionwidth|\marg{amount}\\
%  |\setcaptionwidth*|\marg{amount}\par
%  Please never use this in user documents, it's just there to
%  provide compatibility to the \package{caption2} package.
%    \begin{macrocode}
\newcommand*\setcaptionwidth{%
  \caption@resetcalcmargin
  \caption@setwidth}
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\caption@setwidth{%
  \caption@teststar\caption@@setwidth\@gobble\@firstofone}
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\caption@@setwidth[2]{%
  #1{\captionmargin\z@\captionmargin@\z@}%
  \setlength\captionwidth{#2}}%
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@resetcalcmargin}
% \changes{v1.3}{2010/11/07}{This macro added}
%    \begin{macrocode}
\newcommand*\caption@resetcalcmargin{%
  \let\caption@calcmargin@hook\@empty}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@setcalcmargin}
% \changes{v1.3}{2010/11/07}{This macro added}
%    \begin{macrocode}
\newcommand*\caption@setcalcmargin{%
  \caption@teststar{\caption@@setcalcmargin\caption@setmargin}%
    \@secondoftwo\@firstoftwo}
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\caption@@setcalcmargin[3]{%
  #2{\caption@resetcalcmargin
     \l@addto@macro\caption@calcmargin@hook{#1{#3}}}%
    {\l@addto@macro\caption@calcmargin@hook{#1*{#3}}}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@setcalcwidth}
% \changes{v1.3}{2010/11/07}{This macro added}
%    \begin{macrocode}
\newcommand*\caption@setcalcwidth{%
  \caption@teststar{\caption@@setcalcmargin\caption@setwidth}%
    \@secondoftwo\@firstoftwo}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@counter}
% \changes{v1.0n}{2007/04/03}{This counter added}
% \changes{v1.1e}{2007/10/28}{Renamed to \cs{caption@thecounter}; \cs{caption@stepcounter} added}
% This counter numbers the captions. At the moment it will be used inside
% |\caption@ifoddpage| only.
%    \begin{macrocode}
\newcommand*\caption@thecounter{0}
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\caption@stepcounter{%
  \@tempcnta\caption@thecounter
  \advance\@tempcnta\@ne
  \xdef\caption@thecounter{\the\@tempcnta}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@newlabel}
% \changes{v1.0n}{2007/04/03}{This macro added}
%  This command is a modified version of |\newlabel| from \LaTeX2e.
%  It will be written to the \texttt{.aux} file to
%  pass label information from one run to another.
%  (We use it inside |\caption@ifoddpage| and |\caption@ragged|.)
%    \begin{macrocode}
\newcommand*\caption@newlabel{\@newl@bel{caption@r}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@thepage}
% \changes{v1.0n}{2007/04/03}{This macro added}
%  This command is a modified version of |\thepage| from \LaTeX2e.
%  It will be used inside |\caption@ifoddpage| only.
%    \begin{macrocode}
\newcommand*\caption@thepage{\the\c@page}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@label}
% \changes{v1.1}{2007/09/01}{This macro added}
% \changes{v1.2}{2007/12/03}{Definition of \cs{caption@newlabel} in AUX file added}
%  This command is a modified version of |\label| from \LaTeX2e.
%  It will be used inside |\caption@ifoddpage| and |\FP@helpNote|.
%    \begin{macrocode}
\newcommand*\caption@label[1]{%
  \caption@@label
  \protected@write\@auxout{\let\caption@thepage\relax}%
         {\string\caption@newlabel{#1}{\caption@thepage}}}
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\caption@@label{%
  \global\let\caption@@label\relax
  \protected@write\@auxout{}%
    {\string\providecommand*\string\caption@newlabel[2]{}}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@pageref}
% \changes{v1.1}{2007/09/01}{This macro added}
% \changes{v1.2d}{2009/10/09}{Uses \cs{@latex@warning} instead of \cs{caption@Warning} now}
%  This command is a modified version of |\pageref| from \LaTeX2e.
%  It will be used inside |\caption@ifoddpage| and |\FP@helpNote|.
%    \begin{macrocode}
\newcommand*\caption@pageref[1]{%
  \expandafter\ifx\csname caption@r@#1\endcsname\relax
    \G@refundefinedtrue % => 'There are undefined references.'
    \@latex@warning{Reference `#1' on page \thepage \space undefined}%
  \else
    \expandafter\let\expandafter\caption@thepage\csname caption@r@#1\endcsname
  \fi}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@ifoddpage}
% \changes{v1.0n}{2007/04/03}{This macro added}
% \changes{v1.1e}{2007/10/28}{Incrementation of counter moved to \cs{caption@@make}}
%  At the moment this macro uses an own label\ldots ref mechanism,
%  but an alternative implementation method would be using the
%  \package{refcount} package\cite{refcount} and |\ifodd\getpagerefnumber{|\ldots|}|.
%  \Note{This macro re-defines itself so the \texttt{.aux} file will
%  only be used once per group.}
%    \begin{macrocode}
\newcommand*\caption@ifoddpage{%
  \caption@iftwoside{%
    \caption@label\caption@thecounter
    \caption@pageref\caption@thecounter
    \ifodd\caption@thepage
      \let\caption@ifoddpage\@firstoftwo
    \else
      \let\caption@ifoddpage\@secondoftwo
    \fi
  }{\let\caption@ifoddpage\@firstoftwo}%
%    \end{macrocode}
%    \begin{macrocode}
  \caption@ifoddpage}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@setoptcmd}
% \changes{v1.1}{2007/08/11}{This macro added}
% |\caption@setoptcmd|\marg{cmd}\marg{off -or- value}
%    \begin{macrocode}
\newcommand*\caption@setoptcmd[2]{%
  \caption@ifinlist{#2}{0,false,no,off}{\let#1\@undefined}{\def#1{#2}}}
%    \end{macrocode}
% \end{macro}
%
% \subsection{Indentions}
%
% \begin{macro}{\caption@indent}
% \changes{v1.1}{2007/07/29}{Renamed from \cs{captionindent} to \cs{caption@indent}}
% \begin{macro}{\caption@parindent}
% \begin{macro}{\caption@hangindent}
%  These are the indentions we support.
%    \begin{macrocode}
\newdimen\caption@indent
\newdimen\caption@parindent
\newdimen\caption@hangindent
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \changes{v1.0b}{2004/05/16}{Defaults added for options \opt{parindent=}
%        and \opt{hangindent=}}
% \changes{v1.0f}{2005/08/22}{Option \opt{parskip=}: \cs{AtBeginCaption}
%        replaced by \cs{caption@@par}}
% \changes{v1.0f}{2005/08/22}{Undocumented defaults for \opt{parindent=},
%        \opt{hangindent=}, and \opt{parskip=} removed}
%    \begin{macrocode}
\DeclareCaptionOption{indent}[\leftmargini]{% obsolete!
       \setlength\caption@indent{#1}}
\DeclareCaptionOption{indention}[\leftmargini]{%
       \setlength\caption@indent{#1}}
\DeclareCaptionOption{parindent}{%
       \setlength\caption@parindent{#1}}
\DeclareCaptionOption{hangindent}{%
       \setlength\caption@hangindent{#1}}
\DeclareCaptionOption{parskip}{%
       \l@addto@macro\caption@@par{\setlength\parskip{#1}}}
%    \end{macrocode}
%
% \changes{v1.0f}{2005/08/22}{Increased compatibility to KOMA-Script:
%        A special version of options `parindent' and `parskip' added}
% \changes{v1.0g}{2006/01/03}{Bugfix 06-01-03: KOMA-Script variants of
%        `parskip' and `parindent' options revised and moved into caption kernel}
% \changes{v1.0h}{2006/02/23}{KOMA-Script variants of `parskip' and
%        `parindent' are obsolete now, removed}
% \changes{v1.0m}{2007/03/30}{KOMA-Script variants of `parskip' and
%        `parindent' re-added, since they still collide with the current
%        version of the subfig package (Sigh!)}
%
% There is an option clash between the \KOMAScript\ document classes
% and the \package{caption} kernel, both define the options |parindent| and
% |parskip| but with different meaning.
% Furthermore the ones defined by the \package{caption} kernel take a
% value as parameter but the \KOMAScript\ ones do not.
% So we need special versions of the options |parindent| and |parskip| here
% which determine if a value is given (and therefore should be treated as
% our option) or not (and therefore should be ignored by us).\footnote{%^^A
% This problem was completely solved due a change of \cs{caption@ProcessOptions}
% in \thispackage\ \version{1.0h}, but we still need this workaround since
% these options would otherwise still collide with the current version $1.3$
% of the \package{subfig} package (Sigh!)}
%    \begin{macrocode}
\providecommand*\caption@ifkomaclass{%
  \caption@ifundefined\scr@caption\@gobble\@firstofone}
\@onlypreamble\caption@ifkomaclass
%    \end{macrocode}
%    \begin{macrocode}
\caption@ifkomaclass{%
%    \end{macrocode}
%    \begin{macrocode}
  \let\caption@KV@parindent\KV@caption@parindent
  \DeclareCaptionOption{parindent}[]{%
    \ifx,#1,%
      \caption@Debug{Option `parindent' ignored}%
    \else
      \caption@KV@parindent{#1}%
    \fi}%
%    \end{macrocode}
%    \begin{macrocode}
  \let\caption@KV@parskip\KV@caption@parskip
  \DeclareCaptionOption{parskip}[]{%
    \ifx,#1,%
      \caption@Debug{Option `parskip' ignored}%
    \else
      \caption@KV@parskip{#1}%
    \fi}%
%    \end{macrocode}
%    \begin{macrocode}
}
%    \end{macrocode}
%
% \subsection{Styles}
%
% \begin{macro}{\DeclareCaptionStyle}
% \changes{v1.0a}{2004/01/17}{Pass through argument \#3 so extra spaces
%        between arguments do make any harm}
%  |\DeclareCaptionStyle|\marg{name}\oarg{single-line-list-of-KV}\marg{list-of-KV}
%    \begin{macrocode}
\newcommand*\DeclareCaptionStyle[1]{%
  \@testopt{\caption@declarestyle{#1}}{}}
\@onlypreamble\DeclareCaptionStyle
%    \end{macrocode}
%    \begin{macrocode}
\def\caption@declarestyle#1[#2]#3{%
  \global\@namedef{caption@sls@#1}{#2}%
  \global\@namedef{caption@sty@#1}{#3}}
\@onlypreamble\caption@declarestyle
%    \end{macrocode}
% \end{macro}
%
% \changes{v1.2a}{2008/01/20}{Option \opt{style*=} added}
% \changes{v1.2b}{2008/05/06}{Option \opt{slc=} added}
%    \begin{macrocode}
\DeclareCaptionOption{style}{\caption@setstyle{#1}}
\DeclareCaptionOption{style*}{\caption@setstyle*{#1}}
\DeclareCaptionOption{singlelinecheck}[1]{\caption@set@bool\caption@ifslc{#1}}
\DeclareCaptionOption{slc}[1]{\KV@caption@singlelinecheck{#1}}
%    \end{macrocode}
%
% \begin{macro}{\caption@setstyle}
% \changes{v1.0e}{2005/06/01}{Starred variant added}
% \changes{v1.1}{2007/07/29}{Recursive style definitions should work now}
% \changes{v1.1d}{2007/10/23}{`SingleLine' renamed to `singleline' for consistency}
% \changes{v1.2}{2007/12/03}{Definition of \cs{caption@iftypewarning} removed}
%  |\caption@setstyle|\marg{name}\\
%  |\caption@setstyle*|\marg{name}\par
%  Selecting a caption style means saving the additional
%  \meta{single-line-list-of-KV} (this will be done by |\caption@sls|),
%  resetting the caption options to the base ones (this will be done using
%  |\caption@resetstyle|) and executing the \meta{list-of-KV} options
%  (this will be done using |\caption@setup|).\par
%  The starred version will give no error message if the given style is not
%  defined.
%    \begin{macrocode}
\newcommand*\caption@setstyle{%
  \caption@teststar\caption@@setstyle\@gobble\@firstofone}
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\caption@@setstyle[2]{%
  \@ifundefined{caption@sty@#2}%
    {#1{\caption@Error{Undefined style `#2'}}}%
    {\expandafter\let\expandafter\caption@sty\csname caption@sty@#2\endcsname
     \ifx\caption@setstyle@flag\@undefined
       \let\caption@setstyle@flag\relax
       \caption@resetstyle
       \caption@xsetup\caption@sty
       \let\caption@setstyle@flag\@undefined
     \else
       \caption@xsetup\caption@sty
     \fi
     \expandafter\let\expandafter\caption@sls\csname caption@sls@#2\endcsname
     \expandafter\caption@l@addto@list\expandafter\caption@opt@singleline
       \expandafter{\caption@sls}}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@resetstyle}
% \changes{v1.1}{2007/02/04}{%
%       This macro renamed from \cs{caption@setdefault} to \cs{caption@resetstyle}}
% \changes{v1.1d}{2007/10/23}{`SingleLine' renamed to `singleline' for consistency}
% \changes{v1.2}{2007/11/17}{Usage of \texttt{size=} added}
% \changes{v1.2b}{2008/05/06}{Usage of \texttt{rule} added}
%  This resets (nearly) all caption options to the base ones.
%  \emph{Note that this does not touch the skips and the positioning!}
%    \begin{macrocode}
\newcommand*\caption@resetstyle{%
  \caption@setup{%
    format=plain,labelformat=default,labelsep=colon,textformat=simple,%
    justification=justified,font=,size=,labelfont=,textfont=,%
    margin=0pt,minmargin=0,maxmargin=0,%
    indent=0pt,parindent=0pt,hangindent=0pt,%
    slc,rule,strut}%
  \caption@clearsetup{singleline}}
%    \end{macrocode}
% \end{macro}
%
% \changes{v1.0c}{2005/02/12}{\opt{indent=0pt} added to caption style \opt{default}}
% \changes{v1.1}{2007/02/04}{Caption style `default' renamed to `base', and a new `default' added}
% \changes{v1.1}{2007/03/31}{\opt{format=plain} added to caption style \opt{default}}
% \changes{v1.1c}{2007/10/14}{\opt{format=plain} removed from caption style \opt{default}}
% Currently there are two pre-defined styles, called `base' \& `default'.
% The first one is a perfect match to the behavior of |\@makecaption| offered
% by the standard \LaTeX\ document classes (and was called `default' in
% \thispackage\ \version{1.0}), the second one matches the document
% class actually used.
%    \begin{macrocode}
\DeclareCaptionStyle{base}[indent=0pt,justification=centering]{}
\DeclareCaptionStyle{default}[indent=0pt,justification=centering]{%
  format=default,labelsep=default,textformat=default,%
  justification=default,font=default,labelfont=default,textfont=default}
%    \end{macrocode}
%
% \subsection{Formats}
%
% \begin{macro}{\DeclareCaptionFormat}
% \changes{v1.0a}{2004/01/17}{Pass through argument \#3 so extra spaces
%        between arguments do make any harm}
% \changes{v1.0c}{2005/02/09}{Starred variant added}
% \changes{v1.1c}{2007/10/15}{Optional argument added}
%  |\DeclareCaptionFormat|\marg{name}\marg{code with \#1, \#2, and \#3}\\
%  |\DeclareCaptionFormat*|\marg{name}\marg{code with \#1, \#2, and \#3}\par
%  The starred form causes the code being typeset in vertical (instead of
%  horizontal) mode, but does not support the |indention=| option.
%    \begin{macrocode}
\newcommand*\DeclareCaptionFormat{%
  \caption@teststar\caption@declareformat\@gobble\@firstofone}
\@onlypreamble\DeclareCaptionFormat
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\caption@declareformat[2]{%
  \@dblarg{\caption@@declareformat#1{#2}}}
\@onlypreamble\caption@declareformat
%    \end{macrocode}
%    \begin{macrocode}
\long\def\caption@@declareformat#1#2[#3]#4{%
  \global\expandafter\let\csname caption@ifh@#2\endcsname#1%
  \global\long\@namedef{caption@slfmt@#2}##1##2##3{#3}%
  \global\long\@namedef{caption@fmt@#2}##1##2##3{#4}}
\@onlypreamble\caption@@declareformat
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
\DeclareCaptionOption{format}{\caption@setformat{#1}}
%    \end{macrocode}
%
% \begin{macro}{\caption@setformat}
%  |\caption@setformat|\marg{name}\par
%  Selecting a caption format simply means saving the code (in |\caption@fmt|)
%  and if the code should be used in horizontal or vertical mode (|\caption@ifh|).
%    \begin{macrocode}
\newcommand*\caption@setformat[1]{%
  \@ifundefined{caption@fmt@#1}%
    {\caption@Error{Undefined format `#1'}}%
    {\expandafter\let\expandafter\caption@ifh\csname caption@ifh@#1\endcsname
     \expandafter\let\expandafter\caption@slfmt\csname caption@slfmt@#1\endcsname
     \expandafter\let\expandafter\caption@fmt\csname caption@fmt@#1\endcsname}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\DeclareCaptionDefaultFormat}
% \changes{v1.2a}{2008/01/31}{This macro added}
%    \begin{macrocode}
\newcommand*\DeclareCaptionDefaultFormat[1]{%
  \expandafter\def\expandafter\caption@fmt@default\expandafter
    {\csname caption@fmt@#1\endcsname}%
  \expandafter\def\expandafter\caption@slfmt@default\expandafter
    {\csname caption@slfmt@#1\endcsname}%
  \expandafter\def\expandafter\caption@ifh@default\expandafter
    {\csname caption@ifh@#1\endcsname}}
\@onlypreamble\DeclareCaptionDefaultFormat
%    \end{macrocode}
% \end{macro}
%
% \changes{v1.0a}{2004/01/23}{%
%         Caption format \opt{default} renamed to \opt{normal}}
% \changes{v1.0e}{2005/05/12}{%
%         Caption format \opt{normal} renamed to \opt{@normal}}
% \changes{v1.0f}{2005/08/25}{%
%         Caption format \opt{@normal} renamed to \opt{plain} and documented}
% \changes{v1.1c}{2007/10/14}{%
%         Single-line variant of caption format \opt{hang} added}
% There are two pre-defined formats, called `plain' and `hang'.
%    \begin{macrocode}
\DeclareCaptionFormat{plain}{#1#2#3\par}
%    \end{macrocode}
%    \begin{macrocode}
\DeclareCaptionFormat{hang}[#1#2#3\par]{%
  \caption@ifin@list\caption@lsepcrlist\caption@lsepname
    {\caption@Error{%
       The option `labelsep=\caption@lsepname' does not work\MessageBreak
       with `format=hang'}}%
    {\@hangfrom{#1#2}%
     \advance\caption@parindent\hangindent
     \advance\caption@hangindent\hangindent
     \caption@@par#3\par}}
%    \end{macrocode}
%
% \changes{v1.0a}{2004/01/23}{Caption format \opt{default} linked to \opt{plain}}
% \changes{v1.0d}{2005/04/28}{Bugfix 05-04-28: Missing \cs{caption@ifh@default} added}
% `default' usually maps to `plain'.
%    \begin{macrocode}
\DeclareCaptionDefaultFormat{plain}
%    \end{macrocode}
%
% \subsection{Label formats}
%
% \begin{macro}{\DeclareCaptionLabelFormat}
% \changes{v1.0a}{2004/01/17}{%
%         Pass through argument \#2 so extra spaces between arguments do make any harm}
%  |\DeclareCaptionLabelFormat|\marg{name}\marg{code with \#1 and \#2}
%    \begin{macrocode}
\newcommand*\DeclareCaptionLabelFormat[2]{%
  \global\@namedef{caption@lfmt@#1}##1##2{#2}}
\@onlypreamble\DeclareCaptionLabelFormat
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
\DeclareCaptionOption{labelformat}{\caption@setlabelformat{#1}}
%    \end{macrocode}
%
% \begin{macro}{\caption@setlabelformat}
%  |\caption@setlabelformat|\marg{name}\par
%  Selecting a caption label format simply means saving the code (in |\caption@lfmt|).
%    \begin{macrocode}
\newcommand*\caption@setlabelformat[1]{%
  \@ifundefined{caption@lfmt@#1}%
    {\caption@Error{Undefined label format `#1'}}%
    {\expandafter\let\expandafter\caption@lfmt\csname caption@lfmt@#1\endcsname}}
%    \end{macrocode}
% \end{macro}
%
% \changes{v1.2}{2007/12/16}{Caption label format \opt{brace} added}
% There are four pre-defined label formats, called `empty', `simple',
% `parens', and `brace'.
%    \begin{macrocode}
\DeclareCaptionLabelFormat{empty}{}
\DeclareCaptionLabelFormat{simple}{\bothIfFirst{#1}{\nobreakspace}#2}
\DeclareCaptionLabelFormat{parens}{\bothIfFirst{#1}{\nobreakspace}(#2)}
\DeclareCaptionLabelFormat{brace}{\bothIfFirst{#1}{\nobreakspace}#2)}
%    \end{macrocode}
%
% `default' usually maps to `simple'.
%    \begin{macrocode}
\def\caption@lfmt@default{\caption@lfmt@simple}
%    \end{macrocode}
%
% \subsection{Label separators}
%
% \begin{macro}{\DeclareCaptionLabelSeparator}
% \changes{v1.0a}{2004/01/17}{Pass through argument \#2 so extra spaces
%         between arguments do make any harm}
% \changes{v1.0f}{2005/08/25}{Starred variant added}
% \changes{v1.1}{2007/07/13}{Test for CR added}
% \changes{v1.3}{2011/08/06}{Test for CR revised}
%  |\DeclareCaptionLabelSeparator|\marg{name}\marg{code}\\
%  |\DeclareCaptionLabelSeparator*|\marg{name}\marg{code}\par
%  The starred form causes the label separator to be typeset \emph{without} using |\captionlabelfont|.
%    \begin{macrocode}
\newcommand\DeclareCaptionLabelSeparator{%
  \caption@teststar\caption@declarelabelseparator\@gobble\@firstofone}
\@onlypreamble\DeclareCaptionLabelSeparator
%    \end{macrocode}
%    \begin{macrocode}
\newcommand\caption@declarelabelseparator[3]{%
  \global\@namedef{caption@iflf@#2}{#1}%
  \global\long\@namedef{caption@lsep@#2}{#3}%
  \caption@@declarelabelseparator{#2}#3\\\@nil}
\@onlypreamble\caption@declarelabelseparator
%    \end{macrocode}
%    \begin{macrocode}
\long\def\caption@@declarelabelseparator#1#2\\#3\@nil{%
  \def\@tempa{#3}\ifx\@tempa\@empty \else
    \caption@g@addto@list\caption@lsepcrlist{#1}%
  \fi}
\@onlypreamble\caption@@declarelabelseparator
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
\DeclareCaptionOption{labelsep}{\caption@setlabelseparator{#1}}
\DeclareCaptionOption{labelseparator}{\caption@setlabelseparator{#1}}
%    \end{macrocode}
%
% \begin{macro}{\caption@setlabelseparator}
%  |\caption@setlabelseparator|\marg{name}\par
%  Selecting a caption label separator simply means saving the code (in |\caption@lsep|).
%    \begin{macrocode}
\newcommand*\caption@setlabelseparator[1]{%
  \@ifundefined{caption@lsep@#1}%
    {\caption@Error{Undefined label separator `#1'}}%
    {\edef\caption@lsepname{#1}%
     \expandafter\let\expandafter\caption@iflf\csname caption@iflf@#1\endcsname
     \expandafter\let\expandafter\caption@lsep\csname caption@lsep@#1\endcsname}}
%    \end{macrocode}
% \end{macro}
%
% \changes{v1.0e}{2005/06/11}{Bugfix 05-03-23: Caption label separator
%         \opt{newline} implementation changed from \cs{newline} to \cs{\textbackslash}}
% \changes{v1.0f}{2005/08/24}{Caption label separator \opt{endash} added}
% There are seven pre-defined label separators, called `none', `colon', `period', `space',
% `quad', `newline', and `endash'.
%    \begin{macrocode}
\DeclareCaptionLabelSeparator{none}{}
\DeclareCaptionLabelSeparator{colon}{: }
\DeclareCaptionLabelSeparator{period}{. }
\DeclareCaptionLabelSeparator{space}{ }
\DeclareCaptionLabelSeparator*{quad}{\quad}
\DeclareCaptionLabelSeparator*{newline}{\\}
\DeclareCaptionLabelSeparator*{endash}{\space\textendash\space}
%    \end{macrocode}
%
% \begin{macro}{\caption@setdefaultlabelsep}
% \changes{v1.2d}{2009/03/29}{This macro added}
%    \begin{macrocode}
\newcommand*\caption@setdefaultlabelsep[1]{%
  \ifx\caption@lsep\caption@lsep@default
    \caption@set@default@labelsep{#1}%
    \caption@setlabelseparator{default}%
  \else
    \caption@set@default@labelsep{#1}%
  \fi}
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\caption@set@default@labelsep[1]{%
  \def\caption@lsep@default{\@nameuse{caption@lsep@#1}}%
  \def\caption@iflf@default{\@nameuse{caption@iflf@#1}}}
%    \end{macrocode}
% \end{macro}
%
% `default' usually maps to `colon'.
%    \begin{macrocode}
\caption@set@default@labelsep{colon}
%    \end{macrocode}
%
% \subsection{Text formats}
%
% \begin{macro}{\DeclareCaptionTextFormat}
% \changes{v1.0j}{2007/02/18}{This macro added}
%  |\DeclareCaptionTextFormat|\marg{name}\marg{code with \#1}
%    \begin{macrocode}
\newcommand*\DeclareCaptionTextFormat[2]{%
  \global\long\@namedef{caption@tfmt@#1}##1{#2}}
\@onlypreamble\DeclareCaptionTextFormat
%    \end{macrocode}
% \end{macro}
%
% \changes{v1.0c}{2005/02/12}{Option \opt{strut=} added}
%    \begin{macrocode}
\DeclareCaptionOption{textformat}{\caption@settextformat{#1}}
\DeclareCaptionOption{strut}[1]{\caption@set@bool\caption@ifstrut{#1}}
%    \end{macrocode}
%
% \begin{macro}{\caption@settextformat}
% \changes{v1.0j}{2007/02/18}{This macro added}
%  |\caption@settextformat|\marg{name}\par
%  Selecting a caption text format simply means saving the code (in |\caption@tfmt|).
%    \begin{macrocode}
\newcommand*\caption@settextformat[1]{%
  \@ifundefined{caption@tfmt@#1}%
    {\caption@Error{Undefined text format `#1'}}%
    {\expandafter\let\expandafter\caption@tfmt\csname caption@tfmt@#1\endcsname}}
%    \end{macrocode}
% \end{macro}
%
% There are two pre-defined text formats, called `simple' and `period'.
%    \begin{macrocode}
\DeclareCaptionTextFormat{simple}{#1}
\DeclareCaptionTextFormat{period}{#1.}
%    \end{macrocode}
%
% `default' usually maps to `simple'.
%    \begin{macrocode}
\def\caption@tfmt@default{\caption@tfmt@simple}
%    \end{macrocode}
%
% \subsection{Fonts}
%
% \begin{macro}{\DeclareCaptionFont}
% \changes{v1.0a}{2004/01/22}{%
%         Bugfix: Multi token arguments are allowed now}
% \changes{v1.1}{2007/05/07}{%
%         Internal: Uses \cs{caption@fnt} instead of \cs{caption@temp} now}
%  |\DeclareCaptionFont|\marg{name}\marg{code}
%    \begin{macrocode}
\newcommand*\DeclareCaptionFont[2]{%
  \define@key{caption@fnt}{#1}[]{\l@addto@macro\caption@fnt{#2}}}
\@onlypreamble\DeclareCaptionFont
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\DeclareCaptionDefaultFont}
% \changes{v1.1}{2006/05/14}{This macro added}
% \changes{v1.2a}{2008/01/31}{Renamed from \cs{DeclareDefaultCaptionFont} to \cs{DeclareCaptionDefaultFont}}
%  |\DeclareCaptionDefaultFont|\marg{name}\marg{code}
%    \begin{macrocode}
\newcommand*\DeclareCaptionDefaultFont[2]{%
  \global\@namedef{caption#1@default}{#2}}
\@onlypreamble\DeclareCaptionDefaultFont
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
\DeclareCaptionOption{font}{\caption@setfont{font}{#1}}
\DeclareCaptionOption{font+}{\caption@addtofont{font}{#1}}
\DeclareCaptionDefaultFont{font}{}
%    \end{macrocode}
%    \begin{macrocode}
\DeclareCaptionOption{labelfont}{\caption@setfont{labelfont}{#1}}
\DeclareCaptionOption{labelfont+}{\caption@addtofont{labelfont}{#1}}
\DeclareCaptionDefaultFont{labelfont}{}
%    \end{macrocode}
%    \begin{macrocode}
\DeclareCaptionOption{textfont}{\caption@setfont{textfont}{#1}}
\DeclareCaptionOption{textfont+}{\caption@addtofont{textfont}{#1}}
\DeclareCaptionDefaultFont{textfont}{}
%    \end{macrocode}
%
% \begin{macro}{\caption@setfont}
% \changes{v1.0j}{2007/01/30}{Usage of \cs{caption@setkeys} with optional argument}
% \changes{v1.1}{2006/05/14}{Support of \cs{DeclareDefaultCaptionFont} added}
%  |\caption@setfont|\marg{name}\marg{keyval-list of names}\par
%  Selecting a caption font means saving all the code snippets
%  in |\caption|\meta{name}.
%    \begin{macrocode}
\newcommand*\caption@setfont[1]{%
  \expandafter\let\csname caption#1\endcsname\@empty
  \caption@addtofont{#1}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@addtofont}
% \changes{v1.2}{2007/11/17}{This macro added}
%  |\caption@addtofont|\marg{name}\marg{keyval-list of names}\par
%  Like |\caption@setfont|, but adds the code snippets to |\caption|\meta{name}.\par
%  Because we use |\setkeys| recursive here we need to do this inside an
%  extra group.
%    \begin{macrocode}
\newcommand*\caption@addtofont[2]{%
  \begingroup
    \expandafter\let\expandafter\caption@fnt\csname caption#1\endcsname
    \define@key{caption@fnt}{default}[]{%
      \l@addto@macro\caption@fnt{\csname caption#1@default\endcsname}}%
    \caption@setkeys[caption]{caption@fnt}{#2}%
    \global\let\caption@tempa\caption@fnt
  \endgroup
  \expandafter\let\csname caption#1\endcsname\caption@tempa}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@font}
% \changes{v1.1}{2007/05/07}{This macro added}
%  |\caption@font|\marg{keyval-list of names}\\
%  |\caption@font*|\marg{keyval-code}\par
%  Sets the given font, e.g.~|\caption@font{small,it}|
%  is equivalent to |\small\itshape|.
%    \begin{macrocode}
\newcommand*\caption@font{%
  \caption@teststar\caption@@font\@firstofone
          {\caption@setkeys[caption]{caption@fnt}}}
\newcommand*\caption@@font[2]{%
  \begingroup
  \def\caption@fnt{\endgroup}%
  #1{#2}%
  \caption@fnt}
%    \end{macrocode}
% \end{macro}
%
% These are the pre-defined font code snippets.
%
% \changes{v1.1}{2007/05/07}{Color font support added}
%    \begin{macrocode}
\DeclareCaptionFont{normalcolor}{\normalcolor}
\DeclareCaptionFont{color}{\color{#1}}
%    \end{macrocode}
%
%    \begin{macrocode}
\DeclareCaptionFont{normalfont}{\normalfont}
\DeclareCaptionFont{up}{\upshape}
\DeclareCaptionFont{it}{\itshape}
\DeclareCaptionFont{sl}{\slshape}
\DeclareCaptionFont{sc}{\scshape}
\DeclareCaptionFont{md}{\mdseries}
\DeclareCaptionFont{bf}{\bfseries}
\DeclareCaptionFont{rm}{\rmfamily}
\DeclareCaptionFont{sf}{\sffamily}
\DeclareCaptionFont{tt}{\ttfamily}
%    \end{macrocode}
%
%    \begin{macrocode}
\DeclareCaptionFont{scriptsize}{\scriptsize}
\DeclareCaptionFont{footnotesize}{\footnotesize}
\DeclareCaptionFont{small}{\small}
\DeclareCaptionFont{normalsize}{\normalsize}
\DeclareCaptionFont{large}{\large}
\DeclareCaptionFont{Large}{\Large}
%    \end{macrocode}
%
% \changes{v1.3}{2011/01/01}{\package{sansmath} package support added}
%    \begin{macrocode}
\DeclareCaptionFont{sansmath}{\sansmath}
%    \end{macrocode}
%
% \changes{v1.0n}{2007/04/02}{\package{setspace} package support added}
% \changes{v1.2d}{2009/10/09}{Bugfix 09-05-18: \package{setspace} package support revised}
%    \begin{macrocode}
\DeclareCaptionFont{singlespacing}{%
  \caption@ifundefined\setspace@singlespace{}{%
    \setstretch\setspace@singlespace}}% normally 1
\DeclareCaptionFont{onehalfspacing}{\onehalfspacing}
\DeclareCaptionFont{doublespacing}{\doublespacing}
\DeclareCaptionFont{stretch}{\setstretch{#1}}
%    \end{macrocode}
%
%    \begin{macrocode}
%\DeclareCaptionFont{normal}{%
%  \caption@font{normalcolor,normalfont,normalsize,singlespacing}
\DeclareCaptionFont{normal}{%
  \caption@font*{%
    \KV@caption@fnt@normalcolor\@unused
    \KV@caption@fnt@normalfont\@unused
    \KV@caption@fnt@normalsize\@unused
    \KV@caption@fnt@singlespacing\@unused}}
%    \end{macrocode}
%
% \changes{v1.0a}{2004/01/23}{Option \opt{size=} now sets \cs{captionsize} instead of \cs{captionfont}}
% The old versions \version{1.x} of \thispackage\ offered this
% command to setup the font size used for captions. We still do
% so old documents will work fine.
%    \begin{macrocode}
\DeclareCaptionOption{size}{\caption@setfont{size}{#1}}
\DeclareCaptionDefaultFont{size}{}
%    \end{macrocode}
%
% \subsection{Justifications}
%
% \begin{macro}{\DeclareCaptionJustification}
% \changes{v1.0a}{2004/01/17}{Pass through argument \#2 so extra spaces
%                             between arguments do make any harm}
% \changes{v1.1}{2007/07/03}{Mapped to \cs{DeclareCaptionFont}}
%  |\DeclareCaptionJustification|\marg{name}\marg{code}
%    \begin{macrocode}
\newcommand*\DeclareCaptionJustification[2]{%
  \global\@namedef{caption@hj@#1}{#2}% for compatibility to v1.0
  \DeclareCaptionFont{#1}{#2}}
\@onlypreamble\DeclareCaptionJustification
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\DeclareCaptionDefaultJustification}
% \changes{v1.1}{2007/07/03}{This macro added}
% \changes{v1.2a}{2008/01/31}{Renamed from \cs{DeclareDefaultCaptionJustification} to \cs{DeclareCaptionDefaultJustification}}
%  |\DeclareCaptionDefaultJustification|\marg{code}
%    \begin{macrocode}
\newcommand*\DeclareCaptionDefaultJustification[1]{%
  \global\@namedef{caption@hj@default}{#1}% for compatibility to v1.0
  \DeclareCaptionDefaultFont{@hj}{#1}}
\@onlypreamble\DeclareCaptionDefaultJustification
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
\DeclareCaptionOption{justification}{\caption@setjustification{#1}}
\DeclareCaptionDefaultJustification{}
%    \end{macrocode}
%
% \begin{macro}{\caption@setjustification}
% \changes{v1.1}{2007/07/03}{Mapped to \cs{caption@setfont}}
%  |\caption@setjustification|\marg{name}\par
%  Selecting a caption justification simply means saving the code (in |\caption@hj|).
%    \begin{macrocode}
\newcommand*\caption@setjustification{\caption@setfont{@hj}}
%    \end{macrocode}
% \end{macro}
%
% These are the pre-defined justification code snippets.
%    \begin{macrocode}
\DeclareCaptionJustification{justified}{}
\DeclareCaptionJustification{centering}{\centering}
\DeclareCaptionJustification{centerfirst}{\centerfirst}
\DeclareCaptionJustification{centerlast}{\centerlast}
\DeclareCaptionJustification{raggedleft}{\raggedleft}
\DeclareCaptionJustification{raggedright}{\raggedright}
%    \end{macrocode}
%
% \begin{macro}{\centerfirst}
% \changes{v1.0j}{2007/01/21}{Bugfix: Usage of \cs{@centercr} added (Thanks to Olga!)}
% \changes{v1.0j}{2007/01/21}{This macro renamed from \cs{caption@centerfirst} to \cs{centerfirst}}
%  Please blame Frank Mittelbach for the code of |\centerfirst| |:-)|
%    \begin{macrocode}
\providecommand\centerfirst{%
  \let\\\@centercr
  \edef\caption@normaladjust{%
    \leftskip\the\leftskip
    \rightskip\the\rightskip
    \parfillskip\the\parfillskip\relax}%
  \leftskip\z@\@plus -1fil%
  \rightskip\z@\@plus 1fil%
  \parfillskip\z@skip
  \noindent\hskip\z@\@plus 2fil%
  \@setpar{\@@par\@restorepar\caption@normaladjust}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\centerlast}
% \changes{v1.0j}{2007/01/21}{Bugfix: Usage of \cs{@centercr} added (Thanks to Olga!)}
% \changes{v1.0j}{2007/01/21}{This macro renamed from \cs{caption@centerlast} to \cs{centerlast}}
%  This is based on code from Anne Br\"uggemann-Klein\cite{Anne}
%    \begin{macrocode}
\providecommand\centerlast{%
  \let\\\@centercr
  \leftskip\z@\@plus 1fil%
  \rightskip\z@\@plus -1fil%
  \parfillskip\z@\@plus 2fil\relax}
%    \end{macrocode}
% \end{macro}
%
% \subsubsection{The ragged2e package}
% \changes{v1.0b}{2004/05/16}{Improved \package{ragged2e} package support}
%
% We also support the upper-case commands offered by the \package{ragged2e}
% package.
% Note that these just map to their lower-case variants if the
% \package{ragged2e} package is not available.
%    \begin{macrocode}
\DeclareCaptionJustification{Centering}{%
  \caption@ragged\Centering\centering}
\DeclareCaptionJustification{RaggedLeft}{%
  \caption@ragged\RaggedLeft\raggedleft}
\DeclareCaptionJustification{RaggedRight}{%
  \caption@ragged\RaggedRight\raggedright}
%    \end{macrocode}
%
% \begin{macro}{\caption@ragged}
% \changes{v1.0n}{2007/04/07}{The `ragged2e' package will now only been
%         loaded when needed}
% \changes{v1.0o}{2007/04/11}{Bugfix: Usage of \cs{caption@Info} replaced
%         by \cs{caption@Debug}}
% \changes{v1.1}{2007/04/16}{A different warning will be given on first \LaTeX\ run}
%  |\caption@ragged| will be basically defined as
%  \begin{quote}
%    |\AtBeginDocument{\IfFileExists{ragged2e.sty}%|\\
%    |  {\RequirePackage{ragged2e}\let\caption@ragged\@firstoftwo}%|\\
%    |  {\let\caption@ragged\@secondoftwo}}|
%  \end{quote}
%  but with an additional warning if the ragged2e package is not loaded (yet).
%  (This warning will be type out only one time per option, that's why
%  we need the |caption\string#1| stuff.)
%  Furthermore we load the \package{ragged2e} package, if needed and available.
%    \begin{macrocode}
\newcommand*\caption@ragged{%
  \caption@Debug{We need ragged2e}%
  \protected@write\@auxout{}{\string\caption@newlabel{ragged2e}{}}%
  \global\let\caption@ragged\caption@@ragged
  \caption@ragged}
%    \end{macrocode}
%    \begin{macrocode}
\caption@AtBeginDocument{%
  \@ifundefined{caption@r@ragged2e}{%
    \newcommand*\caption@@ragged{%
      \caption@Warning{%
        `ragged2e' support has been changed.\MessageBreak
        Rerun to get captions right}%
      \global\let\caption@ragged\@secondoftwo % suppress further warnings
      \caption@ragged}%
  }{%
    \caption@Debug{We load ragged2e}%
    \IfFileExists{ragged2e.sty}{%
      \RequirePackage{ragged2e}%
      \let\caption@@ragged\@firstoftwo
    }{%
      \newcommand*\caption@@ragged[2]{%
        \@ifundefined{caption\string#1}{%
          \caption@Warning{%
            `ragged2e' package not loaded, therefore\MessageBreak
            substituting \string#2 for \string#1\MessageBreak}%
          \global\@namedef{caption\string#1}}{}%
        #2}%
    }%
  }}
%    \end{macrocode}
%    \begin{macrocode}
%    \end{macrocode}
% \end{macro}
%
% \subsection{Vertical spaces before and after captions}
%
% \begin{macro}{\abovecaptionskip}
% \begin{macro}{\belowcaptionskip}
%  Usually these skips are defined within the document class, but some
%  document classes don't do so.
%    \begin{macrocode}
\caption@ifundefined\abovecaptionskip{%
  \newlength\abovecaptionskip\setlength\abovecaptionskip{10\p@}}{}
\caption@ifundefined\belowcaptionskip{%
  \newlength\belowcaptionskip\setlength\belowcaptionskip{0\p@}}{}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \changes{v1.0c}{2005/02/12}{Option \opt{skip=} added}
%    \begin{macrocode}
\DeclareCaptionOption{aboveskip}{\setlength\abovecaptionskip{#1}}
\DeclareCaptionOption{belowskip}{\setlength\belowcaptionskip{#1}}
\DeclareCaptionOption{skip}{\setlength\abovecaptionskip{#1}}
%    \end{macrocode}
%
% \begin{macro}{\caption@rule}
% \changes{v1.2b}{2008/05/06}{This macro added}
%  |\caption@rule|\par
%  Draws an invisible rule to adjust the ``skip'' setting.
%    \begin{macrocode}
\newcommand*\caption@rule{\caption@ifrule\caption@hrule\relax}
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\caption@hrule{\hrule\@height\z@}
%    \end{macrocode}
% \end{macro}
%
% \changes{v1.2b}{2008/05/06}{Option \opt{rule=} added}
%    \begin{macrocode}
\DeclareCaptionOption{rule}[1]{\caption@set@bool\caption@ifrule{#1}}
%    \end{macrocode}
%
% \subsection{Positioning}
%
% These macros handle the right position of the caption.
% Note that the position is actually \emph{not} controlled by the
% \package{caption3} kernel options, but by the user (or a specific package
% like the \package{float} package) instead.
% The user can put the |\caption| command wherever he likes! So this stuff
% is only to give us a \emph{hint} where to put the right skips, the user
% usually has to take care for himself that this hint actually matches the
% right position.
%
%    \begin{macrocode}
\DeclareCaptionOption{position}{\caption@setposition{#1}}
%    \end{macrocode}
%
% \begin{macro}{\caption@setposition}
% \changes{v1.0a}{2004/01/22}{Now the positions \opt{t}, \opt{above}, \opt{b},
%                             \opt{below}, and \opt{a} are allowed, too}
% \changes{v1.0c}{2004/08/10}{Usage of \cs{caption@defaultpos} added}
%  |\caption@setposition|\marg{position}\par
%  Selecting the caption position means that we put |\caption@position| to
%  the right value. \emph{Please do \textbf{not} use the internal macro
%  \cs{caption@position} in your own package or document, but use the wrapper
%  macro \cs{caption@iftop} instead.}
%    \begin{macrocode}
\newcommand*\caption@setposition[1]{%
  \caption@ifinlist{#1}{d,default}{%
    \let\caption@position\caption@defaultpos
  }{\caption@ifinlist{#1}{t,top,above}{%
    \let\caption@position\@firstoftwo
  }{\caption@ifinlist{#1}{b,bottom,below}{%
    \let\caption@position\@secondoftwo
  }{\caption@ifinlist{#1}{a,auto}{%
    \let\caption@position\@undefined
  }{%
    \caption@Error{Undefined position `#1'}%
  }}}}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@defaultpos}
% \changes{v1.1}{2007/05/08}{Default position changed from `bottom' to `auto'}
%  The default `position' is `auto', this means that \thispackage\ will try
%  to guess the current position of the caption.
%  (But in many cases, for example in |longtable|s, this is doomed to fail!)\par
%  The setting `bottom' correspondents to the |\@makecaption| implementation
%  in the standard \LaTeX\ document classes, but `auto' should give better
%  results in most cases.
%    \begin{macrocode}
%\caption@setdefaultpos{a}% default = auto
\let\caption@defaultpos\@undefined
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@iftop}
% \changes{v1.0a}{2004/01/23}{Split into \cs{caption@iftop} \& \cs{caption@fixposition}}
% \changes{v1.0c}{2005/02/12}{Adapted to \cs{caption@defaultpos}}
% \changes{v1.1}{2007/05/08}{Position will be fixed to `bottom' if `auto'}
%  |\caption@iftop|\marg{true-code}\marg{false-code}\par
%  (If the |position=| is set to |auto| we assume a |bottom| position here.)
%    \begin{macrocode}
\newcommand*\caption@iftop{%
  \ifx\caption@position\@undefined
    \let\caption@position\@secondoftwo
%   = \caption@setposition b%
  \fi
  \caption@position}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@fixposition}
% \changes{v1.0b}{2004/05/16}{%
%        Split into \cs{caption@fixposition} & \cs{caption@autoposition}}
%  |\caption@fixposition|\par
%  This macro checks if the `position' is set to `auto'.
%  If yes, |\caption@autoposition| will be called to
%  set |\caption@position| to a proper value we can actually use.
%    \begin{macrocode}
\newcommand*\caption@fixposition{%
  \ifx\caption@position\@undefined
    \caption@autoposition
  \fi}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@autoposition}
% \changes{v1.0a}{2004/01/23}{\cs{ifvmode} added}
%  |\caption@autoposition|\par
%  We guess the current position of the caption by checking |\prevdepth|.\par
%  A different solution would be setting the |\spacefactor| to something
%  not much less than 1000 (for example 994) in |\caption@start| and
%  checking this value here by |\ifnum\spacefactor=994|.
%  (It's implemented in the \package{threeparttable}
%   package\cite{threeparttable} this way.)\par
%  Another idea would be checking |\@ifminipage|, but since some packages
%  typeset the caption within a simple |\vbox| this does not seem to be a
%  good one.
%    \begin{macrocode}
\newcommand*\caption@autoposition{%
  \ifvmode
    \edef\caption@tempa{\the\prevdepth}%
    \caption@Debug{\protect\prevdepth=\caption@tempa}%
    \ifdim\prevdepth>-\p@
      \let\caption@position\@secondoftwo
    \else
      \let\caption@position\@firstoftwo
    \fi
%   = \caption@setposition{\ifdim\prevdepth>-\p@ b\else t\fi}%
  \else
    \caption@Debug{no \protect\prevdepth}%
    \let\caption@position\@secondoftwo
%   = \caption@setposition b%
  \fi}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\caption@setautoposition}
% \changes{v1.1}{2007/06/10}{This macro added}
%  |\caption@setautoposition|\marg{position}\par
%  replaces the above algorithm by a different one (or a fixed position setting).
%    \begin{macrocode}
\newcommand*\caption@setautoposition[1]{%
  \def\caption@autoposition{\caption@setposition{#1}}}
%    \end{macrocode}
% \end{macro}
%
% \subsection{Hooks}
%
% \begin{macro}{\AtBeginCaption}
% \begin{macro}{\AtEndCaption}
%  |\AtBeginCaption| \marg{code}\\
%  |\AtEndCaption| \marg{code}\par
%  These hooks can be used analogous to |\AtBeginDocument| and |\AtEndDocument|.
%    \begin{macrocode}
\newcommand*\caption@beginhook{}
\newcommand*\caption@endhook{}
\newcommand*\AtBeginCaption{\l@addto@macro\caption@beginhook}
\newcommand*\AtEndCaption{\l@addto@macro\caption@endhook}
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \subsection{Lists}
%
% \changes{v1.0b}{2004/05/16}{Option \opt{listof=} added}
% \changes{v1.2}{2007/11/17}{Option \opt{list=} added}
%    \begin{macrocode}
\DeclareCaptionOption{list}[1]{\caption@setlist{#1}}
\DeclareCaptionOption{listof}[1]{\caption@setlist{#1}}
%    \end{macrocode}
%
% \begin{macro}{\caption@setlist}
% \changes{v1.2a}{2008/03/20}{This macro added}
%  |\caption@setlist|\marg{boolean}
%    \begin{macrocode}
\newcommand*\caption@setlist{\caption@set@bool\caption@iflist}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\DeclareCaptionListFormat}
% \changes{v1.1}{2004/07/15}{This macro added}
% \changes{v1.2}{2007/11/17}{Renamed from \cs{DeclareCaptionListOfFormat} to \cs{DeclareCaptionListFormat}}
%  |\DeclareCaptionListFormat|\marg{name}\marg{code with \#1 and \#2}
%    \begin{macrocode}
\newcommand*\DeclareCaptionListFormat[2]{%
  \global\@namedef{caption@lstfmt@#1}##1##2{#2}}
\@onlypreamble\DeclareCaptionListFormat
%    \end{macrocode}
% \end{macro}
%
% \changes{v1.1}{2007/07/15}{Option \opt{listofformat=} added}
% \changes{v1.2}{2007/11/17}{Option \opt{listofformat=} renamed to \opt{listformat=}}
%    \begin{macrocode}
\DeclareCaptionOption{listformat}{\caption@setlistformat{#1}}
%    \end{macrocode}
%
% \begin{macro}{\caption@setlistformat}
% \changes{v1.1}{2004/07/15}{This macro added}
% \changes{v1.2}{2007/11/17}{Renamed from \cs{caption@setlistofformat} to \cs{caption@setlistformat}}
%  |\caption@setlistformat|\marg{name}\par
%  Selecting a caption list format simply means saving the code (in |\caption@lstfmt|).
%    \begin{macrocode}
\newcommand*\caption@setlistformat[1]{%
  \@ifundefined{caption@lstfmt@#1}%
    {\caption@Error{Undefined list format `#1'}}%
    {\expandafter\let\expandafter\caption@lstfmt
       \csname caption@lstfmt@#1\endcsname}}
%    \end{macrocode}
% \end{macro}
%
% There are five pre-defined list formats, taken from the \package{subfig} package.
%    \begin{macrocode}
\DeclareCaptionListFormat{empty}{}
\DeclareCaptionListFormat{simple}{#1#2}
\DeclareCaptionListFormat{parens}{#1(#2)}
\DeclareCaptionListFormat{subsimple}{#2}
\DeclareCaptionListFormat{subparens}{(#2)}
%    \end{macrocode}
%
% \begin{macro}{\caption@setdefaultlistformat}
% \changes{v1.2d}{2009/03/29}{This macro added}
%    \begin{macrocode}
\newcommand*\caption@setdefaultlistformat[1]{%
  \ifx\caption@lstfmt\caption@lstfmt@default
    \caption@set@default@listformat{#1}%
    \caption@setlistformat{default}%
  \else
    \caption@set@default@listformat{#1}%
  \fi}
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\caption@set@default@listformat[1]{%
  \def\caption@lstfmt@default{\@nameuse{caption@lstfmt@#1}}}
%    \end{macrocode}
% \end{macro}
%
% `default' usually maps to `subsimple'.
%    \begin{macrocode}
\caption@set@default@listformat{subsimple}
%    \end{macrocode}
%
% \subsection{Debug option}
% \changes{v1.0k}{2007/03/04}{Debug option added}
%
%    \begin{macrocode}
\DeclareCaptionOption{debug}[1]{%
  \caption@set@bool\caption@ifdebug{#1}%
  \caption@ifdebug
    {\let\caption@Debug\caption@Info}%
    {\let\caption@Debug\@gobble}}
%    \end{macrocode}
%    \begin{macrocode}
\DeclareOption{debug}{\setkeys{caption}{debug}}
%    \end{macrocode}
%    \begin{macrocode}
\setkeys{caption}{debug=0}
%    \end{macrocode}
%
% \subsection{Document classes \& Babel support}
%
% \subsubsection{The standard \texorpdfstring{\LaTeX{}}{LaTeX} classes}
%
%    \begin{macrocode}
\caption@CheckCommand\@makecaption{%
  % article|report|book [2005/09/16 v1.4f Standard LaTeX document class]
  \long\def\@makecaption#1#2{%
    \vskip\abovecaptionskip
    \sbox\@tempboxa{#1: #2}%
    \ifdim \wd\@tempboxa >\hsize
      #1: #2\par
    \else
      \global \@minipagefalse
      \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
    \fi
    \vskip\belowcaptionskip}}
%    \end{macrocode}
%
% \subsubsection{The \AmS{} \& \SmF{} classes}
% \changes{v1.1}{2007/07/29}{\AmS\ \& \SmF\ classes support added}
%
% \begin{macro}{\caption@ifamsclass}
%    \begin{macrocode}
\providecommand*\caption@ifamsclass{%
  \caption@ifundefined\@captionheadfont\@gobble\@firstofone}
\@onlypreamble\caption@ifamsclass
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
\caption@ifamsclass{%
%    \end{macrocode}
%    \begin{macrocode}
  \caption@CheckCommand\@makecaption{%
    % amsart|amsproc|amsbook [2004/08/06 v2.20]
    \long\def\@makecaption#1#2{%
      \setbox\@tempboxa\vbox{\color@setgroup
        \advance\hsize-2\captionindent\noindent
        \@captionfont\@captionheadfont#1\@xp\@ifnotempty\@xp
            {\@cdr#2\@nil}{.\@captionfont\upshape\enspace#2}%
        \unskip\kern-2\captionindent\par
        \global\setbox\@ne\lastbox\color@endgroup}%
      \ifhbox\@ne % the normal case
        \setbox\@ne\hbox{\unhbox\@ne\unskip\unskip\unpenalty\unkern}%
      \fi
      \ifdim\wd\@tempboxa=\z@ % this means caption will fit on one line
        \setbox\@ne\hbox to\columnwidth{\hss\kern-2\captionindent\box\@ne\hss}%
      \else % tempboxa contained more than one line
        \setbox\@ne\vbox{\unvbox\@tempboxa\parskip\z@skip
            \noindent\unhbox\@ne\advance\hsize-2\captionindent\par}%
      \fi
      \ifnum\@tempcnta<64 % if the float IS a figure...
        \addvspace\abovecaptionskip
        \hbox to\hsize{\kern\captionindent\box\@ne\hss}%
      \else % if the float IS NOT a figure...
        \hbox to\hsize{\kern\captionindent\box\@ne\hss}%
        \nobreak
        \vskip\belowcaptionskip
      \fi
    \relax
    }}
%    \end{macrocode}
%    \begin{macrocode}
  \caption@CheckCommand\@makecaption{%
    % smfart|smfbook [1999/11/15 v1.2f Classe LaTeX pour les articles publies par la SMF]
    \long\def\@makecaption#1#2{%
      \ifdim\captionindent>.1\hsize \captionindent.1\hsize \fi
      \setbox\@tempboxa\vbox{\color@setgroup
        \advance\hsize-2\captionindent\noindent
        \@captionfont\@captionheadfont#1\@xp\@ifnotempty\@xp
            {\@cdr#2\@nil}{\@addpunct{.}\@captionfont\upshape\enspace#2}%
        \unskip\kern-2\captionindent\par
        \global\setbox\@ne\lastbox\color@endgroup}%
      \ifhbox\@ne % the normal case
        \setbox\@ne\hbox{\unhbox\@ne\unskip\unskip\unpenalty\unkern}%
      \fi
      \ifdim\wd\@tempboxa=\z@ % this means caption will fit on one line
        \setbox\@ne\hbox to\columnwidth{\hss\kern-2\captionindent\box\@ne\hss}%
        \@tempdima\wd\@ne\advance\@tempdima-\captionindent
        \wd\@ne\@tempdima
      \else % tempboxa contained more than one line
        \setbox\@ne\vbox{\rightskip=0pt plus\captionindent\relax
            \unvbox\@tempboxa\parskip\z@skip
            \noindent\unhbox\@ne\advance\hsize-2\captionindent\par}%
      \fi
      \ifnum\@tempcnta<64 % if the float IS a figure...
        \addvspace\abovecaptionskip
        \noindent\kern\captionindent\box\@ne
      \else % if the float IS NOT a figure...
        \noindent\kern\captionindent\box\@ne
        \nobreak
        \vskip\belowcaptionskip
      \fi
    \relax
    }}
%    \end{macrocode}
%    \begin{macrocode}
  \let\captionmargin\captionindent % set to 3pc by AMS class
  \begingroup\edef\@tempa{\endgroup
    \noexpand\caption@g@addto@list\noexpand\caption@sty@default
      {margin=\the\captionmargin
       \caption@ifundefined\smf@makecaption{}{,maxmargin=.1\linewidth}}}
  \@tempa
  \caption@g@addto@list\caption@sls@default{margin*=.5\captionmargin}
  \DeclareCaptionLabelSeparator{default}{.\enspace}
  \DeclareCaptionDefaultFont{font}{\@captionfont}
  \DeclareCaptionDefaultFont{labelfont}{\@captionheadfont}
  \DeclareCaptionDefaultFont{textfont}{\@captionfont\upshape}
  \captionsetup[figure]{position=b}
  \captionsetup[table]{position=t}
%    \end{macrocode}
%    \begin{macrocode}
}
%    \end{macrocode}
%
% \subsubsection{The beamer class (Part one)}
% \changes{v1.1}{2007/03/10}{beamer class support added}
% \changes{v1.3}{2011/08/06}{beamer class support revised}
%
% \begin{macro}{\caption@ifbeamerclass}
%    \begin{macrocode}
\providecommand*\caption@ifbeamerclass{%
  \@ifclassloaded{beamer}\@firstofone\@gobble}
\@onlypreamble\caption@ifbeamerclass
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
\caption@ifbeamerclass{%
%    \end{macrocode}
%    \begin{macrocode}
  \caption@CheckCommand\beamer@makecaption{%
    % beamerbaselocalstructure.sty,v 1.53 2007/01/28 20:48:21 tantau
    \long\def\beamer@makecaption#1#2{%
      \def\insertcaptionname{\csname#1name\endcsname}%
      \def\insertcaptionnumber{\csname the#1\endcsname}%
      \def\insertcaption{#2}%
      \nobreak\vskip\abovecaptionskip\nobreak
      \sbox\@tempboxa{\usebeamertemplate**{caption}}%
      \ifdim \wd\@tempboxa >\hsize
        \usebeamertemplate**{caption}\par
      \else
        \global \@minipagefalse
        \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
      \fi
      \nobreak\vskip\belowcaptionskip\nobreak}}
%    \end{macrocode}
% \begin{macro}{\caption@ifbeamertemplate}
%    \begin{macrocode}
\newcommand*\caption@ifbeamertemplate[1]{%
  \begingroup
    \let\beamer@@tmpl@caption@ORI\beamer@@tmpl@caption
    \@nameuse{beamer@@tmpop@caption@#1}%
    \ifx\beamer@@tmpl@caption@ORI\beamer@@tmpl@caption
      \endgroup\expandafter\@firstoftwo
    \else
      \endgroup\expandafter\@secondoftwo
    \fi}
%    \end{macrocode}
% \end{macro}
%    \begin{macrocode}
  \DeclareCaptionLabelFormat{default}{%
    #1\caption@ifbeamertemplate{numbered}{~#2}{}}
  \caption@declarelabelseparator
    {\caption@ifbeamertemplate{caption name own line}\@gobble\@firstofone}
    {default}
    {\caption@ifbeamertemplate{caption name own line}{\\}{: }}
  \DeclareCaptionDefaultFont{font}{%
    \usebeamerfont*{caption}%
    \usebeamercolor[fg]{caption}}
  \DeclareCaptionDefaultFont{labelfont}{%
    \usebeamercolor[fg]{caption name}%
    \usebeamerfont*{caption name}}
  \DeclareCaptionDefaultJustification{\raggedright}
  \DeclareOption{beamerclass}{%
    \renewcommand\caption@ifslc{%
      \caption@ifbeamertemplate{caption name own line}\@secondoftwo\@firstoftwo}
    % Since the beamer class do not offer a `list of figures' we switch this support off.
    \captionsetup{list=0}}
  \PassOptionsToPackage{beamerclass}{caption3}
%    \end{macrocode}
%
% If the \package{beamer} document class is used, we offer a beamer
% template called `caption3' which can be used with option `beamer' or
% |\setbeamertemplate{caption}[caption3]|.\par
% (Note that this is of no use when the \package{caption} package is used, too.)
%    \begin{macrocode}
  \defbeamertemplate{caption}{caption3}{%
    \caption@make\insertcaptionname\insertcaptionnumber\insertcaption}
%    \end{macrocode}
%    \begin{macrocode}
  \DeclareOption{beamer}{%
    % \usebeamertemplate**{caption} will set font
    \DeclareCaptionDefaultFont{font}{}%
    \setbeamertemplate{caption}[caption3]}
%    \end{macrocode}
%    \begin{macrocode}
%
%    \begin{macrocode]
}
%    \end{macrocode}
%
% \subsubsection{The KOMA-Script classes}
% \changes{v1.1}{2007/03/31}{\KOMAScript\ classes support added}
%
% \begin{macro}{\caption@ifkomaclass}
%    \begin{macrocode}
\providecommand*\caption@ifkomaclass{%
  \caption@ifundefined\scr@caption\@gobble\@firstofone}
\@onlypreamble\caption@ifkomaclass
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
\caption@ifkomaclass{%
%    \end{macrocode}
%    \begin{macrocode}
  \caption@CheckCommand\@makecaption{%
    % scrartcl|scrreprt|scrbook [2007/03/07 v2.97a KOMA-Script document class]
    \long\def\@makecaption#1#2{%
      \if@captionabove
        \vskip\belowcaptionskip
      \else
        \vskip\abovecaptionskip
      \fi
      \@@makecaption\@firstofone{#1}{#2}%
      \if@captionabove
        \vskip\abovecaptionskip
      \else
        \vskip\belowcaptionskip
      \fi}}
%    \end{macrocode}
%    \begin{macrocode}
  \DeclareCaptionFormat{default}[#1#2#3\par]{%
    \ifdofullc@p
      \caption@ifin@list\caption@lsepcrlist\caption@lsepname
        {\caption@Error{%
           The option `labelsep=\caption@lsepname' does not work\MessageBreak
           with \noexpand\setcaphanging (which is set by default)}}%
        {\caption@fmt@hang{#1}{#2}{#3}}%
    \else
      #1#2%
      \ifdim\cap@indent<\z@
        \par
        \noindent\hspace*{-\cap@indent}%
      \else\if@capbreak
        \par
      \fi\fi
      #3\par
    \fi}
  \DeclareCaptionLabelSeparator{default}{\captionformat}
  \DeclareCaptionDefaultFont{font}{\scr@fnt@caption}
  \DeclareCaptionDefaultFont{labelfont}{\scr@fnt@captionlabel}
%    \end{macrocode}
%    \begin{macrocode}
}
%    \end{macrocode}
%
% \subsubsection{The \NTG{} Dutch classes}
% \changes{v1.1}{2007/04/06}{NTG classes support added}
%
% \begin{macro}{\caption@ifntgclass}
%    \begin{macrocode}
\providecommand*\caption@ifntgclass{%
  \caption@ifundefined\CaptionFonts\@gobble\@firstofone}
\@onlypreamble\caption@ifntgclass
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
\caption@ifntgclass{%
%    \end{macrocode}
%    \begin{macrocode}
  \caption@CheckCommand\@makecaption{%
    % artikel|rapport|boek [2004/06/07 v2.1a NTG LaTeX document class]
    \long\def\@makecaption#1#2{%
      \vskip\abovecaptionskip
      \sbox\@tempboxa{{\CaptionLabelFont#1:} \CaptionTextFont#2}%
      \ifdim \wd\@tempboxa >\hsize
        {\CaptionLabelFont#1:} \CaptionTextFont#2\par
      \else
        \global \@minipagefalse
        \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
      \fi
      \vskip\belowcaptionskip}}
%    \end{macrocode}
%    \begin{macrocode}
  \DeclareCaptionDefaultFont{labelfont}{\CaptionLabelFont}
  \DeclareCaptionDefaultFont{textfont}{\CaptionTextFont}
%    \end{macrocode}
%    \begin{macrocode}
}
%    \end{macrocode}
%
% \subsubsection{The thesis class}
% \changes{v1.2a}{2008/01/31}{thesis class support added}
% \changes{v1.2e}{2009/11/15}{Bugfix 09-11-14: thesis class support revised}
%
% \begin{macro}{\caption@ifthesisclass}
%    \begin{macrocode}
\providecommand*\caption@ifthesisclass{%
  \caption@ifundefined\cph@font{\@gobble}{\caption@ifundefined\cpb@font\@gobble\@firstofone}}
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
\caption@ifthesisclass{%
%    \end{macrocode}
%    \begin{macrocode}
  \caption@CheckCommand\@makecaption{%
    % thesis.cls 1996/25/01 1.0g LaTeX document class (wm).
    \long\def\@makecaption#1#2{%
     \vskip\abovecaptionskip
     \setbox\@tempboxa\hbox{{\cph@font #1:} {\cpb@font #2}}%
     \ifdim \wd\@tempboxa >\hsize
        \@hangfrom{\cph@font #1: }{\cpb@font #2\par}%
     \else
        \hbox to\hsize{\hfil\box\@tempboxa\hfil}%
     \fi
     \vskip\belowcaptionskip}}
%    \end{macrocode}
%    \begin{macrocode}
  \DeclareCaptionDefaultFormat{hang}
  \DeclareCaptionDefaultFont{labelfont}{\cph@font}
  \DeclareCaptionDefaultFont{textfont}{\cpb@font}
%    \end{macrocode}
%    \begin{macrocode}
}
%    \end{macrocode}
%
% \subsubsection{The frenchb Babel option}
% \changes{v1.1}{2006/05/14}{\package{frenchb} package support added}
%
%    \begin{macrocode}
\caption@ifundefined\FB@makecaption{}{%
%    \end{macrocode}
%    \begin{macrocode}
  \caption@CheckCommand\@makecaption{%
    % frenchb.ldf [2005/02/06 v1.6g French support from the babel system]
    % frenchb.ldf [2007/10/05 v2.0e French support from the babel system]
    \long\def\@makecaption#1#2{%
      \vskip\abovecaptionskip
      \sbox\@tempboxa{#1\CaptionSeparator #2}%
      \ifdim \wd\@tempboxa >\hsize
        #1\CaptionSeparator #2\par
      \else
        \global \@minipagefalse
        \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
      \fi
      \vskip\belowcaptionskip}}
%    \end{macrocode}
%    \begin{macrocode}
  \ifx\@makecaption\STD@makecaption
    \DeclareCaptionLabelSeparator{default}{\CaptionSeparator}
    \def\caption@frenchb{% supress frenchb warning
      \let\STD@makecaption\@makecaption
      \let\FB@makecaption\@makecaption}
  \else
    \ifx\@makecaption\@undefined\else
      \caption@InfoNoLine{%
        The definition of \protect\@makecaption\space
        has been changed,\MessageBreak
        frenchb will NOT customize it}%
    \fi
  \fi
%    \end{macrocode}
%    \begin{macrocode}
}
%    \end{macrocode}
%
% \subsubsection{The frenchle/pro package}
% \changes{v1.1}{2006/05/14}{\package{frenchle/pro} package support added}
%
%    \begin{macrocode}
\caption@ifundefined\frenchTeXmods{}{%
%    \end{macrocode}
%    \begin{macrocode}
  \caption@CheckCommand\@makecaption{%
    % french(le).sty [2006/10/03 The french(le) package /V5,9991/]
    % french(le).sty [2007/06/28 The french(le) package /V5,9994/]
    \def\@makecaption#1#2{%
      \ifFTY%
        \def\@secondofmany##1##2\void{##2}%
        \def\@tempa{\@secondofmany#2\void}%
        \ifx\@tempa\empty%
          \let\captionseparator\empty%
        \fi%
        \@mcORI{#1}{\relax\captionfont{#2}}%
      \else
        \@mcORI{#1}{#2}%
      \fi}}%
%    \end{macrocode}
%    \begin{macrocode}
  \caption@CheckCommand\@makecaption{%
    % french(le).sty [2007/02/11 The french(le) package /V5,9993/]
    \def\@makecaption#1#2{%
      \ifFTY%
        \def\@secondofmany##1##2\void{##2}%
        \protected@edef\@tempa{\@secondofmany#2\void}%
        \ifx\@tempa\empty%
          \let\captionseparator\empty%
        \fi%
        \@mcORI{#1}{\relax\captionfont{#2}}%
      \else
        \@mcORI{#1}{#2}%
      \fi}}%
%    \end{macrocode}
%    \begin{macrocode}
  \DeclareCaptionDefaultFont{textfont}{\itshape}%
  \DeclareCaptionLabelSeparator{default}{\captionseparator\space}%
%    \end{macrocode}
%    \begin{macrocode}
}
%    \end{macrocode}
%
% \subsubsection{The hungarian and magyar Babel option}
% \changes{v1.3}{2009/03/29}{\package{magyar} package support added}
% \changes{v1.3a}{2011/08/12}{\package{magyar} package support revised}
%
%    \begin{macrocode}
\DeclareCaptionListFormat{subperiod}{#2.}
%    \end{macrocode}
%
%    \begin{macrocode}
\caption@ifundefined\hunnewlabel{}{%
  \caption@CheckCommand\@makecaption{%
    % magyar.ldf [2005/03/30 v1.4j Magyar support from the babel system]
    \def\@makecaption#1#2{%
      \vskip\abovecaptionskip
      \sbox\@tempboxa{#1. #2}%
      \ifdim \wd\@tempboxa >\hsize
        {#1. #2\csname par\endcsname}
      \else
        \global \@minipagefalse
        \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
      \fi
      \vskip\belowcaptionskip}}}
%    \end{macrocode}
%
%    \begin{macrocode}
\def\caption@tempa#1{\@ifundefined{extras#1}{}{%
  \expandafter\addto\csname extras#1\endcsname{%
     % change default labelsep and listformat
     \caption@setdefaultlabelsep{period}%
     \caption@setdefaultlistformat{subperiod}}%
  \expandafter\addto\csname noextras#1\endcsname{%
     % change default labelsep and listformat
     \caption@setdefaultlabelsep{colon}%
     \caption@setdefaultlistformat{subsimple}}%
%    \end{macrocode}
%    \begin{macrocode}
}}
%    \end{macrocode}
%    \begin{macrocode}
\caption@tempa{hungarian}
\caption@tempa{magyar}
%    \end{macrocode}
%
% \subsubsection{Unknown document class (or package)}
% \changes{v1.1}{2007/04/10}{Check of document class added}
%
%    \begin{macrocode}
\caption@IfCheckCommand{%
  \caption@setbool{documentclass}{1}%
}{%
  \caption@setbool{documentclass}{0}%
  \caption@InfoNoLine{%
         Unknown document class (or package),\MessageBreak
         standard defaults will be used}%
  \caption@Debug{\string\@makecaption\space=\space\meaning\@makecaption\@gobble}%
}
%    \end{macrocode}
%
% \subsection{Execution of options}
%
%    \begin{macrocode}
\captionsetup{style=default,position=default,%
              list,listformat=default,twoside=\if@twoside 1\else 0\fi}
%    \end{macrocode}
%    \begin{macrocode}
\ProcessOptions*
%    \end{macrocode}
%
% \subsection{Making an `List of' entry}
%
% \begin{macro}{\caption@addcontentsline}
% \changes{v1.1}{2007/07/01}{This macro added}
% \changes{v1.3}{2010/10/26}{Error check added}
% \changes{v1.3}{2011/06/24}{Split into two macros}
%  |\caption@addcontentsline|\marg{type}\marg{list entry}\par
%  Makes an entry in the list-of-whatever, if requested,
%  i.e.~the argument \meta{list entry} is not empty and
%  |listof=| was set to |true|.
%    \begin{macrocode}
\newcommand*\caption@addcontentsline[2]{%
  \caption@iflist
    {\def\@tempa{#2}}%
    {\let\@tempa\@empty}%
  \ifx\@tempa\@empty \else
    {\let\\\space
      \@ifundefined{ext@#1}%
       {\caption@Error{No float type '#1' defined}}%
       {\caption@@addcontentsline
          {\csname ext@#1\endcsname}%
          {#1}%
          {\caption@lstfmt{\@nameuse{p@#1}}{\@nameuse{the#1}}}%
          {\ignorespaces #2}}}%
  \fi}
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\caption@@addcontentsline[4]{%
  \addcontentsline{#1}{#2}{\protect\numberline{#3}{#4}}}
%    \end{macrocode}
% \end{macro}
%
% \subsection{Typesetting the caption}
%
% \begin{macro}{\ifcaption@star}
% If the starred form of |\caption| is used, this will be set to |true|.
% (It will be reset to |false| at the end of |\caption@@make|.)
%    \begin{macrocode}
\newif\ifcaption@star
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@fnum}
% \changes{v1.1}{2007/08/21}{This macro added}
%  |\caption@fnum|\marg{float type}\par
%  Typesets the caption label; as replacement for |\fnum@|\meta{float type}.
%    \begin{macrocode}
\newcommand*\caption@fnum[1]{\caption@lfmt{\@nameuse{#1name}}{\@nameuse{the#1}}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@make}
%  |\caption@make|\marg{float name}\marg{ref.\ number}\marg{text}\par
%  Typesets the caption.
%    \begin{macrocode}
\newcommand\caption@make[2]{\caption@@make{\caption@lfmt{#1}{#2}}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@@make}
% \changes{v1.0b}{2004/05/16}{Bugfix 04-05-05: \cs{ifdim}\cs{captionindent=}\cs{z@} added}
% \changes{v1.0c}{2005/02/12}{Bugfix 04-10-26: Use \cs{@tempdima} instead of
%        \cs{captionmargin} resp. \cs{captionwidth}; check for \cs{z@} added}
% \changes{v1.0c}{2005/02/12}{Bugfix: \cs{hskip}\cs{captionmargin} to the end
%        of caption added}
% \changes{v1.0c}{2005/02/12}{Bugfix: \cs{strut} moved from here to \cs{caption@@@make}}
% \changes{v1.0c}{2005/02/12}{Single-line-check moved up so it can affect margins now}
% \changes{v1.0c}{2005/02/09}{Improvement: \cs{caption@ifh} added}
% \changes{v1.0c}{2005/02/09}{Bugfix: \cs{leavevmode} added}
% \changes{v1.0f}{2005/08/24}{Uses \cs{sbox} instead of \cs{setbox} in single-line-check}
% \changes{v1.0g}{2005/12/04}{Uses \cs{caption@slc} now}
% \changes{v1.0g}{2006/01/11}{Bugfix: \cs{caption@calcmargin} inside
%        single-line-check replaced by \cs{relax}}
% \changes{v1.0g}{2006/01/11}{Bugfix: \cs{caption@startbox} will always be
%        typeset in horizontal mode}
% \changes{v1.0i}{2006/05/13}{Uses \cs{caption@parbox} instead of \cs{caption@start/endbox}}
% \changes{v1.0j}{2007/01/04}{Oops, bugfix 04-05-05 got lost in v1.0h, re-added}
% \changes{v1.0n}{2007/04/03}{Usage of \cs{caption@ifoddpage} added}
% \changes{v1.1}{2007/07/29}{\cs{caption@calcmargin} moved below single-line-check}
% \changes{v1.1e}{2007/10/28}{\cs{caption@stepcounter} added}
%  |\caption@@make|\marg{caption label}\marg{caption text}
%    \begin{macrocode}
\newcommand\caption@@make[2]{%
  \begingroup
  \caption@stepcounter
  \caption@beginhook
%    \end{macrocode}
%
% Check margin, if |\caption@minmargin| or |\caption@maxmargin| is set
%    \begin{macrocode}
% TODO: Move this to \caption@calcmargin!?
  \ifx\caption@maxmargin\@undefined \else
    \ifdim\captionmargin>\caption@maxmargin\relax
      \captionmargin\caption@maxmargin\relax
    \fi
  \fi
  \ifx\caption@minmargin\@undefined \else
    \ifdim\captionmargin<\caption@minmargin\relax
      \captionmargin\caption@minmargin\relax
    \fi
  \fi
%    \end{macrocode}
%
% Special single-line treatment (option |singlelinecheck=|)
%    \begin{macrocode}
  \caption@ifslc{\caption@slc{#1}{#2}\captionwidth\relax}{}%
%    \end{macrocode}
%
% Typeset the left margin (option |margin=|)
%    \begin{macrocode}
  \caption@calcmargin
  \@tempdima\captionmargin
  \ifdim\captionmargin@=\z@ \else
    \caption@ifoddpage{}{\advance\@tempdima\captionmargin@}%
  \fi
  \caption@ifh{\advance\@tempdima\caption@indent}%
  \hspace\@tempdima
%    \end{macrocode}
%
% We actually use a |\vbox| of width |\captionwidth - \caption@indent|
% to typeset the caption.
% \Note{\cs{captionindent} is \emph{not} supported if the caption format
% was defined with \cs{DeclareCaptionFormat*}.}
%    \begin{macrocode}
  \@tempdima\captionwidth
  \caption@ifh{\advance\@tempdima-\caption@indent}%
  \caption@parbox\@tempdima{%
%    \end{macrocode}
%
% Typeset the indention (option |indention=|)\\
% {\small Bugfix 04-05-05:
%  |\hskip-\caption@indent| replaced by |\ifdim\caption@indent=\z@|\ldots}
%    \begin{macrocode}
    \caption@ifh{%
      \ifdim\caption@indent=\z@
        \leavevmode
      \else
        \hskip-\caption@indent
      \fi}%
%    \end{macrocode}
%
% Typeset the caption itself and close the |\caption@parbox|
%    \begin{macrocode}
    \caption@@@make{#1}{#2}}%
%    \end{macrocode}
%
% Typeset the right margin (option |margin=|)
%    \begin{macrocode}
  \@tempdima\captionmargin
  \ifdim\captionmargin@=\z@ \else
    \caption@ifoddpage{\advance\@tempdima\captionmargin@}{}%
  \fi
  \hspace\@tempdima
%    \end{macrocode}
%
%    \begin{macrocode}
  \caption@endhook
  \endgroup
%    \end{macrocode}
%
%    \begin{macrocode}
  \global\caption@starfalse}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@calcmargin}
% \changes{v1.0f}{2005/10/24}{Internal: \cs{ifcaption@width} replaced by
%        \cs{ifdim}\cs{captionwidth=}\cs{z@}}
% \changes{v1.0g}{2006/01/12}{Improvement: Takes care of list environment now}
% \changes{v1.1}{2006/05/13}{Check of \cs{@listdepth} removed (not necessary anymore),
%        use \cs{linewidth} instead of \cs{hsize}}
%  |\caption@calcmargin|\par
%  Calculate |\captionmargin| \& |\captionwidth|, so both contain valid
%  values.
%    \begin{macrocode}
\newcommand*\caption@calcmargin{%
  \caption@calcmargin@hook
  \ifdim\captionwidth=\z@
    \captionwidth\linewidth
    \advance\captionwidth by -2\captionmargin
    \advance\captionwidth by -\captionmargin@
  \else
    \captionmargin\linewidth
    \advance\captionmargin by -\captionwidth
    \divide\captionmargin by 2
    \captionmargin@\z@
  \fi
%    \end{macrocode}
%    \begin{macrocode}
  \caption@Debug{%
    \string\hsize=\the\hsize,
    \string\linewidth=\the\linewidth,\MessageBreak
    \string\leftmargin=\the\leftmargin,
    \string\rightmargin=\the\rightmargin,\MessageBreak
    \string\margin=\the\captionmargin,
    \string\margin@=\the\captionmargin@,
    \string\width=\the\captionwidth}%
%    \end{macrocode}
%    \begin{macrocode}
}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@slc}
% \changes{v1.1}{2007/06/13}{\cs{let}\cs{caption@hj}\cs{relax} added}
% \changes{v1.1}{2007/07/29}{\cs{caption@setup}\cs{caption@sls} added after \cs{begingroup}}
% \changes{v1.1}{2007/07/29}{\cs{caption@calcmargin} added}
% \changes{v1.1c}{2007/10/14}{Support of \cs{caption@slfmt} added}
% \changes{v1.1d}{2007/10/23}{`SingleLine' renamed to `singleline' for consistency}
% \changes{v1.3}{2010/09/04}{Split into \cs{caption@slc} and \cs{caption@@slc}}
%  |\caption@slc|\marg{label}\marg{text}\marg{width}\marg{extra code}\par
%  This one does the single-line-check.
%    \begin{macrocode}
\newcommand\caption@slc[4]{%
  \caption@@slc{#1}{#2}{#3}{\caption@singleline#4}{}}
%    \end{macrocode}
%    \begin{macrocode}
\newcommand\caption@@slc[5]{%
  \caption@Debug{Begin SLC}%
  \begingroup
  \caption@singleline
  \let\caption@hj\@empty
  \caption@calcmargin % calculate #3 if necessary
  \caption@prepareslc
  \sbox\@tempboxa{\caption@@@make{#1}{#2}}%
  \ifdim\wd\@tempboxa>#3%
    \endgroup
    #5%
  \else
    \endgroup
    #4%
  \fi
  \caption@Debug{End SLC}}
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\caption@singleline{%
  \caption@xsetup\caption@opt@singleline
  \let\caption@fmt\caption@slfmt}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@prepareslc}
% \changes{v1.0b}{2004/05/16}{Bugfix: Redefinition of \cs{label} \& \cs{@footnotetext} added}
% \changes{v1.0b}{2004/05/16}{Redefine \cs{stepcounter} instead of \cs{footnote(mark)}}
% \changes{v1.0c}{2005/02/12}{\cs{let}\cs{caption@hj}\cs{relax} added}
% \changes{v1.0f}{2005/07/09}{Support of \package{endnotes} package added}
% \changes{v1.1}{2007/06/13}{\cs{let}\cs{caption@hj}\cs{relax} moved to \cs{caption@slc}}
% \changes{v1.1}{2007/06/13}{Redefinition of \cs{(H@)refstepcounter} added}
% \changes{v1.1}{2007/08/12}{Redefinition of \cs{label} improved}
% \changes{v1.1c}{2007/10/06}{Definition of \cs{caption@l@stepcounter} added}
%  |\caption@prepareslc|\par
% \changes{v1.3}{2011/07/07}{Bugfix 11-07-06: Redefinition of \cs{footnote} and \cs{footnotemark} added, redefinition of \cs{stepcounter} and \cs{refstepcounter} dropped}
%  Re-define anything which would disturb the single-line-check.
%    \begin{macrocode}
\newcommand*\caption@prepareslc{%
  \def\label{\caption@withoptargs\@gobbletwo}%
%    \end{macrocode}
%    \begin{macrocode}
  \let\caption@footnote@ORI\footnote
  \def\footnote{\caption@withoptargs\caption@footnote}%
  \let\caption@footnotemark@ORI\footnotemark
  \def\footnotemark{\caption@withoptargs\caption@footnotemark}%
  \let\@footnotetext\@gobble
%    \end{macrocode}
%    \begin{macrocode}
  \let\@endnotetext\@gobble}
%    \end{macrocode}
%    \begin{macrocode}
\newcommand\caption@footnote[2]{%
  \begingroup
    \let\stepcounter\caption@l@stepcounter
    \caption@footnote@ORI#1{#2}%
  \endgroup}
\newcommand\caption@footnotemark[1]{%
  \begingroup
    \let\stepcounter\caption@l@stepcounter
    \caption@footnotemark@ORI#1%
  \endgroup}
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\caption@l@stepcounter[1]{%
  \advance\csname c@#1\endcsname\@ne\relax}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@parbox}
% \changes{v1.0i}{2006/05/13}{We define \cs{caption@parbox} instead of
%        \cs{caption@start/endbox}}
% \changes{v1.0l}{2006/03/09}{Bugfix 07-03-09: \cs{caption@parbox} changed from
%        \cs{parbox-t} to \cs{parbox-b}}
% \changes{v1.2}{2007/11/11}{Renamed from \cs{captionbox} to \cs{caption@parbox}}
%  |\caption@parbox|\marg{width}\marg{contents}\par
%  This macro defines the box which surrounds the caption paragraph.
%    \begin{macrocode}
\newcommand*\caption@parbox{\parbox[b]}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@applyfont}
% \changes{v1.3}{2010/09/04}{This macro added}
%  |\caption@applyfont|\par
%  This macro executes the font relevant macros, i.e. by default
%  the options set by |justification=|, |font=|, and |size=|.
%    \begin{macrocode}
\newcommand*\caption@applyfont{%
  \caption@hj\captionfont\captionsize}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@@@make}
% \changes{v1.0b}{2004/05/16}{Bugfix 04-05-06: \cs{allowhyphens} added}
% \changes{v1.0c}{2005/02/12}{Bugfix 04-12-16: Use some kind of
%        \cs{@startstrut}\cs{strutbox} instead of \cs{strut}}
% \changes{v1.0c}{2005/02/12}{Bugfix 05-01-23: \cs{@finalstrut}\cs{strutbox} added}
% \changes{v1.0d}{2005/05/05}{Use \cs{caption@ifempty};
%        \cs{let}\cs{caption@ifstrut}\cs{@secondoftwo} added}
% \changes{v1.0d}{2005/05/05}{Bugfix: Handling of \cs{ifcaption@star} changed}
% \changes{v1.0f}{2005/08/24}{Check for empty label added}
% \changes{v1.0f}{2005/08/25}{\cs{caption@iflf} added}
% \changes{v1.0j}{2007/02/18}{Usage of \cs{caption@tfmt} added}
% \changes{v1.1}{2007/05/07}{Bugfix: \cs{ifhmode} added to \cs{@finalstrut}}
% \changes{v1.2}{2007/11/17}{Made option \opt{size=} stronger than \opt{font=}}
% \changes{v1.3}{2010/09/04}{Uses \cs{caption@applyfont} now}
% \changes{v1.3}{2010/11/01}{Bugfix: If the caption text is empty, the text format will be set to \opt{simple} now}
%  |\caption@@@make|\marg{caption label}\marg{caption text}\par
%  This one finally typesets the caption paragraph, without margin and indention.
%    \begin{macrocode}
\newcommand\caption@@@make[2]{%
%    \end{macrocode}
%
% If the label is empty, we use no caption label separator.
%    \begin{macrocode}
  \sbox\@tempboxa{#1}%
  \ifdim\wd\@tempboxa=\z@
    \let\caption@lsep\relax
%   \@capbreakfalse
  \fi
%    \end{macrocode}
%
% If the text is empty, we use no caption label separator, too.
% (And no text format either.)
%    \begin{macrocode}
  \caption@ifempty{#2}{%
    \let\caption@lsep\@empty
    \let\caption@tfmt\@firstofone
%   \@capbreakfalse
%   \let\caption@ifstrut\@secondoftwo
  }%
%    \end{macrocode}
%
% Take care that |\caption@parindent| and |\caption@hangindent| will be used
% to typeset the paragraph.
%    \begin{macrocode}
  \@setpar{\@@par\caption@@par}\caption@@par
%    \end{macrocode}
%
% Finally typeset the caption.
%    \begin{macrocode}
  \caption@applyfont
  \caption@fmt
    {\ifcaption@star\else{\captionlabelfont#1}\fi}%
    {\ifcaption@star\else{\caption@iflf\captionlabelfont\caption@lsep}\fi}%
    {{\captiontextfont
      \caption@ifstrut{\vrule\@height\ht\strutbox\@width\z@}{}%
      \nobreak\hskip\z@skip % enable hyphenation
      \caption@tfmt{#2}%
%     \caption@ifstrut{\vrule\@height\z@\@depth\dp\strutbox\@width\z@}{}%
      \caption@ifstrut{\ifhmode\@finalstrut\strutbox\fi}{}%
      \par}}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@ifempty}
% \changes{v1.0d}{2005/05/05}{This macro added}
% \changes{v1.1}{2007/07/04}{Re-defines itself now}
% \changes{v1.2a}{2007/01/22}{Revised so \cs{label} will be detected, too}
% \changes{v1.2b}{2008/08/02}{Revised so \cs{index} and \cs{glossary} will be detected, too}
%  |\caption@ifempty|\marg{text}\marg{true} (\emph{no} \meta{false})\par
%  This one tests if the \meta{text} is actually empty.
%  \Note{This will be done without expanding the text,
%  therefore this is far away from being bullet-proof.}
%  \Note{This macro is re-defining itself so only
%  the first test (in a group) will actually be done.}
%    \begin{macrocode}
\newcommand\caption@ifempty[1]{%
  \caption@if@empty{#1}%
  \caption@ifempty\@unused}
%    \end{macrocode}
%    \begin{macrocode}
\newcommand\caption@if@empty[1]{%
  \def\caption@tempa{#1}%
  \ifx\caption@tempa\@empty
    \let\caption@ifempty\@secondoftwo
  \else
    \expandafter\def\expandafter\caption@tempa\expandafter{%
      \caption@car#1\caption@if@empty\caption@nil}%
    \def\caption@tempb{\caption@if@empty}%
    \ifx\caption@tempa\caption@tempb
      \let\caption@ifempty\@secondoftwo
    \else
      \def\caption@tempb{\ignorespaces}%
      \ifx\caption@tempa\caption@tempb
        \expandafter\caption@if@empty\expandafter{\@gobble#1}%
      \else
        \def\caption@tempb{\label}%
        \ifx\caption@tempa\caption@tempb
          \expandafter\caption@if@empty\expandafter{\@gobbletwo#1}%
        \else
          \def\caption@tempb{\index}%
          \ifx\caption@tempa\caption@tempb
            \expandafter\caption@if@empty\expandafter{\@gobbletwo#1}%
          \else
            \def\caption@tempb{\glossary}%
            \ifx\caption@tempa\caption@tempb
              \expandafter\caption@if@empty\expandafter{\@gobbletwo#1}%
            \else
              \let\caption@ifempty\@gobbletwo
            \fi
          \fi
        \fi
      \fi
    \fi
  \fi}
%    \end{macrocode}
%    \begin{macrocode}
\long\def\caption@car#1#2\caption@nil{#1}% same as \@car, but \long
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@@par}
% \changes{v1.0f}{2005/08/22}{Made this definition global}
%  |\caption@@par|\par
%  This command will be executed with every |\par| inside the caption.
%    \begin{macrocode}
\newcommand*\caption@@par{%
  \parindent\caption@parindent\hangindent\caption@hangindent}%
%    \end{macrocode}
% \end{macro}
%
% \subsection{Types \& sub-types}
%
% \begin{macro}{\DeclareCaptionType}
% \changes{v1.1}{2007/08/12}{This macro added}
% \changes{v1.1a}{2007/09/07}{Three optional arguments added}
% \changes{v1.2}{2007/12/06}{Renamed from \cs{DeclareFloatingEnvironment} to \cs{DeclareCaptionType}}
% \changes{v1.2}{2007/12/21}{Optional argument revised, uses key-value syntax now}
% \changes{v1.2b}{2008/04/13}{Uses \cs{caption@within@default} now}
% \changes{v1.2b}{2008/08/02}{Support of \cs{float@exts} and \cs{float@addtolists} added}
% \changes{v1.2e}{2010/01/09}{Usage of \cs{caption@DeclareWithinOption} added}
% \changes{v1.3}{2011/08/06}{Definition of \cs{listofXXXes} added}
%  |\DeclareCaptionType|\oarg{options}\marg{environment}\oarg{name}\oarg{list name}
%    \begin{macrocode}
\newcommand*\DeclareCaptionType{%
  \@testopt\@DeclareCaptionType{}}
\@onlypreamble\DeclareCaptionType
%    \end{macrocode}
%    \begin{macrocode}
\def\@DeclareCaptionType[#1]#2{%
  \def\caption@type{#2}%
  \caption@Debug{New type `#2'}%
  \newcounter{#2}\@namedef{theH#2}{}%
  \KV@caption@DCT@within\caption@within@default
  \caption@DeclareWithinOption{#2}%
  \KV@caption@DCT@placement{tbp}%
  \caption@ifundefined\c@float@type
    {\newcounter{float@type}%
     \setcounter{float@type}{\caption@ifundefined\c@figure14}}%
    {}%
  \caption@Debug{float type `#2'=\the\value{float@type}}%
  \expandafter\xdef\csname ftype@#2\endcsname{\the\value{float@type}}%
  \addtocounter{float@type}{\value{float@type}}%
  \KV@caption@DCT@fileext{lo#2}%
  \@namedef{fnum@#2}{\@nameuse{#2name}\nobreakspace\@nameuse{the#2}}%
  \newenvironment{#2}{\@float{#2}}{\end@float}%
  \newenvironment{#2*}{\@dblfloat{#2}}{\end@dblfloat}%
  \expandafter\newcommand\csname listof#2s\endcsname{\caption@listof{#2}}%
  \expandafter\newcommand\csname listof#2es\endcsname{\caption@listof{#2}}%
  \caption@ifundefined\l@figure
    {\@namedef{l@#2}{\@dottedtocline{1}{1.5em}{2.3em}}}%
    {\expandafter\let\csname l@#2\endcsname\l@figure}%
%    \end{macrocode}
%    \begin{macrocode}
  \expandafter\newcommand\csname #2name\endcsname{}%
  \edef\@tempa{\def\noexpand\@tempa{\@car#2\@nil}}%
  \uppercase\expandafter{\@tempa}%
  \edef\@tempb{\noexpand\g@addto@macro\noexpand\@tempa{\@cdr#2\@nil}}%
  \@tempb
  \expandafter\let\csname #2name\endcsname\@tempa
  \expandafter\newcommand\csname list#2name\endcsname{}%
  \expandafter\xdef\csname list#2name\endcsname{List of \@tempa s}%
%    \end{macrocode}
%    \begin{macrocode}
  \@cons\caption@typelist{{#2}}%
  \caption@setkeys[caption]{caption@DCT}{#1}%
%    \end{macrocode}
%    \begin{macrocode}
  \caption@ifundefined\float@exts{\newtoks\float@exts}{}%
  \let\float@do=\relax
  \edef\@tempa{\noexpand\float@exts{\the\float@exts\float@do{\@nameuse{ext@#2}}}}%
  \@tempa
  \caption@ifundefined\float@addtolists{%
    \newcommand\float@addtolists[1]{%
      \def\float@do####1{\addtocontents{####1}{##1}}\the\float@exts}%
    \caption@ifundefined\@chapter{}{\caption@PatchChapter}}{}%
%    \end{macrocode}
%    \begin{macrocode}
  \@ifnextchar[\@@DeclareCaptionType\relax}
\@onlypreamble\@DeclareCaptionType
%    \end{macrocode}
%    \begin{macrocode}
\def\@@DeclareCaptionType[#1]{%
  \KV@caption@DCT@name{#1}%
  \@ifnextchar[\@@@DeclareCaptionType\relax}
\@onlypreamble\@@DeclareCaptionType
%    \end{macrocode}
%    \begin{macrocode}
\def\@@@DeclareCaptionType[#1]{%
  \KV@caption@DCT@listname{#1}}
\@onlypreamble\@@@DeclareCaptionType
%    \end{macrocode}
%    \begin{macrocode}
\let\DeclareFloatingEnvironment\DeclareCaptionType % alternative command name
\@onlypreamble\DeclareFloatingEnvironment
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@within@default}
% \changes{v1.2b}{2008/04/13}{This macro added}
%  The default `within' value.
%    \begin{macrocode}
\newcommand*\caption@within@default{\caption@ifundefined\c@chapter{none}{chapter}}
\@onlypreamble\caption@within@default
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@listof}
% \changes{v1.2}{2007/12/21}{This macro added}
% |\caption@listof|\marg{float type}
%    \begin{macrocode}
\newcommand*\caption@listof[1]{%
  \begingroup
    \expandafter\let\expandafter\listfigurename\csname list#1name\endcsname
    \expandafter\let\expandafter\ext@figure\csname ext@#1\endcsname
    \let\caption@ORI@starttoc\@starttoc
    \renewcommand*\@starttoc[1]{%
      \expandafter\caption@ORI@starttoc\expandafter{\ext@figure}}%
    \listoffigures
  \endgroup}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@typelist}
% An \cs{@elt}-list containing the caption types defined
% with |\Declare|\x|Caption|\x|Type|.
%    \begin{macrocode}
\newcommand*\caption@typelist{}
%    \end{macrocode}
% \end{macro}
%
% The available \meta{options} are:
% |fileext=|\meta{file extension},
% |listname=|\meta{list name},
% |name=|\meta{prosa name},
% |placement=|\meta{htbp},
% |within=|\meta{none,chapter,section}, and
% |without|.
%    \begin{macrocode}
\define@key{caption@DCT}{fileext}{\@namedef{ext@\caption@type}{#1}}
\@onlypreamble@key{caption@DCT}{fileext}
\define@key{caption@DCT}{listname}{\@namedef{list\caption@type name}{#1}}
\@onlypreamble@key{caption@DCT}{listname}
\define@key{caption@DCT}{name}{\@namedef{\caption@type name}{#1}}
\@onlypreamble@key{caption@DCT}{name}
\define@key{caption@DCT}{placement}{\@namedef{fps@\caption@type}{#1}}
\@onlypreamble@key{caption@DCT}{placement}
\define@key{caption@DCT}{within}{%
  \caption@ifundefined\c@chapter{}{\@removefromreset\caption@type{chapter}}%
  \@removefromreset\caption@type{section}%
  \begingroup
    \caption@setkeys[caption]{caption@within}{#1}%
  \endgroup}
%\@onlypreamble@key{caption@DCT}{within}
\define@key{caption@DCT}{without}{\KV@caption@DCT@within{none}}
%\@onlypreamble@key{caption@DCT}{without}
%    \end{macrocode}
% \changes{v1.2d}{2009/03/29}{Bugfix 08-09-25: \texttt{within=section} fixed}
%    \begin{macrocode}
\define@key{caption@within}{none}[]{%
  \caption@within{}{}}
%\@onlypreamble@key{caption@within}{none}
\define@key{caption@within}{section}[]{%
  \@addtoreset\caption@type{section}%
  \caption@within{\ifnum\c@section>\z@ \thesection.\fi}{\theHsection.}}
%\@onlypreamble@key{caption@within}{section}
\caption@ifundefined\c@chapter{}{%
  \define@key{caption@within}{chapter}[]{%
    \@addtoreset\caption@type{chapter}%
    \caption@within{\ifnum\c@chapter>\z@ \thechapter.\fi}{\theHchapter.}}
}%  \@onlypreamble@key{caption@within}{chapter}}
%    \end{macrocode}
% \begin{macro}{\caption@within}
% \changes{v1.2}{2007/12/21}{This macro added}
% |\caption@within|\marg{thecode}\marg{theHcode}
%    \begin{macrocode}
\newcommand*\caption@within{%
  \expandafter\caption@within@\expandafter{\caption@type}}
%\@onlypreamble\caption@within
\newcommand*\caption@within@[3]{%
  \global\@namedef{the#1}{#2\arabic{#1}}%
  \@ifundefined{theH#1}\caption@AtBeginDocument\@firstofone
    {\global\@namedef{theH#1}{#3\arabic{#1}}}}
%\@onlypreamble\caption@within@
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@removefromreset}
% \changes{v1.2}{2007/12/21}{This macro added}
% This code was taken from the \package{remreset} package
% which is part of the `carlisle' package bundle.
% (Copyright 1997 David Carlisle)
%    \begin{macrocode}
\providecommand*\@removefromreset[2]{{%
  \expandafter\let\csname c@#1\endcsname\@removefromreset
  \def\@elt##1{%
    \expandafter\ifx\csname c@##1\endcsname\@removefromreset
    \else
      \noexpand\@elt{##1}%
    \fi}%
  \expandafter\xdef\csname cl@#2\endcsname{%
    \csname cl@#2\endcsname}}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@PatchChapter}
% \changes{v1.2b}{2008/08/02}{This macro added}
% We try to patch \cs{@chapter} so \cs{float@addtolists} will be supported.
% (Note: The \KOMAScript\ classes already support \cs{float@addtolists}.)
%    \begin{macrocode}
\newcommand*\caption@PatchChapter{%
  \providecommand*\@chapterlistsgap{10\p@}%
%    \end{macrocode}
%    \begin{macrocode}
  % report.cls [2005/09/16 v1.4f Standard LaTeX document class]
  \caption@patch@chapter{report}{%
    \ifnum \c@secnumdepth >\m@ne
      \refstepcounter{chapter}%
      \typeout{\@chapapp\space\thechapter.}%
      \addcontentsline{toc}{chapter}%
        {\protect\numberline{\thechapter}##1}%
    \else
      \addcontentsline{toc}{chapter}{##1}%
    \fi
    \chaptermark{##1}%
    \addtocontents{lof}{\protect\addvspace{10\p@}}%
    \addtocontents{lot}{\protect\addvspace{10\p@}}%
    \if@twocolumn
      \@topnewpage[\@makechapterhead{##2}]%
    \else
      \@makechapterhead{##2}%
      \@afterheading
    \fi
  }{%
    \ifnum \c@secnumdepth >\m@ne
      \refstepcounter{chapter}%
      \typeout{\@chapapp\space\thechapter.}%
      \addcontentsline{toc}{chapter}%
        {\protect\numberline{\thechapter}##1}%
    \else
      \addcontentsline{toc}{chapter}{##1}%
    \fi
    \chaptermark{##1}%
    \ifdim \@chapterlistsgap>\z@
      \addtocontents{lof}{\protect\addvspace{\@chapterlistsgap}}%
      \addtocontents{lot}{\protect\addvspace{\@chapterlistsgap}}%
      \float@addtolists{\protect\addvspace{\@chapterlistsgap}}%
    \fi
    \if@twocolumn
      \@topnewpage[\@makechapterhead{##2}]%
    \else
      \@makechapterhead{##2}%
      \@afterheading
    \fi}%
%    \end{macrocode}
%    \begin{macrocode}
  % book.cls [2005/09/16 v1.4f Standard LaTeX document class]
  \caption@patch@chapter{book}{%
    \ifnum \c@secnumdepth >\m@ne
      \if@mainmatter
        \refstepcounter{chapter}%
        \typeout{\@chapapp\space\thechapter.}%
        \addcontentsline{toc}{chapter}%
          {\protect\numberline{\thechapter}##1}%
      \else
        \addcontentsline{toc}{chapter}{##1}%
      \fi
    \else
      \addcontentsline{toc}{chapter}{##1}%
    \fi
    \chaptermark{##1}%
    \addtocontents{lof}{\protect\addvspace{10\p@}}%
    \addtocontents{lot}{\protect\addvspace{10\p@}}%
    \if@twocolumn
      \@topnewpage[\@makechapterhead{##2}]%
    \else
      \@makechapterhead{##2}%
      \@afterheading
    \fi
  }{%
    \ifnum \c@secnumdepth >\m@ne
      \if@mainmatter
        \refstepcounter{chapter}%
        \typeout{\@chapapp\space\thechapter.}%
        \addcontentsline{toc}{chapter}%
          {\protect\numberline{\thechapter}##1}%
      \else
        \addcontentsline{toc}{chapter}{##1}%
      \fi
    \else
      \addcontentsline{toc}{chapter}{##1}%
    \fi
    \chaptermark{##1}%
    \ifdim \@chapterlistsgap>\z@
      \addtocontents{lof}{\protect\addvspace{\@chapterlistsgap}}%
      \addtocontents{lot}{\protect\addvspace{\@chapterlistsgap}}%
      \float@addtolists{\protect\addvspace{\@chapterlistsgap}}%
    \fi
    \if@twocolumn
      \@topnewpage[\@makechapterhead{##2}]%
    \else
      \@makechapterhead{##2}%
      \@afterheading
    \fi}%
%    \end{macrocode}
%    \begin{macrocode}
  % amsbook.cls [2004/08/06 v2.20]
  % smfbook.cls [1999/11/15 v1.2f Classe LaTeX pour les monographies editees par la SMF]
  \caption@patch@chapter{ams/smfbook}{%
    \refstepcounter{chapter}%
    \ifnum\c@secnumdepth<\z@ \let\@secnumber\@empty
    \else \let\@secnumber\thechapter \fi
    \typeout{\chaptername\space\@secnumber}%
    \def\@toclevel{0}%
    \ifx\chaptername\appendixname \@tocwriteb\tocappendix{chapter}{##2}%
    \else \@tocwriteb\tocchapter{chapter}{##2}\fi
    \chaptermark{##1}%
    \addtocontents{lof}{\protect\addvspace{10\p@}}%
    \addtocontents{lot}{\protect\addvspace{10\p@}}%
    \@makechapterhead{##2}\@afterheading
  }{%
    \refstepcounter{chapter}%
    \ifnum\c@secnumdepth<\z@ \let\@secnumber\@empty
    \else \let\@secnumber\thechapter \fi
    \typeout{\chaptername\space\@secnumber}%
    \def\@toclevel{0}%
    \ifx\chaptername\appendixname \@tocwriteb\tocappendix{chapter}{##2}%
    \else \@tocwriteb\tocchapter{chapter}{##2}\fi
    \chaptermark{##1}%
    \ifdim \@chapterlistsgap>\z@
      \addtocontents{lof}{\protect\addvspace{\@chapterlistsgap}}%
      \addtocontents{lot}{\protect\addvspace{\@chapterlistsgap}}%
      \float@addtolists{\protect\addvspace{\@chapterlistsgap}}%
    \fi
    \@makechapterhead{##2}\@afterheading}%
%    \end{macrocode}
%    \begin{macrocode}
  % scrreprt/scrbook.cls
  \caption@ifundefined\KOMAClassName{}{%
    \caption@Debug{document class `\KOMAClassName' detected}%
  	\let\caption@patch@chapter\@gobblethree}%
%    \end{macrocode}
%    \begin{macrocode}
  % rapport1/3.cls [2004/06/07 v2.1a NTG LaTeX document class]
  \caption@patch@chapter{rapport}{%
    \ifnum \c@secnumdepth >\m@ne
      \refstepcounter{chapter}%
      \typeout{\@chapapp\space\thechapter.}%
      \addcontentsline{toc}{chapter}%
        {\protect\numberline{\thechapter}\toc@font0 ##1}%
    \else
      \addcontentsline{toc}{chapter}{\toc@font0 ##1}%
    \fi
    \chaptermark{##1}%
    \addtocontents{lof}{\protect\addvspace{10\p@}}%
    \addtocontents{lot}{\protect\addvspace{10\p@}}%
    \if@twocolumn
      \@topnewpage[\@makechapterhead{##2}]%
    \else
      \@makechapterhead{##2}%
      \@afterheading
    \fi
  }{%
    \ifnum \c@secnumdepth >\m@ne
      \refstepcounter{chapter}%
      \typeout{\@chapapp\space\thechapter.}%
      \addcontentsline{toc}{chapter}%
        {\protect\numberline{\thechapter}\toc@font0 ##1}%
    \else
      \addcontentsline{toc}{chapter}{\toc@font0 ##1}%
    \fi
    \chaptermark{##1}%
    \ifdim \@chapterlistsgap>\z@
      \addtocontents{lof}{\protect\addvspace{\@chapterlistsgap}}%
      \addtocontents{lot}{\protect\addvspace{\@chapterlistsgap}}%
      \float@addtolists{\protect\addvspace{\@chapterlistsgap}}%
    \fi
    \if@twocolumn
      \@topnewpage[\@makechapterhead{##2}]%
    \else
      \@makechapterhead{##2}%
      \@afterheading
    \fi}%
%    \end{macrocode}
%    \begin{macrocode}
  % boek(3).cls [2004/06/07 v2.1a NTG LaTeX document class]
  \caption@patch@chapter{boek}{%
    \ifnum \c@secnumdepth >\m@ne
      \if@mainmatter
        \refstepcounter{chapter}%
        \typeout{\@chapapp\space\thechapter.}%
        \addcontentsline{toc}{chapter}%
          {\protect\numberline{\thechapter}\toc@font0 ##1}%
      \else
        \addcontentsline{toc}{chapter}{\toc@font0 ##1}%
      \fi
    \else
      \addcontentsline{toc}{chapter}{\toc@font0 ##1}%
    \fi
    \chaptermark{##1}%
    \addtocontents{lof}{\protect\addvspace{10\p@}}%
    \addtocontents{lot}{\protect\addvspace{10\p@}}%
    \if@twocolumn
      \@topnewpage[\@makechapterhead{##2}]%
    \else
      \@makechapterhead{##2}%
      \@afterheading
    \fi
  }{%
    \ifnum \c@secnumdepth >\m@ne
      \if@mainmatter
        \refstepcounter{chapter}%
        \typeout{\@chapapp\space\thechapter.}%
        \addcontentsline{toc}{chapter}%
          {\protect\numberline{\thechapter}\toc@font0 ##1}%
      \else
        \addcontentsline{toc}{chapter}{\toc@font0 ##1}%
      \fi
    \else
      \addcontentsline{toc}{chapter}{\toc@font0 ##1}%
    \fi
    \chaptermark{##1}%
    \ifdim \@chapterlistsgap>\z@
      \addtocontents{lof}{\protect\addvspace{\@chapterlistsgap}}%
      \addtocontents{lot}{\protect\addvspace{\@chapterlistsgap}}%
      \float@addtolists{\protect\addvspace{\@chapterlistsgap}}%
    \fi
    \if@twocolumn
      \@topnewpage[\@makechapterhead{##2}]%
    \else
      \@makechapterhead{##2}%
      \@afterheading
    \fi}%
%    \end{macrocode}
%    \begin{macrocode}
  % thesis.cls [1996/25/01 1.0g LaTeX document class (wm).]
  \caption@patch@chapter{thesis}{%
    \ifnum \c@secnumdepth >\m@ne
      \if@mainmatter
        \refstepcounter{chapter}%
        \typeout{\chaptername\space\thechapter.}
        \if@thema
          \ifx\@shortauthor\@empty
            \addcontentsline{toc}{chapter}{%
            \protect\numberline{\thechapter.}##1}%
          \else
            \addcontentsline{toc}{chapter}{%
            \protect\numberline{\thechapter.}%
            \@shortauthor\hfill\mbox{}\vskip\normallineskip ##1}%
          \fi
        \else
          \addcontentsline{toc}{chapter}{%
          \protect\numberline{\thechapter.}##1}%
        \fi
      \else
        \addcontentsline{toc}{chapter}{##1}
      \fi
    \else
      \addcontentsline{toc}{chapter}{##1}
    \fi
    \chaptermark{##1}
    \addtocontents{lof}{\protect\addvspace{10pt}}
    \addtocontents{lot}{\protect\addvspace{10pt}}
    \if@twocolumn
      \@topnewpage[\@makechapterhead{##2}]
    \else
      \@makechapterhead{##2}
      \@afterheading
    \fi
  }{%
    \ifnum \c@secnumdepth >\m@ne
      \if@mainmatter
        \refstepcounter{chapter}%
        \typeout{\chaptername\space\thechapter.}%
        \if@thema
          \ifx\@shortauthor\@empty
            \addcontentsline{toc}{chapter}{%
            \protect\numberline{\thechapter.}##1}%
          \else
            \addcontentsline{toc}{chapter}{%
            \protect\numberline{\thechapter.}%
            \@shortauthor\hfill\mbox{}\vskip\normallineskip ##1}%
          \fi
        \else
          \addcontentsline{toc}{chapter}{%
          \protect\numberline{\thechapter.}##1}%
        \fi
      \else
        \addcontentsline{toc}{chapter}{##1}%
      \fi
    \else
      \addcontentsline{toc}{chapter}{##1}%
    \fi
    \chaptermark{##1}%
    \ifdim \@chapterlistsgap>\z@
      \addtocontents{lof}{\protect\addvspace{\@chapterlistsgap}}%
      \addtocontents{lot}{\protect\addvspace{\@chapterlistsgap}}%
      \float@addtolists{\protect\addvspace{\@chapterlistsgap}}%
    \fi
    \if@twocolumn
      \@topnewpage[\@makechapterhead{##2}]%
    \else
      \@makechapterhead{##2}%
      \@afterheading
    \fi}%
%    \end{macrocode}
%    \begin{macrocode}
  \ifx\caption@patch@chapter\@gobblethree \else
    \caption@Debug{%
      Unsupported document class detected,\MessageBreak
      or \noexpand\@chapter was redefined by another package}%
  \fi
  \let\caption@PatchChapter\@undefined}
%\@onlypreamble\caption@PatchChapter
%    \end{macrocode}
%    \begin{macrocode}
\newcommand\caption@patch@chapter[3]{%
  \begingroup
%   \let\if@twocolumn\iffalse
    \let\if@mainmatter\iffalse
    \let\if@thema\iffalse
    \def\@tempa[##1]##2{#2}%
    \ifx\@tempa\@chapter
      \caption@Debug{document class `#1' detected}%
      \gdef\@chapter[##1]##2{#3}%
      \global\let\caption@patch@chapter\@gobblethree
    \fi
  \endgroup}
%\@onlypreamble\caption@patch@chapter
%    \end{macrocode}
%    \begin{macrocode}
\long\def \@gobblethree #1#2#3{}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@stpelt}
% We patch \cs{@stpelt} so a list of `connected' counters will be reset, too.
% (Like \cs{stepcounter} does in |ltcounts.dtx|.)
%    \begin{macrocode}
\newcommand*\caption@patch@stpelt{%
  \let\caption@stpelt\@stpelt
  \def\@stpelt##1{%
    \caption@stpelt{##1}%
    \begingroup
      \let\@elt\caption@stpelt
      \csname caption@cl@##1\endcsname
    \endgroup}%
  \let\caption@patch@stpelt\relax}
\@onlypreamble\caption@patch@stpelt
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@addtoreset}
% \changes{v1.2d}{2009/10/09}{This macro added}
% Like \cs{@addtoreset} from |ltcounts.dtx|
%    \begin{macrocode}
\newcommand*\caption@addtoreset[2]{%
  \caption@patch@stpelt
  \@ifundefined{caption@cl@#2}{\@namedef{caption@cl@#2}{}}{}%
  \expandafter\@cons\csname caption@cl@#2\endcsname{{#1}}}
\@onlypreamble\caption@addtoreset
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@addtoreset}
% \changes{v1.2d}{2009/10/09}{This macro added}
% Like \cs{@removefromreset} from |remreset.sty|
%    \begin{macrocode}
\newcommand*\caption@removefromreset[2]{%
  \begingroup
    \expandafter\let\csname c@#1\endcsname\caption@removefromreset
    \def\@elt##1{%
      \expandafter\ifx\csname c@##1\endcsname\caption@removefromreset
      \else
        \noexpand\@elt{##1}%
      \fi}%
    \expandafter\xdef\csname caption@cl@#2\endcsname{%
      \csname caption@cl@#2\endcsname}%
  \endgroup}
\@onlypreamble\caption@removefromreset
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\DeclareCaptionSubType}
% \changes{v1.2}{2007/11/16}{This macro added}
% \changes{v1.2a}{2008/03/11}{Bugfix: \cs{subfigurename} will be defined now}
% \changes{v1.2d}{2009/10/09}{Bugfix 08-10-01: Usage of \cs{caption@addtoreset} added}
% \changes{v1.3}{2011/01/01}{\cs{@dottedlofline} will be defined \& used now}
%  |\DeclareCaptionSubType|\oarg{numbering scheme}\marg{type}\\
%  |\DeclareCaptionSubType*|\oarg{numbering scheme}\marg{type}\par
%  The starred variant provides the numbering format
%  \meta{type}|.|\meta{subtype} while the non-starred variant simply
%  uses \meta{subtype}.
%    \begin{macrocode}
\newcommand*\DeclareCaptionSubType{%
  \caption@teststar\caption@declaresubtype\@firstoftwo\@secondoftwo}
\@onlypreamble\DeclareCaptionSubType
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\caption@declaresubtype[1]{%
  \@testopt{\caption@@declaresubtype{#1}}{alph}}
\@onlypreamble\caption@declaresubtype
%    \end{macrocode}
%    \begin{macrocode}
\def\caption@@declaresubtype#1[#2]#3{%
  \@ifundefined{c@#3}%
    {\caption@Error{No float type '#3' defined}}%
%    \end{macrocode}
%    \begin{macrocode}
    {\@ifundefined{c@sub#3}%
       {\caption@Debug{New subtype `sub#3'}%
        \newcounter{sub#3}%
        \caption@addtoreset{sub#3}{#3}%
        \@namedef{ext@sub#3}{\csname ext@#3\endcsname}%
        \caption@declaresublistentry{#3}%
        \@cons\caption@subtypelist{{#3}}}%
       {\caption@Debug{Modify caption `sub#3'}}%
%    \end{macrocode}
%    \begin{macrocode}
     \@namedef{sub#3name}{}%
     \@namedef{sub#3autorefname}{\csname #3name\endcsname}%
     #1% is \@firstoftwo in star form, and \@secondoftwo otherwise
     {\@namedef{p@sub#3}{}%
      \@namedef{thesub#3}{\csname the#3\endcsname.\@nameuse{#2}{sub#3}}}%
     {\@namedef{p@sub#3}{\csname the#3\endcsname}%
      \@namedef{thesub#3}{\@nameuse{#2}{sub#3}}}%
     \@namedef{theHsub#3}{\csname theH#3\endcsname.\arabic{sub#3}}%
    }}
%    \end{macrocode}
%    \begin{macrocode}
\@onlypreamble\caption@@declaresubtype
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\caption@declaresublistentry{%
  \caption@ifundefined\l@chapter
    {\caption@@declaresublistentry\l@subsubsection}%
    {\caption@@declaresublistentry\l@subsection}}
\@onlypreamble\caption@declaresublistentry
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\caption@@declaresublistentry[2]{%
  \ifx#1\@undefined
    \caption@@@declaresublistentry\relax\@dottedtocline\caption@nil{#2}%
  \else
    \expandafter\caption@@@declaresublistentry#1{}{}\@dottedtocline\caption@nil{#2}%
  \fi}
\@onlypreamble\caption@@declaresublistentry
%    \end{macrocode}
%    \begin{macrocode}
\long\def\caption@@@declaresublistentry#1\@dottedtocline#2\caption@nil#3{%
  \def\@tempa{#1}%
% Does \l@(sub)subsection start with \@dottedtocline?
  \ifx\@tempa\@empty
% Yes
    \caption@@@@declaresublistentry{#3}#2\caption@nil
  \else
% No
    \caption@@@@declaresublistentry{#3}@{3.8em}{3.2em}\caption@nil
  \fi}
\@onlypreamble\caption@@@declaresublistentry
%    \end{macrocode}
%    \begin{macrocode}
\def\caption@@@@declaresublistentry#1#2#3#4#5\caption@nil{%
  \expandafter\caption@@@@@declaresublistentry\expandafter
    {\csname @dotted\csname ext@#1\endcsname line\endcsname}{#1}{#3}{#4}}
\@onlypreamble\caption@@@@declaresublistentry
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\caption@@@@@declaresublistentry[4]{%
  \@namedef{l@sub#2}{#1{2}{#3}{#4}}%
  \caption@@@@@@declaresublistentry#1{c@\csname ext@#2\endcsname depth}}
\@onlypreamble\caption@@@@@declaresublistentry
%    \end{macrocode}
%    \begin{macrocode}
\newcommand*\caption@@@@@@declaresublistentry[2]{
  \ifx#1\relax
    \def#1##1{%
      \def\next{\@dottedtocline{##1}}%
      \@ifundefined{#2}{}{%
        \ifnum ##1>\@nameuse{#2}\relax
          \let\next\@gobblefour
        \fi}%
      \next}%
  \fi}
\@onlypreamble\caption@@@@@@declaresublistentry
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@subtypelist}
% An \cs{@elt}-list containing the subtypes defined
% with |\Declare|\x|Caption|\x|Sub|\x|Type|.
%    \begin{macrocode}
\newcommand*\caption@subtypelist{}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\caption@For}
% \changes{v1.1a}{2007/09/07}{This macro added}
% \changes{v1.2}{2007/11/16}{Renamed from \cs{ForFloatingEnvironments} to \cs{caption@For}}
%  |\caption@For|\marg{elt-list}\marg{code with \#1}\\
%  |\caption@For*|\marg{elt-list}\marg{code with \#1}
%    \begin{macrocode}
\newcommand*\caption@For{\caption@withoptargs\caption@@For}
%\@onlypreamble\caption@For
%    \end{macrocode}
%    \begin{macrocode}
\newcommand\caption@@For[3]{%
  \caption@AtBeginDocument#1{%
    \def\@elt##1{#3}%
    \@nameuse{caption@#2}%
    \let\@elt\relax}}%
%\@onlypreamble\caption@@For
%    \end{macrocode}
% \end{macro}
%
% \subsection{subfig package adaptions}
% \changes{v1.0i}{2007/01/07}{Very small bugfix of \package{subfig} package added}
% \changes{v1.0j}{2007/01/31}{Bugfix of subfig package moved from package}
% \changes{v1.1}{2007/07/07}{Several adaptions to the \package{subfig} package added}
% \changes{v1.2e}{2010/01/09}{Patch for better hyperref support added to \package{subfig} package adaptions}
% \changes{v1.2f}{2010/01/14}{Latest patch didn't worked without hyperref; fixed}
% \changes{v1.3}{2010/12/20}{subfig package bugfixes dropped}
%
% We have to make several adaptions to \thispackage~\version{1.1} here.
%    \begin{macrocode}
\caption@AtBeginDocument{%
  \def\@tempa{\@ifstar\sf@@subref\sf@subref}%
  \ifx\subref\@tempa
    \caption@InfoNoLine{subfig package 1.2 or 1.3 is loaded}%
%    \end{macrocode}
%    \begin{macrocode}
    \let\caption@setfloattype\@gobble
    \let\@dottedxxxline\sf@NEW@dottedxxxline
    \let\sf@subfloat\sf@NEW@subfloat
%    \end{macrocode}
%    \begin{macrocode}
  \fi
  \let\sf@NEW@dottedxxxline\@undefined
  \let\sf@NEW@subfloat\@undefined}
%    \end{macrocode}
%    \begin{macrocode}
\def\sf@NEW@dottedxxxline#1#2#3#4#5#6#7{%
  \begingroup
    \caption@setfloattype{#1}%
    \caption@setoptions{subfloat}%
    \caption@setoptions{sub#1}%
    \ifnum #3>\@nameuse{c@#2depth}\else
      \@dottedtocline{\z@}{#4}{#5}{#6}{#7}%
    \fi
  \endgroup}
%    \end{macrocode}
%    \begin{macrocode}
\def\sf@NEW@subfloat{%
  \begingroup
    \caption@setfloattype\@captype
    \sf@ifpositiontop{%
      \maincaptiontoptrue
    }{%
      \maincaptiontopfalse
    }%
    \caption@setoptions{subfloat}%
    \caption@setoptions{sub\@captype}%
    \let\sf@oldlabel=\label
    \let\label=\subfloat@label
    \ifmaincaptiontop\else
      \advance\@nameuse{c@\@captype}\@ne
    \fi
    \refstepcounter{sub\@captype}%
    \setcounter{sub\@captype @save}{\value{sub\@captype}}%
    \@ifnextchar [%  %] match left bracket
      {\sf@@subfloat}%
      {\sf@@subfloat[\@empty]}}
%    \end{macrocode}
%
% \iffalse
%</package>
% \fi
%
% \clearpage
% \begin{thebibliography}{99}
%   \bibitem{Anne}
%   Anne Br\"uggemann-Klein:\\
%   \emph{Einf\"uhrung in die Dokumentverarbeitung},\\
%   B.G. Teubner, Stuttgart, 1989
%
%   \bibitem{hyperref}
%   Sebastian Rahtz \& Heiko Oberdiek:\\
%   \href{http://tug.ctan.org/tex-archive/macros/latex/contrib/hyperref/}%
%        {\emph{Hypertext marks in \LaTeX}},\\
%   November 12, 2007
%
%   \bibitem{refcount}
%   Heiko Oberdiek:\\
%   \href{ftp://ctan.tug.org/tex-archive/macros/latex/contrib/oberdiek/refcount.pdf}%
%        {\emph{The refcount package}},\\
%   2006/02/20
%
%   \bibitem{threeparttable}
%   Donald Arseneau:\\
%   \href{http://tug.ctan.org/tex-archive/macros/latex/contrib/misc/}%
%        {\emph{Three part tables: title, tabular environment, notes}},\\
%   2003/06/13
% \end{thebibliography}
%
% \iffalse
% --------------------------------------------------------------------------- %
% \fi
%
% \clearpage
% \Finale
%
\endinput
