diff options
Diffstat (limited to 'macros/latex/contrib/caption/fallback/v3.5/caption3.dtx')
-rw-r--r-- | macros/latex/contrib/caption/fallback/v3.5/caption3.dtx | 4680 |
1 files changed, 4680 insertions, 0 deletions
diff --git a/macros/latex/contrib/caption/fallback/v3.5/caption3.dtx b/macros/latex/contrib/caption/fallback/v3.5/caption3.dtx new file mode 100644 index 0000000000..5918f4a540 --- /dev/null +++ b/macros/latex/contrib/caption/fallback/v3.5/caption3.dtx @@ -0,0 +1,4680 @@ +% \iffalse meta-comment +% +% This is file `caption3.dtx'. +% +% Copyright (C) 1994-2020 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, caption-light.dtx, caption2.dtx, caption3.dtx, +% caption-ams-smf.dtx, caption-beamer.dtx, caption-elsarticle.dtx, +% caption-koma.dtx, caption-memoir.dtx, caption-ntg.dtx, +% caption-thesis.dtx, bicaption.dtx, ltcaption.dtx, subcaption.dtx, +% the derived files +% caption.sty, caption-light.sty, caption2.sty, caption3.sty, +% caption-ams-smf.sto, caption-beamer.sto, caption-elsarticle.sto, +% caption-koma.sto, caption-memoir.sto, caption-ntg.sto, +% caption-thesis.sto, bicaption.sty, ltcaption.sty, subcaption.sty, +% and the user manuals +% caption-deu.tex, caption-eng.tex, caption-rus.tex. +% +% \fi +% \CheckSum{3674} +% +% \iffalse +%<*driver> +\NeedsTeXFormat{LaTeX2e}[1994/12/01] +\ProvidesFile{caption3.drv}[2020/10/11 v2.2 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} +% +\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{caption3}[2020/09/12] +% +\DeclareRobustCommand*\eTeX{\texorpdfstring + {\leavevmode\hbox{$\varepsilon$}-\TeX}% + {e-TeX}} +% +\begin{document} + \DocInput{caption3.dtx} +\end{document} +%</driver> +% \fi +% +% \def\thispackage{the \package{caption} kernel} +% \def\Thispackage{The \package{caption} kernel} +% +% \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 +% +% \newcommand*\csmarg[1]{\texttt{\char`\{#1\char`\}}} +% \newcommand*\csoarg[1]{\texttt{\char`\[#1\char`\]}} +% \newcommand*\version[2][]{v$#2$} +% +% \GetFileInfo{caption3.drv} +% \let\docdate\filedate +% \let\docversion\fileversion +% \GetFileInfo{caption3.sty} +% +% \title{The Implementation of +% \texorpdfstring{\thispackage\thanks{%^^A +% This package has version number \docversion.}}%^^A +% {the caption kernel}} +% \author{Axel Sommerfeldt\\ +% \url{https://gitlab.com/axelsommerfeldt/caption}} +% \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} +% +% \section*{Internal commands} +% +% These internal commands are save to use by other packages as well +% since their interface will not change in future releases: +% \begin{quote}\begin{tabular}{ll} +% Internal command & Currently used by \\ +% \hline +% |\caption@addcontentsline| & \package{floatrow} \\ +% |\caption@fnun| & \package{floatrow} \\ +% |\caption@ifinlist| & \package{floatrow} \\ +% |\caption@iftop| & \package{keyfloat}, \package{subfig} \\ +% |\caption@make| & \package{subfig} \\ +% |\caption@@make| & \package{floatrow} \\ +% |\caption@setautoposition| & \package{bidi} \\ +% |\caption@setoptions| & \package{floatrow} \\ +% |\caption@setposition| & \package{floatrow} \\ +% |\caption@switchdefault| & \emph{none} \\ +% \end{tabular}\end{quote} +% +% If your package wants to use any other internal command of the \package{caption3} package, +% please write me an e-mail so we can define a proper interface together. +% +% Unfortunately these internal commands are used by other packages and therefore will likely +% not change in the future, too, but I do not support them (and maybe I will change them anyway +% and patch the other package on-the-fly instead, at least if it's unmaintained): +% \begin{quote}\begin{tabular}{ll} +% Internal command & Currently used by \\ +% \hline +% |\caption@hangindent | & \package{bidi} \\ +% |\caption@@@make| & \package{floatrow} \\ +% |\caption@@par| & \package{bidi} \\ +% |\caption@parindent| & \package{bidi} \\ +% |\caption@set@bool| & \package{floatrow} \\ +% |\caption@setfont| & \package{floatrow} \\ +% |\caption@setkeys| & \package{floatrow} \\ +% |\caption@setstyle*| & \package{floatrow} \\ +% \hline +% |\caption@hj@|\meta{name} & \package{floatrow} \\ +% |\caption@lsep@|\meta{name} & \package{floatrow} \\ +% |\caption@lsep@default| & \package{babel-hungarian} \\ +% |\caption@sty@|\meta{name} & \package{floatrow} \\ +% \end{tabular}\end{quote} +% +% Furthermore the \package{floatrow} package uses the undocumented option +% |position=a| (as abbreviation of |position=auto|). +% +% The \package{lwarp} package uses a lot of internal commands as well, +% but we are working on it on the Git branch \texttt{feature/lwarp}: +% \url{https://gitlab.com/axelsommerfeldt/caption/-/tree/feature/lwarp} +% +% \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 +% +% \iffalse +%<*package> +% \fi +% +% \section{Identification} +% +% \begin{macrocode} +\NeedsTeXFormat{LaTeX2e}[1994/12/01] +\ProvidesPackage{caption3}[2020/10/26 v2.2f caption3 kernel (AR)] +% \end{macrocode} +% +% \section{Generic helpers} +% +% \begin{macro}{\@nameundef} +% |\@nameundef|\marg{command name}\\ +% is the opposite to |\@name|\-|def| 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 |\caption|\-|setup|\oarg{type}. +% \begin{macrocode} +\providecommand*\@nameundef[1]{% + \expandafter\let\csname #1\endcsname\@undefined} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@addto@macro} +% \changes{v1.5}{2013/04/26}{Revised} +% \changes{v2.0}{2019/09/11}{Relies on \eTeX{} now} +% |\l@addto@macro|\marg{command}\marg{code}\\ +% The \LaTeXe\ kernel offers the internal helper macro |\g@addto@macro| which +% globally adds tokens to existing macros, like in |\AtBeginDocument|. +% This one is the same but it works locally, not globally. +% \begin{macrocode} +\providecommand\l@addto@macro[2]{% + \edef#1{\unexpanded\expandafter{#1#2}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bothIfFirst} +% \changes{v2.2}{2020/09/21}{Usage of \cs{caption@prepare@bothif} added} +% \begin{macro}{\bothIfSecond} +% \changes{v2.2}{2020/09/21}{Usage of \cs{caption@prepare@bothif} added} +% |\bothIfFirst|\marg{code no. 1}\marg{code no. 2}\\ +% |\bothIfSecond|\marg{code no. 1}\marg{code no. 2}\\ +% |\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{\caption@bothif{#1}{#1#2}} +% \end{macrocode} +% \begin{macrocode} +\def\bothIfSecond#1#2{\caption@bothif{#2}{#1#2}} +% \end{macrocode} +% \begin{macrocode} +\newcommand*\caption@bothif[2]{% + \begingroup + \caption@prepare@bothif + \protected@xdef\caption@tempa{#1}% + \endgroup + \ifx\caption@tempa\@empty \else + #2% + \fi} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\caption@prepare@bothif} +% \changes{v2.2}{2020/09/21}{This macro added} +% |\caption@prepare@bothif|\\ +% re-defines anything which could disturb either |\both|\-|If|\-|First| or |\both|\-|If|\-|Second| check. +% \begin{macrocode} +\providecommand*\caption@prepare@bothif{} +\g@addto@macro\caption@prepare@bothif{% + \let\inputencoding\@gobble} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@ifundefined} +% \changes{v1.3a}{2011/08/12}{This macro added} +% \changes{v1.3b}{2011/08/18}{Made expandable} +% |\caption@ifundefined|\marg{command}\marg{yes-code}\marg{no-code}\\ +% is similar to \cs{@ifundefined} offered by the \LaTeX kernel, +% but takes a command as argument instead of a command name. +% \begin{macrocode} +\newcommand*\caption@ifundefined[1]{% + \ifdefined#1% + \ifx#1\relax + \expandafter\expandafter\expandafter\@firstoftwo + \else + \expandafter\expandafter\expandafter\@secondoftwo + \fi + \else + \expandafter\@firstoftwo + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@ifdefined} +% \changes{v1.8e}{2018/05/11}{This macro added} +% |\caption@ifdefined|\marg{command}\marg{yes-code}\marg{no-code}\\ +% is similar to \cs{@ifundefined} offered by the \LaTeX kernel, +% but takes a command as argument instead of a command name. +% \begin{macrocode} +\newcommand*\caption@ifdefined[1]{% + \ifdefined#1% + \ifx#1\relax + \expandafter\expandafter\expandafter\@secondoftwo + \else + \expandafter\expandafter\expandafter\@firstoftwo + \fi + \else + \expandafter\@secondoftwo + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@ifinlist} +% \changes{v1.1}{2007/07/29}{Rewritten} +% |\caption@ifinlist|\marg{element}\marg{list}\marg{yes-code}\marg{no-code}\\ +% This helper command checks if the \meta{element} is in the comma separated +% \meta{list}. So for example +% \begin{quote} +% |\caption@ifinlist{frank}{axel,frank,olga,steven}{yes}{no}| +% \end{quote} +% would expand to |yes|.\par +% (Note: Since this command is used by the \package{floatrow} package as well +% its syntax should not change.) +% \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{element}\marg{yes-code}\marg{no-code}\\ +% is the same as |\caption@ifinlist| but with a command (containing a list) +% instead of the list itself. +% \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{element}\\ +% adds an element to a command containing a list. +% (The command will get defined if it isn't defined yet.) +% \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{element}\\ +% is the same as |\caption@g@addto@list| but works locally. +% \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{element}\\ +% removes an element from a command containing a list. +% \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@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{element}\\ +% is the same as |\caption@g@removefrom@list| but works locally. +% \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}\\ +% iterates all elements of the list (within \meta{cmd}) using the given +% \meta{code}. +% \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{yes-code}\marg{no-code}\\ +% This helper command checks if the list (within \meta{cmd}) is empty. +% \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} +% \changes{v1.1}{2007/04/05}{\cs{caption@set@bool}\marg{cmd}\marg{value} added} +% \begin{macro}{\caption@ifbool} +% \changes{v1.1}{2020/08/02}{\cs{caption@if@bool}\marg{value} added} +% \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@if@bool{#2}{\let#1\@firstoftwo}{\let#1\@secondoftwo}} +% \end{macrocode} +% \begin{macrocode} +\newcommand*\caption@if@bool[1]{% + \caption@ifinlist{#1}{1,true,yes,on}% + {\@firstoftwo}% + {\caption@ifinlist{#1}{0,false,no,off}% + {}% + {\caption@Error{Undefined boolean value `#1'}}% + \@secondoftwo}} +% \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} +% +% \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}\\ +% expands \meta{cmd} with either argument \marg{star-arg} or +% \meta{non-star-arg}, depending on if the next char is a star (or not).\par +% |\caption@teststar@|\marg{cmd}\marg{star-arg}\marg{non-star-arg}\\ +% will test the catcode of the character \@ additionally. +% \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} +% \end{macro} +% +% \begin{macro}{\caption@ifatletter} +% \changes{v1.1e}{2007/10/28}{This macro added} +% |\caption@ifatletter|\marg{yes-code}\marg{no-code}\\ +% will either expand \meta{yes-code} or \meta{no-code}, +% depending on the catcode of the character \@. +% \begin{macrocode} +\newcommand*\caption@ifatletter{% + \ifnum\the\catcode`\@=11 + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi} +% \end{macrocode} +% \begin{macrocode} +\AtBeginDocument{\let\caption@ifatletter\@secondoftwo} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@withoptargs} +% \changes{v1.1}{2007/08/12}{This macro added} +% \changes{v1.5}{2012/04/09}{This macro revised} +% |\caption@withoptargs|\marg{cmd}\\ +% collects a star and all optional arguments, and expands \meta{cmd} +% afterwards with the collected stuff as first argument. +% \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{% + \def\caption@tempb{#1}% + \expandafter\caption@tempb\expandafter{\caption@tempa}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@gobble} +% \changes{v1.4}{2011/08/19}{This macro added} +% |\caption@gobble*|\oarg{arg}\oarg{\ldots}\marg{arg}\\ +% is similar to |\@gobble| but gobbles a star and optional arguments as well. +% \begin{macrocode} +\DeclareRobustCommand*\caption@gobble{% + \caption@withoptargs\@gobbletwo} +% \end{macrocode} +% \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}\\ +% is similar to |\AtBeginDocument| but the execution of code will be +% surrounded by two |\Package|\-|Info|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} +% +% \section{Information, Warnings, and Errors} +% +% \begin{macro}{\caption@Info} +% \changes{v1.3}{2010/10/25}{Moved from package to kernel} +% |\caption@Info|\marg{message}\\ +% issues an info message (with code line indication). +% \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}\\ +% issues an info message without code line indication. +% \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]{% + \caption@Info{#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}\\ +% issues a warning message (with code line indication). +% \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}\\ +% issues a warning message without code line indication. +% \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} +% \changes{v2.2a}{2020/09/28}{\cs{caption@eh} renamed to \cs{caption@@eh} and revised} +% |\caption@Error|\marg{message}\\ +% issues an error message (with code line indication). +% \begin{macrocode} +\newcommand*\caption@Error[1]{% + \PackageError{caption}{#1}{\caption@@eh{caption}}} +% \end{macrocode} +% \begin{macrocode} +\newcommand*\caption@@eh[1]{% + If you do not understand this error, please take a closer look\MessageBreak + at the documentation of the `#1' 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} +% |\caption@KV@err|\marg{message}\\ +% will be used to issue an error while parsing the key-value (package) +% options. +% \begin{macrocode} +\let\caption@KV@err\caption@Error +% \end{macrocode} +% \end{macro} +% +% \section{Using the keyval package} +% +% We need the \package{keyval} package for option handling, so we load it here.\par +% \emph{TODO:} Use some recent stuff instead, for example kvdefinekey and kvsetkeys. +% \begin{macrocode} +\RequirePackage{keyval}[1997/11/10] +% \end{macrocode} +% +% \begin{macro}{\undefine@key} +% |\undefine@key|\marg{family}\marg{key}\\ +% 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}\\ +% marks a keyval definition only valid in the document preamble, analogous to +% |\@only|\-|preamble| 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}\\ +% We declare our options using these commands (instead of using +% |\Declare|\-|Option| 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 |\use|\-|package|, but +% \emph{not} with |\caption|\-|setup| 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}}\caption@declare@option{#2}} +\@onlypreamble\caption@declareoption +% \end{macrocode} +% \begin{macrocode} +\newcommand*\caption@declare@option{% + \define@key{caption}} +%% no \@onlypreamble\caption@declare@option since it will be used by \captionsetup +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\DeclareCaptionOptionNoValue} +% \changes{v1.1c}{2007/10/06}{This macro added} +% |\DeclareCaptionOptionNoValue*|\marg{option}\marg{code}\\ +% is the same as |\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 |\caption|\-|setup| is used, this will be set to |true|. +% (It will be reset to |false| at the end of |\caption@set|\-|keys|.) +% \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} +% \changes{v1.5}{2012/04/09}{Support of multiple optional arguments added} +% \changes{v1.8h}{2020/01/03}{Syntax check of saved options added} +% |\captionsetup*|\oarg{type}\ldots\marg{keyval-list of options}\\ +% applies the given list of options. +% If the optional argument `type' is specified, we simply save or append +% the option list, otherwise we `execute' it with |\set|\-|keys|. +% (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]{% + \@ifnextchar[%] + {\caption@stepthecounter + \caption@withoptargs{\@expandtwoargs + \caption@setup@options@i{#1}{@\caption@thecounter}}}% + {\caption@setup@options@{#1}}} +% \end{macrocode} +% \begin{macrocode} +\newcommand*\caption@setup@options@i[4]{% + \caption@declare@option{#2}[]{\captionsetup#3{#4}}% + \caption@setup@options@{#1}{#2}} +% \end{macrocode} +% \begin{macrocode} +\newcommand*\caption@setup@options@[2]{% + \@bsphack + \ifcaptionsetup@star\captionsetup@starfalse\else\caption@addtooptlist{#1}\fi + \caption@checkoptions{#2}% + \expandafter\caption@l@addto@list\csname caption@opt@#1\endcsname{#2}% + \@esphack} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@checkoptions} +% \changes{v1.8h}{2020/01/03}{This macro added} +% |\caption@checkoptions|\marg{keyval-list of options}\\ +% checks the syntax of the given options by executing them inside a group. +% \begin{macrocode} +\newcommand*\caption@checkoptions[1]{% + \begingroup + \caption@prepare@optioncheck + \caption@setup{#1}% + \endgroup} +% \end{macrocode} +% \begin{macrocode} +\providecommand*\caption@prepare@optioncheck{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\IfCaptionOptionCheck} +% \changes{v1.10}{2020/05/10}{This macro added} +% |\IfCaptionOptionCheck|\marg{yes-code}\marg{no-code}\\ +% executes the \meta{yes-code} if options are just checked for syntax, +% and \meta{no-code} if not. +% \begin{macrocode} +\let\IfCaptionOptionCheck\@secondoftwo +% \end{macrocode} +% \begin{macrocode} +\g@addto@macro\caption@prepare@optioncheck{% + \let\IfCaptionOptionCheck\@firstoftwo} +% \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}\\ +% 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'}}} +% \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}\\ +% shows the saved option list which is associated with \meta{type} +% (as warning message). +% \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} +% \changes{v1.4b}{2012/01/12}{Option \opt{options*=} removed} +% \begin{macrocode} +\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} +% \changes{v1.4b}{2012/01/12}{Starred variant removed} +% |\caption@setoptions|\marg{type or environment or\ldots}\\ +% applies caption options which have been saved with |\caption|\-|setup|\oarg{type}. +% To prevent multiple application the list will be cleared (locally) afterwards. +% \begin{macrocode} +\newcommand*\caption@setoptions[1]{% + \caption@Debug{options=#1}% + \expandafter\let\expandafter\caption@opt\csname caption@opt@#1\endcsname + \ifx\caption@opt\relax \else + \caption@xsetup\caption@opt + \caption@clearsetup{#1}% + \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}\\ +% 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} +% \changes{v1.4}{2011/08/24}{Redefinition of \cs{XKV@err} added} +% |\caption@setkeys|\oarg{package}\marg{family}\marg{key-values}\\ +% expands to |\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\csname ORI@XKV@err\caption@keydepth\endcsname\XKV@err + \edef\caption@keydepth{\caption@keydepth i}% +% \end{macrocode} +% \begin{macrocode} + \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 + \def\KV@errx{\KV@err}% + \def\XKV@err{\let\@tempa\XKV@tkey\KV@err}% +% \end{macrocode} +% \begin{macrocode} + \caption@Debug{\noexpand\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 + \expandafter\let\expandafter\XKV@err\csname ORI@XKV@err\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-value options}\\ +% applies the given options using the keyval interface, so we use this one +% instead of |\Execute|\-|Options| 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}{Starred variant added} +% |\caption@ProcessOptions*|\marg{package}\\ +% processes the given options using the keyval package, so we use this one +% instead of |\Process|\-|Options| offered by \LaTeXe. +% The starred variant does not process the global options. +% (This code was taken from the \package{hyperref} package\cite{hyperref} +% \version{6.74} and modified.) +% \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}\\ +% After application of this command |\caption@Execute|\-|Options| and +% |\use|\-|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@SetupOptions[2]{% + \@namedef{caption@setkeys@#1}##1##2{#2}% + \expandafter\@onlypreamble\csname caption@setkeys@#1\endcsname + \@cons\caption@SetupOptions@list{{#1}}} +\@onlypreamble\caption@SetupOptions +% \end{macrocode} +% \begin{macrocode} +\newcommand*\caption@SetupOptions@list{} +\@onlypreamble\caption@SetupOptions@list +% \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@SetupOptions@list + \@tempa} +\@onlypreamble\caption@onefilewithoptions +% \end{macrocode} +% \end{macro} +% +% \section{Declaring and setting key values} +% +% \begin{macro}{\caption@decl} +% \changes{v2.0}{2019/09/10}{This macro added} +% |\caption@decl|\oarg{command}\marg{option}\marg{name}\\ +% is used for declaring boxes, fonts, formats etc. +% (It defines |\caption@|\meta{option}|@|\meta{name} +% using the given \meta{command}.) +% \begin{macrocode} +\newcommand*\caption@decl[3][\def]{% + \global\long\expandafter#1\csname caption@#2@#3\endcsname} +\@onlypreamble\caption@decl +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@ifdecl} +% \changes{v2.0}{2019/09/10}{This macro added} +% |\caption@ifdecl|\marg{option}\marg{name}\marg{yes-code}\marg{no-code}\\ +% checks if the given \meta{option} and \meta{name} combination is +% already declared. +% \begin{macrocode} +\newcommand*\caption@ifdecl[2]{% + \@ifundefined{caption@#1@#2}\@secondoftwo\@firstoftwo} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@checkdecl} +% \changes{v2.0}{2019/09/10}{This macro added} +% |\caption@checkdecl|\marg{option}\marg{name}\marg{yes-code}\\ +% behaves similar to |\caption@if|\-|decl| but issues an error message if the +% given \meta{option} plus \meta{name} is not defined. +% \begin{macrocode} +\newcommand*\caption@checkdecl[2]{% + \caption@ifdecl{#1}{#2}% + \@firstofone + {\caption@Error{Undefined #1 `#2'}% + \@gobble}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@set} +% \changes{v2.0}{2019/09/10}{This macro added} +% \changes{v2.0}{2020/07/26}{Uses \cs{def} instead of \cs{let} internally} +% |\caption@set|\marg{option}\marg{name}\\ +% sets the declared \meta{option} to \meta{name}, for example +% |label|\-|format| to |simple|. +% Note that since version \version{2.0} future changes to \meta{name} +% (via |\caption@decl|) will effect the outcome, +% for example |\caption@decl{labelformat}{simple}\ldots| will not only change +% the definition of the label format |simple| but also effect the current +% label format if set to |simple| (via |\caption@set|). +% \begin{macrocode} +\newcommand*\caption@set{% + \caption@maparg\caption@@set}% +% \end{macrocode} +% \begin{macrocode} +\newcommand*\caption@@set[3]{% + \caption@checkdecl{#1}{#3}{% +% \expandafter\edef\csname caption@@#2\endcsname{#3}% could be used for debugging + \expandafter\def\csname caption@#2\expandafter\endcsname\expandafter{\csname caption@#1@#3\endcsname}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\SetCaptionDefault} +% \changes{v2.0}{2019/09/10}{This macro added} +% \changes{v2.0}{2020/07/28}{Check for `default' added to prevent infinite loop} +% |\SetCaptionDefault*|\marg{option}\marg{name}\\ +% sets the default value for the \meta{option}. +% The starred variant is only relevant for setting default values for lengths +% like |margin|. (See definition of |\caption@set|\-|default@length| for +% details.) +% \begin{macrocode} +\newcommand*\SetCaptionDefault{% + \caption@teststar\caption@setdefault\def\edef} +\@onlypreamble\SetCaptionDefault +% \end{macrocode} +% \begin{macrocode} +\newcommand*\caption@setdefault[2]{% + \@ifundefined{caption@setdefault@#2}% + {\caption@maparg\caption@@setdefault}% + {\@nameuse{caption@setdefault@#2}{#1}}% + {#2}} +% \end{macrocode} +% \begin{macrocode} +\newcommand*\caption@@setdefault[3]{% + \caption@ifdefault{#3}% + {\caption@Error{Invalid argument for \string\SetCaptionDefault: `#3'}}% would cause an infinite loop otherwise + {\caption@@set{#1}{#2@default}{#3}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@ifdefault} +% \changes{v2.0}{2020/08/23}{This macro added} +% |\caption@ifdefault|\marg{value}\marg{yes-code}\marg{no-code}\\ +% expands to \meta{yes-code} if the \meta{value} expands to `default', +% and to \meta{no-code} otherwise. +% \begin{macrocode} +\newcommand*\caption@ifdefault{\caption@ifequal{default}} +% \end{macrocode} +% \begin{macrocode} +\newcommand*\caption@ifequal[2]{% + \edef\caption@tempa{#1}% + \edef\caption@tempb{#2}% + \ifx\caption@tempa\caption@tempb + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@setmapping} +% \changes{v2.0}{2020/08/23}{This macro added} +% |\caption@setmapping|\marg{source option}\marg{destination option}\\ +% sets a mapping from the \meta{source option} to the +% \meta{destination option}, for example |label|\-|font| to |font| +% since |label|\-|font| does not have any own definitions but shares +% them with |font|. +% \begin{macrocode} +\newcommand*\caption@setmapping[2]{% + \@namedef{caption@map@#1}{#2}} +\@onlypreamble\caption@setmapping +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@maparg} +% \changes{v2.0}{2020/08/23}{This macro added} +% |\caption@maparg|\marg{command}\marg{option}\\ +% similar to |\@dblarg| but either duplicates the given \meta{option} or +% expands it to \meta{destination option} plus \meta{option} if a mapping +% was defined for the given option (via |\caption@set|\-|mapping|). +% \begin{macrocode} +\newcommand*\caption@maparg[2]{% + \@ifundefined{caption@map@#2}% + {#1{#2}}% + {#1{\csname caption@map@#2\endcsname}}% + {#2}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@switchdefault} +% \changes{v2.0}{2020/08/01}{This macro added} +% |\caption@switchdefault\marg{option}|\marg{code with \#1}\marg{name}\\ +% like |\Set|\-|Caption|\-|Default| but first expands the given code with the +% to-be-overwritten internal command as argument, so it can be stored (and +% restored later on). +% The main purpose of this command is switching default settings in +% \package{babel} language packages, e.g.: +% \begin{quote}|\caption@switchdefault{labelfont}{\babel@save #1}{sc}|\end{quote} +% \begin{macrocode} +\def\caption@switchdefault#1#2{% + \def\caption@tempa##1{#2}% + \expandafter\caption@tempa\csname caption@#1@default\endcsname + \caption@setdefault\def{#1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@restoredefault} +% \changes{v2.0}{2020/08/01}{This macro added} +% |\caption@restoredefault\marg{option}|\marg{command}\\ +% restores a default setting which was stored to \meta{command} before +% (via |\caption@switch|\-|default|). +% \begin{macrocode} +\def\caption@restoredefault#1#2{% + \caption@checkdecl{#1}{default}{% + \caption@ifdefined#2{% + \expandafter\let\csname caption@#1@default\endcsname#2% + \let#2\@undefined}{}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\SetCaptionFallback} +% \changes{v2.2}{2020/09/21}{This macro added} +% |\SetCaptionFallback|\marg{option}\marg{name}\\ +% sets the fallback value for the \meta{option}. +% \begin{macrocode} +\newcommand*\SetCaptionFallback{% + \caption@maparg\caption@@setfallback} +\@onlypreamble\SetCaptionFallback +% \end{macrocode} +% \begin{macrocode} +\newcommand*\caption@@setfallback[3]{% + \caption@ifequal{fallback}{#3}% + {\caption@Error{Invalid argument for \string\SetCaptionFallback: `#3'}}% would cause an infinite loop otherwise + {\caption@@set{#1}{#2@fallback}{#3}}} +\@onlypreamble\caption@@setfallback +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@decl@package} +% \changes{v2.0}{2020/07/26}{This macro added} +% |\caption@decl@package|\marg{option}\marg{cmd}\oarg{package}\marg{name}\ldots\\ +% Helper command to declare a caption package option value which is dependent +% on the existence of a specific package, for example the |font| value +% |one|\-|half|\-|spacing| which is dependent on the \package{setspace} +% package. +% \begin{macrocode} +\newcommand*\caption@decl@package[2]{% + \@ifnextchar[%] + {\caption@declare@package{#1}{#2}}% + {\caption@declarepackage{#1}{#2}}} +\@onlypreamble\caption@decl@package +% \end{macrocode} +% \begin{macrocode} +\def\caption@declare@package#1#2[#3]#4{% + \global\@namedef{caption@#1@#4@package}{#3}% + #2{#4}} +\@onlypreamble\caption@declare@package +% \end{macrocode} +% \begin{macrocode} +\newcommand*\caption@declarepackage[3]{% + \global\@nameundef{caption@#1@#3@package}% + #2{#3}} +\@onlypreamble\caption@declarepackage +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@load@package} +% \changes{v2.0}{2020/07/26}{This macro added} +% |\caption@load@package|\marg{option}\marg{value}\\ +% If the given option value needs a package, it will be loaded automatically. +% \begin{macrocode} +\newcommand*\caption@load@package[2]{% + \expandafter\let\expandafter\caption@tempa\csname caption@#1@#2@package\endcsname + \caption@ifdefined\caption@tempa + {\caption@requirepackage\caption@tempa{#1=#2}}% + {}} +% \end{macrocode} +% \end{macro} +% +% \section{Declaring and setting lengths} +% +% \begin{macro}{\DeclareCaptionLength} +% \changes{v2.0}{2020/08/09}{This macro added} +% |\DeclareCaptionLength|\marg{name}\marg{default value}\\ +% \begin{enumerate} +% \item Defines a new length (dimension) +% \item Installes a hook for |\caption@set|\-|default| so +% |\caption@set|\-|default@length| will be used to set a default +% value for this length +% \item Sets a default value using |\Set|\-|Caption|\-|Default*|. +% \end{enumerate} +% \begin{macrocode} +\newcommand*\DeclareCaptionLength[1]{% + \expandafter\newdimen\csname caption#1\endcsname + \@namedef{caption@setdefault@#1}##1{% + \caption@setdefault@length{##1}}% + \SetCaptionDefault*{#1}} +\@onlypreamble\DeclareCaptionLength +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@setdefault@length} +% \changes{v2.0}{2020/08/09}{This macro added} +% |\caption@setdefault@length*|\marg{cmd}\marg{name}\marg{value}\\ +% sets a default value for the given \meta{length}, either using |\def| +% (if the starred variant is used) or |\edef| (if the non-starred variant is +% used). +% \begin{macrocode} +\newcommand*\caption@setdefault@length[3]{% + \expandafter#1\csname caption#2@default\endcsname{#3}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@setlength} +% \changes{v2.0}{2020/08/09}{This macro added} +% |\caption@setlength|\marg{name}\marg{value}\\ +% sets a length to either the given \meta{value} or to the default value if +% \meta{value} is `default'. +% \begin{macrocode} +\newcommand*\caption@setlength[2]{% + \caption@ifdefault{#2}% + {\expandafter\let\expandafter\caption@tempa\csname caption#1@default\endcsname}% + {\def\caption@tempa{#2}}% + \expandafter\setlength\csname caption#1\endcsname\caption@tempa} +% \end{macrocode} +% \end{macro} +% +% \section{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} of the \package{caption} package.\par +% Note that we can only set one value at a time, `margin' \emph{or} `width'. +% If |\caption|\-|width| is not zero we will take this value afterwards, +% otherwise |\caption|\-|margin| and |\caption|\-|margin@|. +% \begin{macrocode} +\DeclareCaptionLength{margin}{0pt} +\DeclareCaptionLength{margin@}{\the\captionmargin} +\DeclareCaptionLength{width}{0pt} +\newdimen\caption@tempdima +% \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} +\caption@set@bool\caption@iftwoside{\if@twoside 1\else 0\fi} +% \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}\\ +% sets the caption margin to the given \meta{amount}. +% 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{% + \caption@setlength{margin}{#1}% + \caption@setlength{margin@}{#2}% + \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}\\ +% sets the caption width to the given \meta{amount}. +% 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@}% + \caption@setlength{width}{#2}}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@setcalcmargin} +% \changes{v1.3}{2010/11/07}{This macro added} +% |\caption@setcalcmargin*|\marg{amount}\\ +% sets the caption margin to the given \meta{amount} +% right before the caption will be typeset, i.e.\meta{amount} will +% not be evaluated immediately. +% \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@resetcalcmargin} +% \changes{v1.3}{2010/11/07}{This macro added} +% |\caption@resetcalcmargin|\\ +% clears the value which was stored in |\caption@set|\-|calc|\-|margin|. +% \begin{macrocode} +\newcommand*\caption@resetcalcmargin{% + \let\caption@calcmargin@hook\@empty} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@setcalcwidth} +% \changes{v1.3}{2010/11/07}{This macro added} +% |\caption@setcalcwidth*|\marg{amount}\\ +% sets the caption width to the given \meta{amount} +% right before the caption will be typeset, i.e.\meta{amount} will +% not be evaluated immediately. +% \begin{macrocode} +\newcommand*\caption@setcalcwidth{% + \caption@teststar{\caption@@setcalcmargin\caption@setwidth}% + \@secondoftwo\@firstoftwo} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@thecounter} +% \changes{v1.0n}{2007/04/03}{This counter added} +% \changes{v1.1e}{2007/10/28}{Renamed from \cs{caption@counter} to \cs{caption@thecounter}; \cs{caption@stepcounter} added} +% \changes{v1.5}{2012/04/09}{\cs{caption@stepcounter} renamed to \cs{caption@stepthecounter}} +% Internal counter. +% At the moment it will be used inside |\caption@if|\-|odd|\-|page| only. +% \begin{macrocode} +\newcommand*\caption@thecounter{0} +% \end{macrocode} +% \begin{macrocode} +\newcommand*\caption@stepthecounter{% + \@tempcnta\caption@thecounter + \advance\@tempcnta\@ne\relax + \xdef\caption@thecounter{\the\@tempcnta}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@newlabel} +% \changes{v1.0n}{2007/04/03}{This macro added} +% |\caption@newlabel|\marg{name}\marg{value}\\ +% This command is a modified version of |\new|\-|label| 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@if|\-|odd|\-|page|.) +% \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 |\the|\-|page| from \LaTeX2e. +% It will be used inside |\caption@if|\-|odd|\-|page| 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} +% |\caption@label|\marg{name}\\ +% This command is a modified version of |\label| from \LaTeX2e. +% It will be used inside |\caption@if|\-|odd|\-|page| and |\FP@help|\-|Note|. +% \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} +% |\caption@pageref|\marg{name}\\ +% This command is a modified version of |\page|\-|ref| from \LaTeX2e. +% It will be used inside |\caption@if|\-|odd|\-|page| and |\FP@help|\-|Note|. +% \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}} +% Currently this macro uses an own label\ldots ref mechanism, +% but an alternative implementation method would use the +% \package{refcount} package\cite{refcount} and +% |\ifodd\get|\-|page|\-|ref|\-|number{|\ldots|}|. +% Maybe we will change that in a later release. +% \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{command}\marg{off -or- value}\\ +% defines the given \meta{command} to \meta{value}, +% but if \meta{value} if `off' the given \meta{command} is undefined instead. +% \begin{macrocode} +\newcommand*\caption@setoptcmd[2]{% + \caption@ifinlist{#2}{0,false,no,off}{\let#1\@undefined}{\def#1{#2}}} +% \end{macrocode} +% \end{macro} +% +% \section{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} +\DeclareCaptionLength{@indent}{0pt} +\DeclareCaptionLength{@parindent}{0pt} +\DeclareCaptionLength{@hangindent}{0pt} +% \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 + \caption@setlength{@indent}{#1}} +\DeclareCaptionOption{indention}[\leftmargini]{% + \caption@setlength{@indent}{#1}} +\DeclareCaptionOption{parindent}{% + \caption@setlength{@parindent}{#1}} +\DeclareCaptionOption{hangindent}{% + \caption@setlength{@hangindent}{#1}} +\DeclareCaptionOption{parskip}{% + \l@addto@macro\caption@@par{\setlength\parskip{#1}}} +% \end{macrocode} +% +% \section{Styles} +% +% \begin{macro}{\DeclareCaptionStyle} +% \changes{v1.0a}{2004/01/17}{Pass through argument \#3 so extra spaces between arguments do make any harm} +% \changes{v2.0}{2019/09/10}{Uses \cs{caption@decl} now} +% \changes{v2.0}{2020/07/27}{\cs{caption@sls} renamed to \cs{caption@slsty}} +% |\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{% + \caption@decl{style}{#1}% + {\def\caption@slsty{#2}% + \def\caption@sty{#3}}% +% \end{macrocode} +% The \package{floatrow} package uses |\@if|\-|undefined{caption@sty@#1}| to +% determine in |\flrow@set|\-|style| if a caption style is defined or not. +% Since the \package{floatrow} package is unmaintained we fake the definition +% so the test will still work. +% \begin{macrocode} + \@namedef{caption@sty@#1}{\@unused}} +\@onlypreamble\caption@declarestyle +% \end{macrocode} +% \end{macro} +% +% \changes{v1.2a}{2008/01/20}{Option \opt{style*=} added} +% \begin{macrocode} +\DeclareCaptionOption{style}{\caption@setstyle{#1}} +\DeclareCaptionOption{style*}{\caption@setstyle*{#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} +% \changes{v2.0}{2019/09/10}{Uses \cs{caption@ifdecl} and \cs{caption@checkdecl} now} +% |\caption@setstyle*|\marg{name}\\ +% Selecting a caption style means saving the additional +% \meta{single-line-list-of-KV} (this will be done by |\caption@sl|\-|sty|), +% resetting the caption options to the base ones (this will be done using +% |\caption@reset|\-|style|) 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\caption@ifdecl\caption@checkdecl} +% \end{macrocode} +% \begin{macrocode} +\newcommand*\caption@@setstyle[2]{% + #1{style}{#2}% + {\caption@set{style}{#2}% + \caption@style % defines \caption@sty & \caption@slsty + \ifx\caption@setstyle@flag\@undefined + \let\caption@setstyle@flag\relax % prevent \caption@resetstyle if called recursively + \caption@resetstyle + \caption@xsetup\caption@sty + \let\caption@setstyle@flag\@undefined + \else + \caption@xsetup\caption@sty + \fi}% + {}} +% \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 \opt{size=} added} +% \changes{v1.2b}{2008/05/06}{Usage of \opt{rule} added} +% \changes{v1.5}{2012/03/15}{\opt{box=parbox} added} +% \changes{v1.6}{2013/05/01}{\opt{box=none} added, \opt{box=parbox} changed to \opt{parbox=parbox}} +% |\caption@resetstyle|\\ +% 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{% + box=none,boxcolor=white,parbox=parbox,% + format=plain,labelformat=default,labelsep=colon,textformat=simple,% + font=,labelfont=,textfont=,size=,% + justification=justified,slc,rule,strut,% + margin=0pt,minmargin=0,maxmargin=0,% + indent=0pt,parindent=0pt,hangindent=0pt}} +% \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}} +% \changes{v1.5}{2012/03/15}{\opt{box=default} added to 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 |\@make|\-|caption| +% 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]{% + box=default,% + format=default,labelformat=default,labelsep=default,textformat=default,% + font=default,labelfont=default,textfont=default,size=default,% + justification=default,slc=default,margin=default,% + indent=default,parindent=default,hangindent=default} +% \end{macrocode} +% +% \begin{macro}{\DeclareCaptionSinglelinecheck} +% \changes{v2.0}{2019/09/10}{This macro added} +% |\DeclareCaptionSinglelinecheck|\marg{name}\marg{code} +% \begin{macrocode} +\newcommand*\DeclareCaptionSinglelinecheck[2]{% + \caption@decl{singlelinecheck}{#1}{#2}} +\@onlypreamble\DeclareCaptionSinglelinecheck +% \end{macrocode} +% \end{macro} +% +% \changes{v1.2b}{2008/05/06}{Option \opt{slc=} added} +% \begin{macrocode} +\DeclareCaptionOption{singlelinecheck}[1]{\caption@setsinglelinecheck{#1}} +\DeclareCaptionOption{slc}[1]{\KV@caption@singlelinecheck{#1}} +% \end{macrocode} +% +% These are the pre-defined single-line-check code snippets. +% \begin{macrocode} +\DeclareCaptionSinglelinecheck{on}{\@firstoftwo} +\DeclareCaptionSinglelinecheck{off}{\@secondoftwo} +% \end{macrocode} +% +% `default' usually maps to `on'. +% \begin{macrocode} +\SetCaptionDefault{singlelinecheck}{on} +% \end{macrocode} +% +% \begin{macro}{\caption@setsinglelinecheck} +% \changes{v2.0}{2018/03/13}{This macro added} +% |\caption@setsinglelinecheck|\marg{value}\\ +% sets the single-line-check either on or off, +% where \meta{value} could be either a \meta{name} or boolean value. +% \begin{macrocode} +\newcommand*\caption@setsinglelinecheck[1]{% + \caption@ifdecl{singlelinecheck}{#1}% + {\caption@set{singlelinecheck}{#1}}% + {\caption@set@bool\caption@singlelinecheck{#1}}} +% \end{macrocode} +% \end{macro} +% +% \section{Boxes} +% +% \begin{macro}{\DeclareCaptionBox} +% \changes{v1.5}{2012/03/15}{This macro added} +% \changes{v2.0}{2019/09/10}{Uses \cs{caption@decl} now} +% \changes{v2.2f}{2020/10/26}{\cs{par} is now allowed as part of the \meta{code} argument} +% |\DeclareCaptionBox|\marg{name}\marg{code with \#1 and \#2} +% \begin{macrocode} +\newcommand\DeclareCaptionBox[2]{% + \caption@decl{box}{#1}##1##2{#2}} +\@onlypreamble\DeclareCaptionBox +% \end{macrocode} +% \end{macro} +% +% \changes{v1.5}{2012/03/15}{Option \opt{box=} added} +% \changes{v1.6}{2013/05/01}{Option \opt{parbox=} added} +% \begin{macrocode} +\DeclareCaptionOption{box}{\caption@set{box}{#1}} +\DeclareCaptionOption{parbox}{\caption@set{parbox}{#1}} +\caption@setmapping{parbox}{box} +% \end{macrocode} +% +% There are four pre-defined boxes, called `empty', `none', +% `parbox', and `colorbox'. +% \changes{v1.0i}{2006/05/13}{We define \cs{captionbox} instead of \cs{caption@start/endbox}} +% \changes{v1.0l}{2006/03/09}{Bugfix 07-03-09: \cs{captionbox} changed from \cs{parbox-t} to \cs{parbox-b}} +% \changes{v1.2}{2007/11/11}{\cs{captionbox} renamed to \cs{caption@parbox}} +% \changes{v1.5}{2012/03/15}{\cs{caption@parbox} adapted to \cs{DeclareCaptionBox}} +% \changes{v1.6}{2013/05/02}{Option \opt{boxsep=} added} +% \changes{v2.1b}{2020/09/17}{Missing braces re-added to \opt{colorbox} option code} +% \begin{macrocode} +\DeclareCaptionBox{empty}{} +\DeclareCaptionBox{none}{#2} +\DeclareCaptionBox{parbox}{\parbox[b]{#1}{#2}} +\DeclareCaptionBox{colorbox}{% + \colorbox{\caption@boxcolor}{% + \setlength\caption@tempdima{#1}% + \addtolength\caption@tempdima{-2\fboxsep}% + \linewidth\caption@tempdima\relax + \hsize\caption@tempdima\relax + #2}} +\DeclareCaptionOption{boxcolor}{\def\caption@boxcolor{#1}} +\DeclareCaptionOption{boxsep}{\setlength\fboxsep{#1}} +% \end{macrocode} +% +% `default' usually maps to `none' resp.~`parbox'. +% \begin{macrocode} +\SetCaptionDefault{box}{none} +%\SetCaptionDefault{parbox}{parbox} +% \end{macrocode} +% +% \section{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} +% \changes{v2.0}{2019/09/10}{Uses \cs{caption@decl} now} +% \changes{v2.0}{2020/07/27}{\cs{caption@ifh} renamed to \cs{caption@ifhmode}} +% |\DeclareCaptionFormat*|\marg{name}\marg{code with \#1, \#2, and \#3}\\ +% 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{% + \caption@decl[\edef]{format}{#2}{% + \unexpanded{\let\caption@ifhmode#1}% + \unexpanded{\long\def\caption@slfmt}####1####2####3\unexpanded{{#3}}% + \unexpanded{\long\def\caption@fmt}####1####2####3\unexpanded{{#4}}}} +\@onlypreamble\caption@@declareformat +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@useformat} +% \changes{v2.0}{2020/07/31}{This macro added} +% |\caption@useformat|\marg{name}\\ +% expands |\caption@fmt| based on the given format \meta{name}. +% \begin{macrocode} +\newcommand*\caption@useformat[1]{% used by caption-koma.sto + \caption@checkdecl{format}{#1}{% + \begingroup + \@nameuse{caption@format@#1}\global\let\caption@tempa\caption@fmt + \endgroup\caption@tempa}} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\DeclareCaptionOption{format}{\caption@set{format}{#1}} +% \end{macrocode} +% +% \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@iflabelseparatorwithnewline + {\caption@Error{% + The option `labelsep=\caption@labelsep@name' does not work\MessageBreak + with `format=hang'}}% + {\@hangfrom{#1#2}% + \advance\caption@parindent\hangindent\relax + \advance\caption@hangindent\hangindent\relax + \caption@@par#3\par}} +% \end{macrocode} +% +% `default' usually maps to `plain'. +% \begin{macrocode} +\SetCaptionDefault{format}{plain} +% \end{macrocode} +% +% \section{Label formats} +% +% \begin{macro}{\DeclareCaptionLabelFormat} +% \changes{v1.0a}{2004/01/17}{Pass through argument \#2 so extra spaces between arguments do make any harm} +% \changes{v2.0}{2019/09/10}{Uses \cs{caption@decl} now} +% |\DeclareCaptionLabelFormat|\marg{name}\marg{code with \#1 and \#2} +% \begin{macrocode} +\newcommand*\DeclareCaptionLabelFormat[2]{% + \caption@decl{labelformat}{#1}##1##2{#2}} +\@onlypreamble\DeclareCaptionLabelFormat +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\DeclareCaptionOption{labelformat}{\caption@set{labelformat}{#1}} +% \end{macrocode} +% +% \changes{v1.2}{2007/12/16}{Caption label format \opt{brace} added} +% \changes{v1.7}{2015/09/16}{Caption label format \opt{autodot} added} +% \changes{v1.7}{2016/05/22}{Caption label format \opt{autodot} fixed} +% \changes{v1.8}{2016/05/22}{Caption label format \opt{unnumbered} added} +% There are six pre-defined label formats, called `empty', `simple', +% `parens', `brace', `autodot', and `unnumbered'. +% +% \begin{macrocode} +\DeclareCaptionLabelFormat{empty}{} +\DeclareCaptionLabelFormat{simple}{\bothIfFirst{#1}{\nobreakspace}#2} +\DeclareCaptionLabelFormat{parens}{\bothIfFirst{#1}{\nobreakspace}(#2)} +\DeclareCaptionLabelFormat{brace}{\bothIfFirst{#1}{\nobreakspace}#2)} +\DeclareCaptionLabelFormat{autodot}{\bothIfFirst{#1}{\nobreakspace}#2\autodot} +\DeclareCaptionLabelFormat{unnumbered}{#1} +% \end{macrocode} +% +% \changes{v2.0}{2020/08/03}{Caption label format \opt{original} added} +% The label format `original' tries to preserve the original definition +% of the label format which was defined by |\fnum@|\meta{environment}. +% If no original definition is available, use the label format `simple' +% as fallback. +% +% \begin{macrocode} +\DeclareCaptionLabelFormat{original}{% + \caption@ifdefined\caption@original@fnum + {\caption@original@fnum}% + {\caption@labelformat@fallback{#1}{#2}}} +% \end{macrocode} +% +% `default' usually maps to `original' resp. `simple'. +% \begin{macrocode} +\SetCaptionDefault{labelformat}{original} +\SetCaptionFallback{labelformat}{simple} +% \end{macrocode} +% +% \section{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} +% \changes{v2.0}{2018/05/15}{Variant with two stars added} +% \changes{v2.0}{2019/09/10}{Uses \cs{caption@decl} now} +% \changes{v2.0}{2020/07/27}{\cs{caption@iflf} renamed to \cs{caption@iflabelfont}} +% \changes{v2.0}{2020/07/27}{\cs{caption@lsep} renamed to \cs{caption@labelsep}} +% \changes{v2.0}{2020/07/27}{Definition of \cs{caption@labelsep@name} added} +% |\DeclareCaptionLabelSeparator|\marg{name}\marg{code}\\ +% |\DeclareCaptionLabelSeparator*|\marg{name}\marg{code}\\ +% |\DeclareCaptionLabelSeparator**|\marg{name}\marg{condition}\marg{code}\\ +% The starred form causes the label separator to be typeset \emph{without} +% using |\caption|\-|label|\-|font|. +% The two-starred form uses \meta{condition} to decide if the label separator +% should be typeset with or without using |\caption|\-|label|\-|font|. +% \begin{macrocode} +\newcommand\DeclareCaptionLabelSeparator{% + \@ifstar + \DeclareCaptionLabelSeparator@ + {\caption@declarelabelseparator\@firstofone}} +\@onlypreamble\DeclareCaptionLabelSeparator +% \end{macrocode} +% \begin{macrocode} +\newcommand\DeclareCaptionLabelSeparator@{% + \@ifstar + \DeclareCaptionLabelSeparator@@ + {\caption@declarelabelseparator\@gobble}} +\@onlypreamble\DeclareCaptionLabelSeparator@ +% \end{macrocode} +% \begin{macrocode} +\newcommand*\DeclareCaptionLabelSeparator@@[2]{% + \caption@declarelabelseparator + {#2\@gobble\@firstofone}% + {#1}} +\@onlypreamble\DeclareCaptionLabelSeparator@@ +% \end{macrocode} +% \begin{macrocode} +\newcommand\caption@declarelabelseparator[3]{% + \caption@decl{labelseparator}{#2}% + {\def\caption@iflabelfont{#1}% + \def\caption@labelsep@name{#2}% + \def\caption@labelsep{#3}}% +% \end{macrocode} +% Unfortunately |\Declare|\-|Float|\-|Separators| of the \package{floatrow} +% package mis-uses |\Declare|\-|Caption|\-|Label|\-|Separator| instead of +% storing the definition on its own. Since the \package{floatrow} package is +% unmaintained we have to store the separator definition inside +% |\caption@lsep@|\meta{name} for \package{floatrow}, too. (Sigh!) +% \begin{macrocode} + \@namedef{caption@lsep@#2}{#3}} +% \end{macrocode} +% Since the `default' caption label separator will usually not be defined +% with |\Declare|\-|Caption|\-|Label|\-|Separator|, we need to define +% |\caption@lsep@default| manually. +% \Note{This definition is used by \package{magyar.ldf} but only needs to be different +% than \cs{caption@lsep} (which is usually undefined).} +% \begin{macrocode} +\newcommand*\caption@lsep@default{\caption@labelseparator@default\caption@labelsep}% +% \end{macrocode} +% \begin{macrocode} +\@onlypreamble\caption@declarelabelseparator +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@LabelSeparatorWithNewline} +% \changes{v2.0}{2020/07/27}{This macro added} +% |\caption@LabelSeparatorWithNewline|\marg{name}\\ +% adds the given label separator to a list of label separators which uses +% |\\| internally. (They are incompatible to the `hang' caption format.) +% \begin{macrocode} +\newcommand*\caption@LabelSeparatorWithNewline[1]{% + \caption@g@addto@list\caption@labelsep@crlist{#1}} +\@onlypreamble\caption@LabelSeparatorWithNewline +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@iflabelseparatorwithnewline} +% \changes{v2.0}{2020/07/31}{This macro added} +% |\caption@iflabelseparatorwithnewline|\marg{yes-code}\marg{no-code}\\ +% tests if the current label separator uses |\\| internally. +% \begin{macrocode} +\newcommand*\caption@iflabelseparatorwithnewline{% + \caption@ifin@list\caption@labelsep@crlist\caption@labelsep@name} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\DeclareCaptionOption{labelsep}{\caption@set{labelseparator}{#1}} +\DeclareCaptionOption{labelseparator}{\caption@set{labelseparator}{#1}} +% \end{macrocode} +% +% \changes{v1.0e}{2005/06/11}{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} +% \changes{v1.12}{2020/05/30}{Caption label separator \opt{newline} implementation changed from \cs{textbackslash} to \cs{captionnewline}} +% 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}{\captionnewline} +% TODO: \DeclareCaptionLabelSeparator should detect on its own if it contains \captionnewline or not +\caption@LabelSeparatorWithNewline{newline} % does not work with "format=hang" +\DeclareCaptionLabelSeparator*{endash}{\space\textendash\space} +% \end{macrocode} +% +% \changes{v2.2c}{2020/10/10}{Caption label separators \opt{gobble} and \opt{gobbletwo} added} +% +% It's a common hack to mis-use |\fnum@figure| and |\fnum@table| to replace the caption +% label separator, for example changing the separator to a period plus space with +% \begin{quote} +% |\renewcommand\fnum@figure[1]{\figurename~\thefigure.}| +% \end{quote} +% or dropping the label and separator completely with +% \begin{quote} +% |\renewcommand\fnum@figure[1]{\ignorespaces}|\quad +% \end{quote} +% (taken from \url{http://compgroups.net/comp.text.tex/figure-without-caption/1915079}). +% +% We emulate the behaviour of |\@make|\-|caption| of the base document classes +% \class{article}, \class{report}, and \class{book} in this regard (in |\caption@@@make|) +% so these hacks still work if the \package{caption} package is loaded. +% +% These are the label separators used when one or two tokens after the label format +% should be dropped, called `gobble' and `gobbletwo': +% \begin{macrocode} +\DeclareCaptionLabelSeparator{gobble}{ } +\DeclareCaptionLabelSeparator{gobbletwo}{} +% \end{macrocode} +% +% \begin{macro}{\captionnewline} +% \changes{v1.12}{2020/05/30}{This macro added} +% \changes{v2.0}{2020/07/31}{\cs{relax} added to definition} +% |\captionnewline|\\ +% will be used in the caption label separator |new|\-|line|, +% and re-defined for |long|\-|table| environments +% (in package \package{ltcaption}). +% \begin{macrocode} +\newcommand*\captionnewline{\\\relax} +% \end{macrocode} +% \end{macro} +% +% `default' usually maps to `colon'. +% \begin{macrocode} +\SetCaptionDefault{labelseparator}{colon} +% \end{macrocode} +% +% \section{Text formats} +% +% \begin{macro}{\DeclareCaptionTextFormat} +% \changes{v1.0j}{2007/02/18}{This macro added} +% \changes{v2.0}{2019/09/10}{Uses \cs{caption@decl} now} +% \changes{v2.2f}{2020/10/26}{\cs{par} is now allowed as part of the \meta{code} argument} +% |\DeclareCaptionTextFormat|\marg{name}\marg{code with \#1} +% \begin{macrocode} +\newcommand\DeclareCaptionTextFormat[2]{% + \caption@decl{textformat}{#1}##1{#2}} +\@onlypreamble\DeclareCaptionTextFormat +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\DeclareCaptionOption{textformat}{\caption@set{textformat}{#1}} +% \end{macrocode} +% +% There are three pre-defined text formats, called `empty', `simple' and `period'. +% \changes{v1.4}{2011/10/05}{Pre-defined text format `empty' added} +% \changes{v1.7}{2015/09/16}{The text format `empty' now takes care of the \cs{label}} +% \begin{macrocode} +\DeclareCaptionTextFormat{empty}{% + \caption@get@label#1\caption@makeanchor{}\@nil + \caption@thelabel + \global\let\caption@thelabel\relax} +\long\def\caption@get@label#1\caption@makeanchor#2#3\@nil{% + \def\caption@tempa{#2}% + \ifx\caption@tempa\@empty + \caption@getlabel{#1}% + \else + \caption@getlabel{#2}% + \fi} +% \end{macrocode} +% \begin{macrocode} +\DeclareCaptionTextFormat{simple}{#1} +\DeclareCaptionTextFormat{period}{#1.} +% \end{macrocode} +% +% `default' usually maps to `simple'. +% \begin{macrocode} +\SetCaptionDefault{textformat}{simple} +% \end{macrocode} +% +% \begin{macro}{\caption@getlabel} +% \changes{v1.0}{2011/09/03}{\cs{label} can have optional arguments now} +% \changes{v1.7}{2015/09/16}{Moved from \package{bicaption} package to \package{caption3}} +% \changes{v1.8d}{2019/09/01}{Bugfix: Global definition of \cs{caption@thelabel} added} +% \changes{v2.0}{2020/08/23}{Syntax changed} +% |\caption@getlabel|\marg{text}\\ +% gets the label command out of the given caption text and stores it to +% |\caption@the|\-|label|. +% \begin{macrocode} +\newcommand\caption@getlabel[1]{% + \caption@@getlabel#1\label{}\@nil} +\long\def\caption@@getlabel#1\label#2#3\@nil{% + \def\@tempa{#2}% + \ifx\@tempa\@empty + \let\caption@thelabel\relax + \else + \def\@tempb{*}% + \ifx\@tempa\@tempb + \def\caption@thelabel{\label*}% + \caption@@@getlabel#3\@nil + \else + \def\caption@thelabel{\label}% + \caption@@@getlabel{#2}#3\@nil + \fi + \fi} +% \end{macrocode} +% \begin{macrocode} +\long\def\caption@@@getlabel#1#2\@nil{% + \def\@tempa{#1}% + \def\@tempb{[}% + \ifx\@tempa\@tempb + \caption@@@@getlabel#1#2\@nil + \else + \l@addto@macro\caption@thelabel{{#1}}% + \fi} +% \end{macrocode} +% \begin{macrocode} +\long\def\caption@@@@getlabel[#1]#2\@nil{% + \l@addto@macro\caption@thelabel{[{#1}]}% + \caption@@@getlabel#2\@nil} +% \end{macrocode} +% \begin{macrocode} +\let\caption@thelabel\relax +% \end{macrocode} +% \end{macro} +% +% \changes{v1.0c}{2005/02/12}{Option \opt{strut=} added} +% \begin{macrocode} +\DeclareCaptionOption{strut}[1]{\caption@set@bool\caption@ifstrut{#1}} +% \end{macrocode} +% +% \section{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} +% \changes{v1.8h}{2020/01/03}{Check for \package{ragged2e} package related options added} +% \changes{v1.10}{2020/05/10}{Optional argument \opt{package} added} +% |\DeclareCaptionFont|\oarg{package}\marg{name}\marg{code} +% \begin{macrocode} +\newcommand*\DeclareCaptionFont{% + \caption@decl@package{font}{\caption@declarefont}} +\@onlypreamble\DeclareCaptionFont +% \end{macrocode} +% \begin{macrocode} +\newcommand*\caption@declarefont[2]{% + \caption@decl{font}{#1}##1{#2}% + \define@key{caption@font}{#1}[]{\caption@addto@font{#1}{##1}}} +\@onlypreamble\caption@@declarefont +% \end{macrocode} +% \begin{macrocode} +\newcommand*\caption@addto@font[1]{% +% \end{macrocode} +% \begin{macrocode} +% Load package first, if necessary + \caption@load@package{font}{#1}% +% \end{macrocode} +% Add the content to \cs{caption@fnt} +% \begin{macrocode} + \caption@add@to@font{font}{#1}} +% \end{macrocode} +% \begin{macrocode} +\newcommand*\caption@add@to@font[3]{% + \expandafter\g@addto@macro\expandafter\caption@fnt\expandafter{\csname caption@#1@#2\endcsname{#3}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\DeclareCaptionOption{font}{\caption@setfont{font}{#1}} +\DeclareCaptionOption{font+}{\caption@addtofont{font}{#1}} +% \end{macrocode} +% \begin{macrocode} +\DeclareCaptionOption{labelfont}{\caption@setfont{labelfont}{#1}} +\DeclareCaptionOption{labelfont+}{\caption@addtofont{labelfont}{#1}} +\caption@setmapping{labelfont}{font} +% \end{macrocode} +% \begin{macrocode} +\DeclareCaptionOption{textfont}{\caption@setfont{textfont}{#1}} +\DeclareCaptionOption{textfont+}{\caption@addtofont{textfont}{#1}} +\caption@setmapping{textfont}{font} +% \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}\\ +% 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}\\ +% Like |\caption@set|\-|font|, but adds the code snippets to |\caption|\meta{name}. +% Because we use |\set|\-|keys| recursive here we need to do this inside an +% extra group. +% \begin{macrocode} +\newcommand*\caption@addtofont[2]{% + \expandafter\let\expandafter\caption@fnt\csname caption#1\endcsname + \begingroup + \define@key{caption@font}{default}[]{\caption@add@to@font{#1}{default}{##1}}% + \caption@setkeys[caption]{caption@font}{#2}% + \endgroup + \expandafter\let\csname caption#1\endcsname\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} +% +% \changes{v1.7}{2018/05/01}{Missing font sizes \texttt{tiny}, \texttt{LARGE}, \texttt{huge}, and \texttt{Huge} added} +% \begin{macrocode} +\DeclareCaptionFont{tiny}{\tiny} +\DeclareCaptionFont{scriptsize}{\scriptsize} +\DeclareCaptionFont{footnotesize}{\footnotesize} +\DeclareCaptionFont{small}{\small} +\DeclareCaptionFont{normalsize}{\normalsize} +\DeclareCaptionFont{large}{\large} +\DeclareCaptionFont{Large}{\Large} +\DeclareCaptionFont{LARGE}{\LARGE} +\DeclareCaptionFont{huge}{\huge} +\DeclareCaptionFont{Huge}{\Huge} +% \end{macrocode} +% +% \changes{v1.8}{2018/05/01}{Font sizes \texttt{smaller} and \texttt{larger} added} +% \begin{macrocode} +\DeclareCaptionFont{smaller}{\caption@smaller} +\DeclareCaptionFont{larger}{\caption@larger} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareCaptionFont{none}{} +\DeclareCaptionFont{normal}{% + \caption@font@normalcolor\@unused + \caption@font@normalfont\@unused + \caption@font@normalsize\@unused + \caption@font@singlespacing\@unused} +% \end{macrocode} +% +% `default' usually maps to `none'. +% \begin{macrocode} +\SetCaptionDefault{font}{none} +\SetCaptionDefault{labelfont}{none} +\SetCaptionDefault{textfont}{none} +% \end{macrocode} +% +% The \package{floatrow} package uses the fonts `footfont` and `@tempa` additionally, +% so we need to map and define the default value for them, too. +% \begin{macrocode} +\caption@setmapping{footfont}{font} +\SetCaptionDefault{footfont}{none} +\caption@setmapping{@tempa}{font} +\SetCaptionDefault{@tempa}{none} +% \end{macrocode} +% +% \begin{macro}{\caption@smaller} +% |\caption@smaller|\\ +% selects a font size which is smaller than the current one. +% \begin{macrocode} +\newcommand\caption@smaller{% + \ifx\@currsize\tiny + \relax + \else\ifx\@currsize\scriptsize + \tiny + \else\ifx\@currsize\footnotesize + \scriptsize + \else\ifx\@currsize\small + \footnotesize + \else\ifx\@currsize\normalsize + \small + \else\ifx\@currsize\large + \normalsize + \else\ifx\@currsize\Large + \large + \else\ifx\@currsize\LARGE + \Large + \else\ifx\@currsize\huge + \LARGE + \else\ifx\@currsize\Huge + \huge + \else + \caption@Warning{% + Cannot determine current font size.\MessageBreak + Try setting it with `size=' explicitly}% + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@larger} +% |\caption@larger|\\ +% selects a font size which is larger than the current one. +% \begin{macrocode} +\newcommand\caption@larger{% + \ifx\@currsize\tiny + \scriptsize + \else\ifx\@currsize\scriptsize + \footnotesize + \else\ifx\@currsize\footnotesize + \small + \else\ifx\@currsize\small + \normalsize + \else\ifx\@currsize\normalsize + \large + \else\ifx\@currsize\large + \Large + \else\ifx\@currsize\Large + \LARGE + \else\ifx\@currsize\LARGE + \huge + \else\ifx\@currsize\huge + \Huge + \else\ifx\@currsize\Huge + \relax + \else + \caption@Warning{% + Cannot determine current font size.\MessageBreak + Try setting it with `size=' explicitly}% + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@hypersetup} +% |\caption@hypersetup|\marg{options}\\ +% expands to |\hypersetup|\marg{options} if defined, to nothing otherwise. +% \begin{macrocode} +\newcommand*\caption@hypersetup{\caption@ifdefined\hypersetup\hypersetup\@gobble} +\DeclareCaptionFont{hypersetup}{\caption@hypersetup{#1}} % for usage in \captionsetup{font={hypersetup=...}} +\DeclareCaptionOption{hypersetup}{\caption@hypersetup{#1}} % for usage in \captionsetup[<env>]{hypersetup=...} +% \end{macrocode} +% \end{macro} +% +% \section{Sizes} +% +% \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}} +\caption@setmapping{size}{font} +% \end{macrocode} +% +% `default' usually maps to `none'. +% \begin{macrocode} +\SetCaptionDefault{size}{none} +% \end{macrocode} +% +% \section{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}} +% \changes{v2.0}{2020/07/26}{Uses \cs{caption@decl} now} +% |\DeclareCaptionJustification|\oarg{package}\marg{name}\marg{code} +% \begin{macrocode} +\newcommand*\DeclareCaptionJustification{% +% \caption@decl@package{justification}{\caption@decl{justification}}} % Because of floatrow it isn't so easy... +% \end{macrocode} +% Unfortunately the (unmaintained) \package{floatrow} uses the old storage scheme +% of the \package{caption} package and therefore expects the justification code +% in |\caption@hj@|\meta{name} instead of |\caption@justification@|\meta{name}. +% For this reason we have to store the code for the \package{floatrow} package +% additionally, so |\flrow@FBo|\-|Align| will still work fine. +% \begin{macrocode} + \caption@withoptargs\caption@declare@justification} +% \end{macrocode} +% \begin{macrocode} +\newcommand*\caption@declare@justification[3]{% + \caption@decl@package{justification}{\caption@decl{justification}}#1{#2}{#3}% + \expandafter\let\csname caption@hj@#2\expandafter\endcsname\csname caption@justification@#2\endcsname} +\@onlypreamble\DeclareCaptionJustification +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\DeclareCaptionOption{justification}{% + \caption@load@package{justification}{#1}% + \caption@set{justification}{#1}} +% \end{macrocode} +% +% 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} +% +% `default' usually maps to `justified'. +% \begin{macrocode} +\SetCaptionDefault{justification}{justified} +% \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 |\center|\-|first| |:-)| +% \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 one 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} +% +% \section{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. +% \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|\\ +% 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} +% +% \section{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{macro}{\caption@declare@position} +% \changes{v2.0}{2020/07/26}{This macro added} +% |\caption@declare@position|\marg{name}\marg{code}\\ +% declares a captionposition setting of the given \meta{name}, +% \meta{code} must either expand to |\@first|\-|of|\-|two| (top) or +% |\@second|\-|of|\-|two| (below). +% \begin{macrocode} +\newcommand*\caption@declare@position[2]{% + \caption@decl{position}{#1}{#2}} +\@onlypreamble\caption@declare@position +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\DeclareCaptionOption{position}{\caption@setposition{#1}} +% \end{macrocode} +% \changes{v1.0a}{2004/01/09}{Options \opt{figureposition} and \opt{tableposition} added} +% \begin{macrocode} +\DeclareCaptionOption{figureposition}{\captionsetup*[figure]{position=#1}} +\@onlypreamble@key{caption}{figureposition} +% \end{macrocode} +% \begin{macrocode} +\DeclareCaptionOption{tableposition}{\captionsetup*[table]{position=#1}} +\@onlypreamble@key{caption}{tableposition} +% \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} +% \changes{v2.0}{2020/07/27}{Uses \cs{caption@set} now} +% |\caption@setposition|\marg{position}\\ +% puts |\caption@position| to the right value. +% (Note: Since this command is used by the \package{floatrow} package as well +% its syntax should not change.) +% \begin{macrocode} +\newcommand*\caption@setposition{\caption@set{position}} +% \end{macrocode} +% \end{macro} +% +% These are the pre-defined position code snippets. +% \begin{macrocode} +\caption@declare@position{t}{\@firstoftwo} +\caption@declare@position{top}{\@firstoftwo} +\caption@declare@position{above}{\@firstoftwo} +\caption@declare@position{b}{\@secondoftwo} +\caption@declare@position{bottom}{\@secondoftwo} +\caption@declare@position{below}{\@secondoftwo} +\caption@declare@position{a}{\caption@autoposition}% needed by floatrow package, \flrow@cappos +\caption@declare@position{auto}{\caption@autoposition} +% \end{macrocode} +% +% \changes{v1.1}{2007/05/08}{Default position changed from `bottom' to `auto'} +% `default' usually maps to `auto'. +% \begin{macrocode} +\SetCaptionDefault{position}{auto} +% \end{macrocode} +% +% \begin{macro}{\caption@autoposition} +% \changes{v2.0}{2020/07/27}{This macro added} +% If in doubt, `position=auto' maps to `position=below'. +% \begin{macrocode} +\let\caption@autoposition\@secondoftwo +% \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'} +% \changes{v2.0}{2020/07/27}{Adapted to current implementation of `auto'} +% |\caption@iftop|\marg{true-code}\marg{false-code}\\ +% Since version \version{2.0} this command is identical to |\caption@position|. +% \begin{macrocode} +\newcommand*\caption@iftop{\caption@position} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@fixposition} +% \changes{v1.0a}{2004/01/23}{\cs{ifvmode} added} +% \changes{v1.0b}{2004/05/16}{Split into \cs{caption@fixposition} & \cs{caption@autoposition}} +% \changes{v2.0}{2020/07/27}{Adapted to current implementation of `auto'} +% |\caption@fixposition|\\ +% We try to guess the current position of the caption by checking |\prev|\-|depth|.\par +% A different solution would be setting the |\space|\-|factor| to something +% not much less than 1000 (for example 994) in |\caption@start| and +% checking this value here by |\ifnum\space|\-|factor=994|. +% (It's implemented in the \package{threeparttable} package\cite{threeparttable} this way.)\par +% Another idea would be checking |\@if|\-|mini|\-|page|, but since some packages +% typeset the caption within a simple |\vbox| this does not seem to be a good one. +% \begin{macrocode} +\newcommand*\caption@fixposition{% + \ifvmode + \edef\caption@tempa{\the\prevdepth}% + \caption@Debug{\protect\prevdepth=\caption@tempa}% + \ifdim\prevdepth>-\p@ + \let\caption@autoposition\@secondoftwo % position=below + \else + \let\caption@autoposition\@firstoftwo % position=above + \fi + \else + \caption@Debug{no \protect\prevdepth}% + \let\caption@autoposition\@secondoftwo % position=below + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@setautoposition} +% \changes{v1.1}{2007/06/10}{This macro added} +% \changes{v2.0}{2020/07/27}{Adapted to current implementation of `auto'} +% |\caption@setautoposition|\marg{position}\\ +% replaces the above algorithm by a different one (or a fixed position setting). +% \begin{macrocode} +\newcommand*\caption@setautoposition[1]{% + \def\caption@fixposition{\caption@@set{position}{autoposition}{#1}}} +% \end{macrocode} +% \end{macro} +% +% \section{Hooks} +% +% \begin{macro}{\AtBeginCaption} +% \begin{macro}{\AtEndCaption} +% |\AtBeginCaption|\marg{code}\\ +% |\AtEndCaption|\marg{code}\\ +% These hooks can be used analogous to |\At|\-|Begin|\-|Document| and +% |\At|\-|End|\-|Document|. +% \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} +% +% \section{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 value}\\ +% sets the `list' option to either `off' or `on'. +% \begin{macrocode} +\newcommand*\caption@setlist{\caption@set@bool\caption@iflist} +% \end{macrocode} +% \begin{macrocode} +\caption@setlist{on} +% \end{macrocode} +% \end{macro} +% +% \changes{v1.4}{2011/08/30}{Option \opt{listtype=} added} +% \changes{v1.4}{2011/08/30}{Option \opt{listtype+=} added} +% \begin{macrocode} +\DeclareCaptionOption{listtype}{\caption@setlisttype{#1}} +\DeclareCaptionOption{listtype+}{\caption@setlisttype@ext{#1}} +% \end{macrocode} +% +% \begin{macro}{\caption@setlisttype} +% \changes{v1.4}{2011/08/30}{This macro added} +% |\caption@setlisttype|\marg{type}\\ +% sets the `listtype' option to the given \meta{type}. +% \begin{macrocode} +\newcommand*\caption@setlisttype{% + \caption@setlisttype@ext{}% + \caption@@setlisttype\caption@listtype} +% \end{macrocode} +% \begin{macrocode} +\newcommand*\caption@@setlisttype[2]{% + \edef#1{#2}% + \ifx#1\@empty \let#1\@undefined \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@setlisttype@ext} +% \changes{v1.4}{2011/08/30}{This macro added} +% |\caption@setlisttype@ext|\marg{type extension}\\ +% sets the `listtype' option to the given \meta{type extension}. +% \begin{macrocode} +\newcommand*\caption@setlisttype@ext{% + \caption@@setlisttype\caption@listtype@ext} +% \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}} +% \changes{v2.0}{2020/07/26}{Uses \cs{caption@decl} now} +% |\DeclareCaptionListFormat|\marg{name}\marg{code with \#1 and \#2} +% \begin{macrocode} +\newcommand*\DeclareCaptionListFormat[2]{% + \caption@decl{listformat}{#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@set{listformat}{#1}} +% \end{macrocode} +% +% There are seven pre-defined list formats. (The first five were taken from the \package{subfig} package.) +% \begin{macrocode} +\DeclareCaptionListFormat{empty}{} +\DeclareCaptionListFormat{simple}{#1#2} +\DeclareCaptionListFormat{subsimple}{#2} +\DeclareCaptionListFormat{parens}{#1(#2)} +\DeclareCaptionListFormat{subparens}{(#2)} +\DeclareCaptionListFormat{period}{#1#2.} +\DeclareCaptionListFormat{subperiod}{#2.} +% \end{macrocode} +% +% `default' usually maps to `subsimple'. +% \begin{macrocode} +\SetCaptionDefault{listformat}{subsimple} +% \end{macrocode} +% +% \begin{macro}{\caption@lstfmt} +% \changes{v2.0}{This macro added} +% To provide backward compatibility we still offer \cs{caption@lstfmt}. +% (\cs{caption@lstfmt} is used in the \package{dgruyter} package.) +% \begin{macrocode} +\newcommand*\caption@lstfmt{\caption@listformat} +% \end{macrocode} +% \end{macro} +% +% \section{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} +% +% \section{Document class support} +% \changes{v2.0}{2018/05/11}{Document class support re-written} +% +% \begin{macro}{\@makecaption@standard} +% \begin{macrocode} +% article|report|book.sty [2005/09/16 v1.4f Standard LaTeX document class] +\newcommand\@makecaption@standard[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} +\@onlypreamble\@makecaption@standard +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@makecaption@arabic} +% \begin{macrocode} +% arabicore.sty [2006/01/01 v1.0 Arabi Core switching commands (may still change)] +\newcommand\@makecaption@arabic[2]{% + \vskip\abovecaptionskip + \sbox\@tempboxa{#1: #2}% + \sbox\@Arabitempboxa{\textRL{#2} : #1}% + \if@rl{ + \ifdim \wd\@Arabitempboxa >\hsize + \textRL{#2} : #1\par + \else + \global \@minipagefalse + \hb@xt@\hsize{\hfil\box\@Arabitempboxa\hfil}% + \fi}\else{ + \ifdim \wd\@tempboxa >\hsize + #1: #2\par + \else + \global \@minipagefalse + \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}% + \fi}\fi + \vskip\belowcaptionskip} +\@onlypreamble\@makecaption@arabic +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@makecaption@latvian} +% \begin{macrocode} +% latvian.ldf [2018/02/19 v2.0b Latvian support from the babel system] +\newcommand\@makecaption@latvian[2]{% + \vskip10\p@ + \sbox\@tempboxa{#1\if\empty#2\else: #2\fi}% + \ifdim\wd\@tempboxa>\hsize + #1: #2\par + \else + \hbox to\hsize{\hfil\box\@tempboxa\hfil}% + \fi} +\@onlypreamble\@makecaption@latvian +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@ifdocumentclass} +% Boolean switch which is set if the document class could be detected +% successfully, i.e. |\caption@document|\-|class| is set to a proper value. +% (If |\caption@document|\-|class| is already set, this flag will also be set.) +% \begin{macrocode} +\caption@setbool{documentclass}{1} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@documentclass} +% \changes{v1.8e}{2018/05/11}{This macro added} +% Determine document class used. +% Set |\caption@document|\-|class| by good-guessing, if not already set. +% \begin{macrocode} +\caption@ifundefined\caption@documentclass{% +% \end{macrocode} +% \begin{macrocode} + \@ifclassloaded{beamer}{% + \caption@InfoNoLine{beamer document class detected}% + \def\caption@documentclass{beamer}% +% \end{macrocode} +% \begin{macrocode} + }{\@ifclassloaded{elsarticle}{% + \caption@InfoNoLine{elsarticle document class detected}% + \def\caption@documentclass{elsarticle}% +% \end{macrocode} +% \begin{macrocode} + }{\@ifclassloaded{memoir}{% + \caption@InfoNoLine{memoir document class detected}% + \def\caption@documentclass{memoir}% +% \end{macrocode} +% \begin{macrocode} + }{\caption@ifdefined\scr@caption{% + \caption@InfoNoLine{KOMA-Script document class detected}% + \def\caption@documentclass{koma}% +% \end{macrocode} +% If |\@captionheadfont| is defined, we assume it's a AMS or SMF document class. +% \begin{macrocode} + }{\caption@ifdefined\@captionheadfont{% + \caption@InfoNoLine{AMS or SMF document class detected}% + \def\caption@documentclass{ams-smf}% +% \end{macrocode} +% If |\CaptionFonts| is defined, we assume it's a NTG Dutch document class. +% \begin{macrocode} + }{\caption@ifdefined\CaptionFonts{% + \caption@InfoNoLine{NTG document class detected}% + \def\caption@documentclass{ntg}% +% \end{macrocode} +% If |\cph@font| and |\cpb@font| are defined, we assume it's the thesis document class. +% \begin{macrocode} + }{\caption@ifdefined\cph@font{% + \caption@ifdefined\cpb@font\@firstoftwo\@secondoftwo + }{% + \@secondoftwo + }{% + \caption@InfoNoLine{thesis document class detected}% + \def\caption@documentclass{thesis}% + }{% +% \end{macrocode} +% If the definition of |\@make|\-|caption| matches the one from the standard +% \LaTeX\ document classes |article|, |report|, or |book|, we assume it's +% either one of them or is compatible to them. +% \begin{macrocode} + \ifx\@makecaption\@undefined + \caption@InfoNoLine{Document class w/o caption stuff detected}% + \else + \ifx\@makecaption\@makecaption@standard + \caption@InfoNoLine{Standard document class detected}% + \else + \ifx\@makecaption\@makecaption@arabic + \caption@InfoNoLine{arabic babel option detected}% + \else + \ifx\@makecaption\@makecaption@latvian + \caption@InfoNoLine{latvian babel option detected}% + \else +% \end{macrocode} +% Otherwise we are clueless and use standard default settings for the captions. +% (And we unset the |document|\-|class| flag to indicate that the content of +% |\caption@document|\-|class| is not correct.) +% \begin{macrocode} + \caption@InfoNoLine{% + Unknown document class (or package),\MessageBreak + standard defaults will be used}% + \caption@InfoNoLine{\string\@makecaption\space=\space\meaning\@makecaption\@gobble}% + \caption@setbool{documentclass}{0}% unknown document class + \fi + \fi + \fi + \fi +% \end{macrocode} +% \begin{macrocode} + \let\caption@documentclass\@empty % don't load adaption code later on + }}}}}}}% +}{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\AtCaptionPackage} +% \changes{v2.0}{2018/05/14}{This macro added} +% |\AtCaptionPackage|\marg{code}\\ +% can be used by the document class adaption packages to execute extra code +% if the \package{caption} package is loaded (later on). +% This code will by applied right before the package options are evaluated. +% \begin{macrocode} +\newcommand*\AtCaptionPackage{% + \g@addto@macro\caption@documentclass@code} +\@onlypreamble\AtCaptionPackage +% \end{macrocode} +% \begin{macrocode} +\providecommand*\caption@documentclass@code{} +\@onlypreamble\caption@documentclass@code +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\AfterCaptionPackage} +% \changes{v2.1}{2020/09/12}{This macro added} +% |\AfterCaptionPackage|\marg{code}\\ +% can be used by the document class adaption packages to execute extra code +% if the \package{caption} package is loaded (later on). +% This code will by applied at the very end. +% \begin{macrocode} +\newcommand*\AfterCaptionPackage{% + \g@addto@macro\caption@endtitles@code} +\@onlypreamble\AfterCaptionPackage +% \end{macrocode} +% \begin{macrocode} +\providecommand*\caption@endtitles@code{} +\@onlypreamble\caption@endtitles@code +% \end{macrocode} +% \end{macro} +% +% \section{Babel support} +% +% \begin{macro}{\caption@IfBabelPackageLoaded} +% |\caption@IfBabelPackageLoaded|\marg{option}\marg{cmd}\marg{yes-code}\marg{no-code}\\ +% expands the given \meta{yes-code} if |\caption@if|\-|babel@|\meta{option} +% is set and \meta{cmd} is defined. +% Otherwise the \meta{no-code} is expanded.\par +% This way the adaption could be prevented by defining +% \begin{quote}|\def\caption@ifbabel@|\meta{option}|{false}|\end{quote} +% \begin{macrocode} +\newcommand*\caption@IfBabelPackageLoaded[4]{% + \caption@ifdefined#2\@firstofone\caption@AtBeginDocument{% + \caption@if@bool{\@nameuse{caption@ifbabel@#1}}% + {\def\caption@tempa{\caption@ifdefined#2}}% + {\let\caption@tempa\@secondoftwo}% + \caption@tempa + {\caption@InfoNoLine{#1 babel package is loaded}#3}% + {#4}}} +\@onlypreamble\caption@IfBabelPackageLoaded +% \end{macrocode} +% \end{macro} +% +% \subsection{The arabic \& farsi babel option} +% \changes{v1.8}{2018/05/20}{\package{arabic} babel support added} +% \changes{v2.0}{2020/08/02}{\package{arabic} babel support updated} +% \changes{v2.0}{2020/08/02}{\package{farsi} babel support added} +% +% \begin{macrocode} +\DeclareCaptionLabelSeparator{arabi}{\if@rl\space\fi: } +% \end{macrocode} +% +% \begin{macro}{\caption@IfBabelArabi} +% |\caption@IfBabelArabic|\marg{yes-code}\marg{no-code} +% \begin{macrocode} +\newcommand*\caption@IfBabelArabi{% + \caption@IfBabelPackageLoaded{arabi}{\ArabiCoreLoaded}} +\@onlypreamble\caption@IfBabelArabi +% \end{macrocode} +% \begin{macrocode} +\providecommand*\caption@ifbabel@arabi{true} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\caption@IfBabelArabi{% +% \end{macrocode} +% +% \begin{macro}{\caption@rl} +% \changes{v1.8}{2018/05/20}{This macro added} +% \begin{macrocode} + \newcommand\caption@rl[1]{\if@rl\textRL{#1}\else\textLR{#1}\fi}% +% \end{macrocode} +% \end{macro} +% +% If the language `arabic' or `farsi' is selected, we switch the default label separator to `arabi'. +% +% \begin{macrocode} + \caption@ifdefined\extrasarabic{% + \addto\extrasarabic{% + \caption@switchdefault{labelseparator}{\babel@save #1}{arabi}}}{}% + \caption@ifdefined\extrasfarsi{% + \addto\extrasfarsi{% + \caption@switchdefault{labelseparator}{\babel@save #1}{arabi}}}{}% +% \end{macrocode} +% +% \begin{macrocode} +}{% + \let\caption@rl\@firstofone +} +% \end{macrocode} +% +% \subsection{The babel-french package} +% \changes{v1.1}{2006/05/14}{\package{frenchb} babel support added} +% \changes{v2.0}{2020/08/01}{\package{french} babel support updated} +% +% We provide a `french' caption label separator. +% |\caption@french@label|\-|separator| will be defined later on, +% dependent on the `french' package used later on. +% +% \begin{macrocode} +\DeclareCaptionLabelSeparator{french}{\caption@french@labelseparator} +% \end{macrocode} +% +% \begin{macro}{\caption@IfBabelFrench} +% |\caption@IfBabelFrench|\marg{yes-code}\marg{no-code} +% \begin{macrocode} +\newcommand*\caption@IfBabelFrench{% + \caption@IfBabelPackageLoaded{french}{\FB@makecaption}} +\@onlypreamble\caption@IfBabelFrench +% \end{macrocode} +% \begin{macrocode} +\providecommand*\caption@ifbabel@french{true} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\caption@IfBabelFrench{% +% \end{macrocode} +% +% The \package{babel-french} package uses |\Caption|\-|Separator| as label separator. +% +% \begin{macrocode} + \providecommand\caption@french@labelseparator{\CaptionSeparator}% +% \end{macrocode} +% +% Add a space before the label separator `colon' in French +% in order to avoid problems when |Auto|\-|Space|\-|Punctuation| is set to |false|. +% +% \begin{macrocode} + \ifFB@active@punct + \DeclareCaptionLabelSeparator{colon}{% + \ifFBfrench\penalty\@M\FBcolonspace\fi : }% + \fi +% \end{macrocode} +% +% We switch the default label separator to `french', dependant on the switches +% |Customise|\-|Fig|\-|Tab|\-|Captions| and |Old|\-|Fig|\-|Tab|\-|Captions|. +% +% \begin{macrocode} + \ifFBOldFigTabCaptions + \caption@ifdefined\extrasfrench{% + \addto\extrasfrench{% + \caption@switchdefault{labelseparator}{\babel@save #1}{french}}}{}% + \caption@ifdefined\extrasacadian{% + \addto\extrasacadian{% + \caption@switchdefault{labelseparator}{\babel@save #1}{french}}}{}% + \else + \ifFBCustomiseFigTabCaptions + \caption@AtBeginDocument{% + \ifFB@mainlanguage@FR + \SetCaptionDefault{labelseparator}{french}% + \fi}% + \fi + \fi +% \end{macrocode} +% +% \begin{macrocode} +}{} +% \end{macrocode} +% +% \subsection{The frenchle \& frenchpro package} +% \changes{v1.1}{2006/05/14}{\package{frenchle/pro} package support added} +% \changes{v2.0}{2020/08/01}{\package{frenchle/pro} package support updated} +% +% \begin{macro}{\caption@IfFrenchLe} +% |\caption@IfFrenchLe|\marg{yes-code}\marg{no-code} +% \begin{macrocode} +\newcommand*\caption@IfFrenchLe{% + \caption@IfBabelPackageLoaded{frenchle}{\frenchTeXmods}} +\@onlypreamble\caption@IfBabelFrenchLe +% \end{macrocode} +% \begin{macrocode} +\providecommand*\caption@ifbabel@frenchle{true} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\caption@IfFrenchLe{% +% \end{macrocode} +% +% The \package{frenchle} package uses |\caption|\-|separator| plus |\space| as label separator. +% +% \begin{macrocode} + \providecommand\caption@french@labelseparator{\captionseparator\space}% +% \end{macrocode} +% +% If the language `french' is selected, we switch the default label separator to `french', +% and switch the default font to `it' and the default label font to `up'. +% +% \begin{macrocode} + \g@addto@macro\extrasfrench{% + \caption@switchdefault{labelseparator}{\let\caption@original@labelseparator#1}{french}% + \caption@switchdefault{font}{\let\caption@original@font#1}{it}% + \caption@switchdefault{labelfont}{\let\caption@original@labelfont#1}{up}}% + \g@addto@macro\extrasenglish{% + \caption@restoredefault{labelseparator}{\caption@original@labelseparator}% + \caption@restoredefault{font}{\caption@original@font}% + \caption@restoredefault{labelfont}{\caption@original@labelfont}}% +% \end{macrocode} +% +% Since the \package{frenchle} package overwrites |\caption|\-|font| and |\caption|\-|label|\-|font| +% (within |\GOfrench|) we need to save them beforehand and restore them afterwards. +% +% \begin{macrocode} + \caption@AtBeginDocument{% + \let\captionfont@original\captionfont + \let\captionlabelfont@original\captionlabelfont}% + \g@addto@macro\GOfrench{% + \let\captionfont\captionfont@original + \let\captionlabelfont\captionlabelfont@original}% +% \end{macrocode} +% +% \begin{macrocode} +}{} +% \end{macrocode} +% +% \subsection{The babel-hungarian package} +% \changes{v1.3}{2009/03/29}{\package{magyar} babel support added} +% \changes{v1.3a}{2011/08/12}{\package{magyar} babel support revised} +% \changes{v1.8b}{2018/08/26}{\package{magyar} babel support revised} +% \changes{v2.0}{2020/08/03}{\package{magyar} babel support updated} +% +% \begin{macrocode} +\DeclareCaptionLabelFormat{magyar}{#2\bothIfSecond{.~}{#1}} +% \end{macrocode} +% +% \begin{macro}{\caption@IfBabelHungarian} +% |\caption@IfBabelHungarian|\marg{yes-code}\marg{no-code} +% \begin{macrocode} +\newcommand*\caption@IfBabelHungarian{% + \caption@IfBabelPackageLoaded{hungarian}{\magyar@opt@defaults}} +\@onlypreamble\caption@IfBabelHungarian +% \end{macrocode} +% \begin{macrocode} +\providecommand*\caption@ifbabel@hungarian{true} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\caption@IfBabelHungarian{% +% \end{macrocode} +% +% If the language `hungarian' or `magyar' is selected, +% we switch the default label format to `magyar', the default separator to `period', +% and the default list format to `subperiod'. +% +% \begin{macrocode} + \caption@ifdefined\extrashungarian{% + \addto\extrashungarian{% + \caption@switchdefault{labelformat}{\babel@save #1}{magyar}% + \caption@switchdefault{labelseparator}{\babel@save #1}{period}% + \caption@switchdefault{listformat}{\babel@save #1}{subperiod}}}{}% + \caption@ifdefined\extrasmagyar{% + \addto\extrasmagyar{% + \caption@switchdefault{labelformat}{\babel@save #1}{magyar}% + \caption@switchdefault{labelseparator}{\babel@save #1}{period}% + \caption@switchdefault{listformat}{\babel@save #1}{subperiod}}}{}% +% \end{macrocode} +% +% \begin{macrocode} +}{} +% \end{macrocode} +% +% \subsection{The latvian babel option} +% +% \begin{macrocode} +\DeclareCaptionLabelFormat{latvian}{#2\bothIfSecond{~}{#1}} +% \end{macrocode} +% +% \begin{macro}{\caption@IfBabelLatvian} +% |\caption@IfBabelLatvian|\marg{yes-code}\marg{no-code} +% \begin{macrocode} +\newcommand*\caption@IfBabelLatvian{% + \caption@IfBabelPackageLoaded{latvian}{\bbl@latvianindent}} +\@onlypreamble\caption@IfBabelLatvian +% \end{macrocode} +% \begin{macrocode} +\providecommand*\caption@ifbabel@latvian{true} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\caption@IfBabelLatvian{% +% \end{macrocode} +% +% If the language `latvian' is selected, we switch the default label format to `latvian'. +% +% \begin{macrocode} + \caption@ifdefined\extraslatvian{% + \addto\extraslatvian{% + \caption@switchdefault{labelformat}{\babel@save #1}{latvian}}}{}% +% \end{macrocode} +% +% \begin{macrocode} +}{} +% \end{macrocode} +% +% \section{Package support} +% +% \begin{macro}{\caption@ifpackageloaded} +% \changes{v2.0}{2020/07/26}{This macro added} +% |\caption@ifpackageloaded|\marg{package}\marg{yes-code}\marg{no-code}\\ +% expands the given code if the given package is (not) loaded. +% (Note: We cannot use |\@if|\-|package|\-|loaded| here since it's not +% available after |\At|\-|Begin|\-|Document|.) +% \begin{macrocode} +\newcommand*\caption@ifpackageloaded[1]{% + \expandafter\ifx\csname ver@#1.\caption@pkgextension\endcsname\relax + \expandafter\@secondoftwo + \else + \expandafter\@firstoftwo + \fi} +% \end{macrocode} +% \begin{macrocode} +\let\caption@pkgextension\@pkgextension +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@pkg@list} +% \changes{v1.4b}{2012/01/12}{This macro added} +% We used this in the past as list of packages loaded +% |\At|\-|Begin|\-|Document|. +% (Note: Old |.aux| files could contain +% |\@cons|\-|\caption@pkg@list|\-|{{|\meta{package}|}}|, +% so this macro should always be defined, even if we don't use it anymore.) +% \begin{macrocode} +\newcommand*\caption@pkg@list{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@requirepackage} +% \changes{v1.10}{2020/05/10}{This macro added} +% \changes{v2.0}{2020/07/27}{This macro revised} +% |\caption@requirepackage|\marg{package}\marg{option}\marg{value}\\ +% indicates that the given package option needs a package. +% \begin{macrocode} +\newcommand*\caption@requirepackage[2]{% + \caption@ifpackageloaded{#1}{}{\caption@@requirepackage{#1}{#2}}} +% \end{macrocode} +% \begin{macrocode} +\newcommand*\caption@@requirepackage[2]{% + \@cons\caption@packagelist{{#1}{#2}}} % load package later on +% \end{macrocode} +% \begin{macrocode} +\caption@AtBeginDocument{% + \renewcommand*\caption@@requirepackage[2]{% + \caption@Error{Option `#2' requires the `#1' package}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@packagelist} +% \changes{v1.11}{2020/05/10}{This macro added} +% We use this as list of packages loaded |\At|\-|Begin|\-|Document|. +% \begin{macrocode} +\newcommand*\caption@packagelist{} +\@onlypreamble\caption@packagelist +% \end{macrocode} +% \begin{macrocode} +\caption@AtBeginDocument{% + \def\caption@tempa{\endgroup}% + \begingroup + \def\@elt#1#2{% + \g@addto@macro\caption@tempa{% + \caption@loadpackage{#1}{#2}}}% + \caption@packagelist + \caption@tempa} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@loadpackage} +% \changes{v1.11}{2020/05/10}{This macro added} +% \changes{v2.0}{2020/07/26}{This macro revised} +% |\caption@loadpackage|\marg{package}\marg{option}\marg{value}\\ +% loads the given package immediately. +% \begin{macrocode} +\newcommand*\caption@loadpackage[2]{% + \caption@ifpackageloaded{#1}{}{\caption@@loadpackage{#1}{#2}}} +% \end{macrocode} +% \begin{macrocode} +\newcommand*\caption@@loadpackage[2]{% + \caption@Info{Option `#2' requires the `#1' package}% + \RequirePackage{#1}\relax} +% \end{macrocode} +% \begin{macrocode} +\caption@AtBeginDocument{% + \let\caption@@loadpackage\caption@@requirepackage} +% \end{macrocode} +% \end{macro} +% +% \subsection{The newfloat package} +% +% \begin{macro}{\caption@newfloat} +% \changes{v1.4b}{2012/01/12}{This macro added} +% \changes{v1.8h}{2020/01/03}{Usage of \cs{caption@ifpackageloaded} replaced by \cs{RequirePackage}} +% \changes{v1.11}{2020/05/10}{Usage of \cs{RequirePackage} replaced by \cs{caption@usepackage}} +% \changes{v2.0}{2020/07/27}{This macro revised} +% |\caption@newfloat|\marg{option}\marg{value}\marg{code}\\ +% loads the \package{newfloat} package and executes the given code afterwards. +% (Note: Since the package might use the crappy \package{keyval} +% package, too, we need to save \& restore some macros here, otherwise this +% recursion won't work properly.) +% \begin{macrocode} +\newcommand*\caption@newfloat[2]{% + \IfCaptionOptionCheck + {\caption@requirepackage{newfloat}{#1}}% + {\let\KV@prefix@ORI\KV@prefix + \let\@tempc@ORI\@tempc + \caption@loadpackage{newfloat}{#1}% + #2% + \let\@tempc\@tempc@ORI + \let\KV@prefix\KV@prefix@ORI}} +% \end{macro} +% \end{macrocode} +% \end{macro} +% +% \changes{v1.0c}{2004/08/03}{Options \opt{figurename} and \opt{tablename} added} +% \changes{v1.1}{2007/07/04}{Options \opt{figurename} and \opt{tablename} re-written} +% \changes{v1.2}{2007/11/18}{Option \opt{name} added} +% \begin{macrocode} +\DeclareCaptionOption{figurename}{\caption@SetName{figure}{#1}} +\@onlypreamble@key{caption}{figurename} +\DeclareCaptionOption{tablename}{\caption@SetName{table}{#1}} +\@onlypreamble@key{caption}{tablename} +% \end{macrocode} +% +% \changes{v1.2a}{2008/02/28}{Options \opt{listfigurename} and \opt{listtablename} added} +% \begin{macrocode} +\DeclareCaptionOption{listfigurename}{\caption@SetName{listfigure}{#1}} +\@onlypreamble@key{caption}{listfigurename} +\DeclareCaptionOption{listtablename}{\caption@SetName{listtable}{#1}} +\@onlypreamble@key{caption}{listtablename} +% \end{macrocode} +% +% \begin{macro}{\caption@SetName} +% \changes{v1.1}{2007/07/04}{This macro added} +% \changes{v1.2}{2007/11/18}{After-preamble variant added} +% \changes{v1.2a}{2008/02/28}{Renamed from \cs{caption@SetFloatName} to \cs{caption@SetName}} +% \changes{v1.2b}{2008/08/02}{Bugfix: Works now without \cs{addto}, too} +% \changes{v1.4a}{2011/10/29}{Outsourced to \package{newfloat} package} +% \changes{v1.4b}{2012/01/12}{Bugfix: Uses \cs{caption@newfloat} now} +% |\caption@SetName|\marg{float}\marg{name}\\ +% loads the \package{newfloat} package and uses |\newfloat@set|\-|name|. +% \begin{macrocode} +\newcommand*\caption@SetName[2]{% + \caption@newfloat{#1name}{\newfloat@setname{#1}{#2}}} +\@onlypreamble\caption@SetName +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\DeclareCaptionOption{name}{% + \IfCaptionOptionCheck{}{\caption@setname\@captype{#1}}} +% \end{macrocode} +% +% \begin{macro}{\caption@setname} +% |\caption@setname|\marg{float}\marg{name}\\ +% sets the given float name, e.g.: `Figure` for `figure`. +% \begin{macrocode} +\newcommand*\caption@setname[2]{% + \@namedef{#1name}{#2}} +% \end{macrocode} +% \end{macro} +% +% \changes{v1.2}{2007/12/21}{Options \opt{figurewithin} and \opt{tablewithin} added} +% \changes{v1.2e}{2010/01/09}{The \opt{within} options are now available within the document, too} +% +% \begin{macrocode} +\DeclareCaptionOption{figurewithin}{\caption@within{figure}{#1}} +\DeclareCaptionOptionNoValue{figurewithout}{\caption@within{figure}{none}} +\DeclareCaptionOption{tablewithin}{\caption@within{table}{#1}} +\DeclareCaptionOptionNoValue{tablewithout}{\caption@within{table}{none}} +% \end{macrocode} +% +% \begin{macro}{\caption@within} +% \changes{v1.2}{2007/12/21}{This macro added} +% \changes{v1.4a}{2011/10/29}{Outsourced to \package{newfloat} package} +% \changes{v1.4b}{2012/01/12}{Bugfix: Uses \cs{caption@newfloat} now} +% |\caption@within|\marg{float}\marg{value}\\ +% loads the \package{newfloat} package and uses |\newfloat@set|\-|within|. +% \begin{macrocode} +\newcommand*\caption@within[2]{% + \caption@newfloat{#1within=#2}{\newfloat@setwithin{#1}{#2}}} +% \end{macrocode} +% \end{macro} +% +% \changes{v1.2b}{2008/04/13}{Option \opt{within} added} +% \changes{v1.2e}{2010/01/09}{The global \opt{within} option will now affect user-defined floats declared with \cs{DeclareCaptionType}, too} +% +% \begin{macrocode} +\DeclareCaptionOption{within}{% + \caption@newfloat{within=#1}{\newfloatsetup{within=#1}}} +\DeclareCaptionOptionNoValue{without}{% + \caption@newfloat{without}{\newfloatsetup{without}}} +% \end{macrocode} +% +% \subsection{The ragged2e package} +% \changes{v1.0b}{2004/05/16}{Improved \package{ragged2e} package support} +% \changes{v1.8h}{2020/01/03}{Revised \package{ragged2e} package support} +% \changes{v1.9}{2020/05/05}{Enhanced \package{ragged2e} package support} +% \changes{v1.10}{2020/05/10}{Revised \package{ragged2e} package support} +% +% We support the upper-case commands offered by the \package{ragged2e} +% package. +% \begin{macrocode} +\DeclareCaptionJustification[ragged2e]{Justified}{\justifying} +\DeclareCaptionJustification[ragged2e]{Centering}{\Centering} +\DeclareCaptionJustification[ragged2e]{RaggedLeft}{\RaggedLeft} +\DeclareCaptionJustification[ragged2e]{RaggedRight}{\RaggedRight} +% \end{macrocode} +% +% \subsection{The sansmath package} +% \changes{v1.3}{2011/01/01}{\package{sansmath} package support added} +% \changes{v1.10}{2020/05/10}{\package{sansmath} package support revised} +% +% \begin{macrocode} +\DeclareCaptionFont[sansmath]{sansmath}{\sansmath} +% \end{macrocode} +% +% \subsection{The setspace package} +% \changes{v1.0n}{2007/04/02}{\package{setspace} package support added} +% \changes{v1.2d}{2009/10/09}{\package{setspace} package support revised} +% +% \begin{macrocode} +\DeclareCaptionFont{singlespacing}{% + \caption@ifdefined\setspace@singlespace{% + \setstretch\setspace@singlespace}{}}% normally 1 +\DeclareCaptionFont[setspace]{onehalfspacing}{\onehalfspacing} +\DeclareCaptionFont[setspace]{doublespacing}{\doublespacing} +\DeclareCaptionFont[setspace]{stretch}{\setstretch{#1}} +% \end{macrocode} +% +% \subsection{The subfig package} +% \changes{v1.1}{2007/07/07}{Adaptions to the \package{subfig} package added} +% \changes{v1.4a}{2011/11/01}{Test for the \package{subfig} package revised} +% \changes{v2.0a}{2020/09/07}{Re-definition of \cs{sf@ifpositiontop} added} +% +% Since the \package{subfig} package is not maintained anymore, +% we have to make adaptions to \thispackage~\version{1.1} here. +% Please note that we only support the version $1.3$ of the \package{subfig} package, +% so older versions do not work with this version of \thispackage, and newer +% versions are expected to be adapted. +% +% \begin{macrocode} +\caption@AtBeginDocument{% + \def\@tempa{2005/06/28 ver: 1.3 subfig package}% + \expandafter\ifx\csname ver@subfig.sty\endcsname\@tempa + \caption@InfoNoLine{subfig package v1.3 is loaded}% +% \end{macrocode} +% \begin{macrocode} + \def\caption@eh{\caption@@eh{subfig}}% + \let\caption@setfloattype\@gobble + \let\@dottedxxxline\sf@NEW@dottedxxxline + \let\sf@subfloat\sf@NEW@subfloat + \let\sf@ifpositiontop\caption@iftop +% \end{macrocode} +% \begin{macrocode} + \fi + \let\sf@NEW@dottedxxxline\@undefined + \let\sf@NEW@subfloat\@undefined} +% \end{macrocode} +% +% \begin{macro}{\@dottedxxxline} +% New version of |\@dottedxxxline| +% \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} +% \end{macro} +% +% \begin{macro}{\sf@subfloat} +% \changes{v1.4b}{2011/12/29}{Bugfix 11-12-23: Usage of \cs{caption@warmup} added} +% New version of |\sf@subfloat| +% \begin{macrocode} +\def\sf@NEW@subfloat{% + \begingroup + \@nameuse{caption@warmup}% + \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\relax + \fi + \refstepcounter{sub\@captype}% + \setcounter{sub\@captype @save}{\value{sub\@captype}}% + \@ifnextchar [% %] match left bracket + {\sf@@subfloat}% + {\sf@@subfloat[\@empty]}} +% \end{macrocode} +% \end{macro} +% +% Make the \package{subfig} package documentation compile. +% \begin{macrocode} +\DeclareCaptionOption{lofdepth}[2]{\caption@ifdefined\c@lofdepth{\setcounter{lofdepth}{#1}}{}} +\DeclareCaptionOption{lotdepth}[2]{\caption@ifdefined\c@lotdepth{\setcounter{lotdepth}{#1}}{}} +% \end{macrocode} +% +% \section{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} +% \changes{v1.4}{2011/08/19}{Split into three macros} +% \changes{v1.4}{2011/08/30}{Support for option \opt{listtype=} added} +% \changes{v1.5}{2012/01/15}{Usage of \cs{caption@addsubcontentslines} added} +% \changes{v1.7}{2015/09/15}{Argument \#3 which holds the environment name added to \cs{caption@lstfmt}} +% \changes{v1.7}{2015/09/20}{Unfortunately \package{subfig} defines and uses \cs{caption@lstfmt} as well, so I replaced the third argument with \cs{captionlisttype}} +% \changes{v1.8}{2018/09/06}{Adapted to the \package{chkfloat} package} +% |\caption@addcontentsline|\marg{type}\marg{list entry}\\ +% makes an entry in the list-of-whatever, if requested, i.e.~the argument +% \meta{list entry} is not empty and |list|\-|of=| was set to |true|. +% \begin{macrocode} +\newcommand\caption@addcontentsline[2]{% + \caption@ifcontentsline{#2}{% + \begingroup + \let\@tempa\@gobble + \caption@ifdefined\caption@listtype + {\let\@tempa\@firstofone}% + {\edef\caption@listtype{#1}}% + \caption@ifdefined\caption@listtype@ext + {\edef\caption@listtype{\caption@listtype\caption@listtype@ext}% + \let\@tempa\@firstofone}% + {}% + \@tempa + {\caption@Debug{addcontentsline: #1 => \caption@listtype}% +% \caption@setoptions\caption@listtype + \@namedef{the\caption@listtype}{\@nameuse{the#1}}}% + \expandafter\caption@@addcontentsline\expandafter{\caption@listtype}{#2}% + \endgroup}% + \caption@addsubcontentslines{#1}} +% \end{macrocode} +% \begin{macrocode} +\newcommand\caption@@addcontentsline[2]{% + {\let\\\space + \@ifundefined{ext@#1}% + {\caption@Error{No float type '#1' defined}}% + {\def\captionlisttype{#1}% + \caption@add@contentsline + {\csname ext@#1\endcsname}% + {#1}% + {\caption@listformat{\@nameuse{p@#1}}{\@nameuse{the#1}}}% + {\ignorespaces #2}% + \caption@chkfloat{#1}{#2}}}} +% \end{macrocode} +% \begin{macrocode} +\newcommand*\caption@add@contentsline{% + \caption@@@addcontentsline} +% \end{macrocode} +% \begin{macrocode} +\newcommand*\caption@@@addcontentsline[4]{% +% \caption@ifdefined\main@Arabi@language +% {\addtocontents{#1}{\xstring\select@language{\main@Arabi@language}}}{}% + \addcontentsline{#1}{#2}{\protect\numberline{#3}{#4}}} +% \end{macrocode} +% \begin{macrocode} +\let\caption@chkfloat\@gobbletwo +% \end{macrocode} +% \begin{macrocode} +\newcommand\caption@ifcontentsline[1]{% + \caption@iflist + {\def\@tempa{#1}}% + {\let\@tempa\@empty}% + \ifx\@tempa\@empty + \expandafter\@gobble + \else + \expandafter\@firstofone + \fi} +% \end{macrocode} +% \begin{macrocode} +\newcommand*\caption@addsubcontentslines[1]{} +% \end{macrocode} +% \end{macro} +% +% \section{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@aboveskip} +% \begin{macro}{\caption@belowskip} +% \changes{v2.0}{2020/08/23}{This macro moved from package to kernel} +% |\caption@aboveskip| and |\caption@belowskip|\\ +% typeset the skip above resp.~below the caption. +% \begin{macrocode} +\newcommand*\caption@aboveskip{% + \vskip\abovecaptionskip} +% \end{macrocode} +% \begin{macrocode} +\newcommand*\caption@belowskip{% + \vskip\belowcaptionskip} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\caption@fnum} +% \changes{v1.1}{2007/08/21}{This macro added} +% \changes{v2.0}{2020/08/03}{The original definition will be stored in \cs{caption@original@fnum}} +% |\caption@fnum|\marg{float type}\\ +% typesets the caption label; this acts as replacement for |\fnum@|\meta{float type}. +% \begin{macrocode} +\newcommand*\caption@fnum[1]{% + \expandafter\let\expandafter\caption@original@fnum\csname caption@fnum@#1\endcsname % for label format `original' + \caption@labelformat{\@nameuse{#1name}}{\@nameuse{the#1}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@make} +% |\caption@make|\marg{float name}\marg{ref.\ number}\marg{text}\\ +% typesets the caption. +% \begin{macrocode} +\newcommand\caption@make[2]{\caption@@make{\caption@labelformat{#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@ifhmode} 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} +% \changes{v1.5}{2012/03/15}{Uses \cs{caption@tempdima} instead of \cs{@tempdima}} +% \changes{v1.5}{2012/12/26}{max-margin stuff moved to \cs{caption@calcmargin}} +% \changes{v1.6}{2013/05/01}{Usage of \cs{caption@box} added} +% \changes{v1.7}{2016/01/31}{Adapted to the \package{bicaption} package} +% \changes{v1.8f}{2019/12/18}{Usage of \cs{linewidth} replaced by \cs{hsize}} +% |\caption@@make|\marg{caption label}\marg{caption text} +% \begin{macrocode} +\newcommand\caption@@make[2]{% + \begingroup + \caption@@make@{#1}{#2}% + \endgroup + \caption@@make@epilogue} +% \end{macrocode} +% \begin{macrocode} +\newcommand\caption@@make@[2]{% + \caption@stepthecounter + \caption@beginhook +% \end{macrocode} +% Typeset the outer box |\caption@box| +% \begin{macrocode} + \caption@box\hsize{% +% \end{macrocode} +% Special single-line treatment (option |singlelinecheck=|) +% \begin{macrocode} + \caption@singlelinecheck{\caption@slc{#1}{#2}\caption@singleline\caption@multiline}{\caption@multiline}% +% \end{macrocode} +% Typeset the left margin (option |margin=|) +% \begin{macrocode} + \caption@calcmargin + \caption@tempdima\captionmargin + \ifdim\captionmargin@=\z@ \else + \caption@ifoddpage{}{\advance\caption@tempdima\captionmargin@\relax}% + \fi + \caption@ifhmode{\advance\caption@tempdima\caption@indent\relax}% + \hspace\caption@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} + \caption@tempdima\captionwidth + \caption@ifhmode{\advance\caption@tempdima-\caption@indent\relax}% + \caption@parbox\caption@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@ifhmode{% + \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} + \caption@tempdima\captionmargin + \ifdim\captionmargin@=\z@ \else + \caption@ifoddpage{\advance\caption@tempdima\captionmargin@\relax}{}% + \fi + \hspace\caption@tempdima +% \end{macrocode} +% Close the outer box |\caption@box| +% \begin{macrocode} + }% +% \end{macrocode} +% \begin{macrocode} + \caption@endhook} +% \end{macrocode} +% \begin{macrocode} +\newcommand\caption@@make@epilogue{% + \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}} +% \changes{v1.5}{2012/12/26}{max-margin stuff moved from \cs{caption@@make} to here} +% \changes{v1.8f}{2019/12/18}{Usage of \cs{linewidth} replaced by \cs{hsize}} +% |\caption@calcmargin|\\ +% calculates |\caption|\-|margin| and |\caption|\-|width|, so both contain +% valid values. +% \begin{macrocode} +\newcommand*\caption@calcmargin{% + \caption@calcmargin@hook +% \end{macrocode} +% Check margin, if |\caption@min|\-|margin| or |\caption@max|\-|margin| is set +% \begin{macrocode} + \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} +% \begin{macrocode} + \ifdim\captionwidth=\z@ + \captionwidth\hsize\relax + \advance\captionwidth by -2\captionmargin\relax + \advance\captionwidth by -\captionmargin@\relax + \else + \captionmargin\hsize\relax + \advance\captionmargin by -\captionwidth\relax + \divide\captionmargin by 2\relax + \captionmargin@\z@\relax + \fi +% \end{macrocode} +% \begin{macrocode} + \caption@Debug{% + \string\hsize=\the\hsize, + \string\captionwidth=\the\captionwidth,\MessageBreak + \string\captionmargin=\the\captionmargin, + \string\captionmargin@=\the\captionmargin@}% +% \end{macrocode} +% \begin{macrocode} +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@slc} +% \changes{v1.1}{2007/06/13}{\cs{let}\cs{caption@justification}\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}{\cs{caption@setup}\cs{caption@opt@SingleLine} outsourced to \cs{caption@SingleLine}} +% \changes{v1.3}{2010/09/04}{Split into \cs{caption@slc} and \cs{caption@@slc}} +% \changes{v1.5}{2012/12/26}{Merged into a single macro again} +% \changes{v1.5}{2013/04/14}{Usage of \cs{ifsinglelinecaption} added} +% |\caption@slc|\marg{label}\marg{text}\marg{single-line-code}\marg{multi-line-code}\\ +% This one does the single-line-check. +% \begin{macrocode} +\newcommand\caption@slc[4]{% + \caption@Debug{Begin SLC}% + \singlelinecaptiontrue + \begingroup + \caption@singleline + \let\caption@justification\relax + \caption@calcmargin % calculate \captionwidth + \caption@prepareslc + \sbox\@tempboxa{\caption@@@make{#1}{#2}}% + \ifdim\wd\@tempboxa>\captionwidth + \endgroup + \singlelinecaptionfalse + #4% + \else + \endgroup + #3% + \fi + \caption@Debug{End SLC}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ifsinglelinecaption} +% \changes{v1.5}{2013/04/14}{This definition added} +% |\ifsinglelinecaption|\\ +% could be used inside own caption formats to test if the caption is +% currently typeset as single-line caption (or not). +% \begin{macrocode} +\newif\ifsinglelinecaption +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@singleline} +% \changes{v1.1c}{2007/10/14}{This macro extracted from \cs{caption@slc}} +% \changes{v1.1c}{2007/10/14}{Support of \cs{caption@slfmt} added} +% \changes{v1.1d}{2007/10/23}{This macro renamed from \cs{caption@SingleLine} to \cs{caption@singleline} for consistency} +% |\caption@singleline|\\ +% prepares the typesetting of a single-line caption. +% \begin{macrocode} +\newcommand*\caption@singleline{% + \caption@xsetup\caption@slsty % Note: This could change \caption@format + \caption@format % defines \caption@ifhmode, \caption@slfmt, and \caption@fmt + \let\caption@fmt\caption@slfmt} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@multiline} +% \changes{v2.0}{2020/07/28}{This macro added} +% |\caption@multiline|\\ +% prepares the typesetting of a multi-line caption. +% \begin{macrocode} +\newcommand*\caption@multiline{% + \caption@format} % defines \caption@ifhmode, \caption@slfmt, and \caption@fmt +% \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@justification}\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@justification}\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} +% \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} +% \changes{v1.4a}{2011/10/22}{Redefinition of \cs{footnote} revised} +% \changes{v1.5}{2013/04/13}{Redefinition os \cs{glsunset} added} +% \changes{v1.8}{2018/01/21}{Redefinition of \cs{endnote} added (thanks to Markus Kohm)} +% \changes{v1.8}{2018/05/16}{Redefinition of \cs{acused} added} +% \changes{v1.8}{2018/05/26}{Definition method changed so it can be pre-defined by other packages} +% \changes{v1.8}{2018/05/27}{Redefinition of \cs{hypertarget} added} +% |\caption@prepareslc|\\ +% re-defines anything which could disturb the single-line-check. +% \begin{macrocode} +\providecommand*\caption@prepareslc{} +\g@addto@macro\caption@prepareslc{% + \let\label\caption@gobble + \let\hypertarget\@gobbletwo +% \end{macrocode} +% We re-define \cs{footnote} so +% \begin{enumerate} +% \item The footnote counter will not be increased twice (but still the +% correct footnote mark will be used within the single-line-check) +% \item The footnote text will not be evaluated twice +% \end{enumerate} +% \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\caption@footnotetext@ORI\@footnotetext + \let\@footnotetext\caption@gobble +% \end{macrocode} +% Same for \cs{endnote} +% \begin{macrocode} + \let\caption@endnote@ORI\endnote + \def\endnote{\caption@withoptargs\caption@endnote}% + \let\caption@endnotemark@ORI\endnotemark + \def\endnotemark{\caption@withoptargs\caption@endnotemark}% + \let\caption@endnotetext@ORI\@endnotetext + \let\@endnotetext\caption@gobble +% \end{macrocode} +% Adaption to the \package{acronym} package\par +% See also \url{https://tex.stackexchange.com/questions/428788} +% \begin{macrocode} + \let\acused\@gobble + \let\AC@placelabel\@gobble +% \end{macrocode} +% Adaption to the \package{glossaries} package.\par +% Please note that while this adaption is usually sufficient +% it could give incorrect measuring results if \cs{gls} is both used +% for the very first time and more than once (for a particular acronym). +% The alternative would be using internal macros of the +% \package{glossaries} package which I would like to avoid.\par +% See also \url{https://tex.stackexchange.com/questions/108368} +% \begin{macrocode} + \let\glsunset\@gobble +% \end{macrocode} +% \begin{macrocode} +} +% \end{macrocode} +% \begin{macrocode} +\newcommand\caption@footnote[2]{% + \caption@footnotemark{#1}} +% \end{macrocode} +% \begin{macrocode} +\newcommand\caption@footnotemark[1]{% + \begingroup + \let\stepcounter\caption@l@stepcounter + \caption@footnotemark@ORI#1\relax + \endgroup} +% \end{macrocode} +% \begin{macrocode} +\newcommand\caption@endnote[2]{% + \caption@endnotemark{#1}} +% \end{macrocode} +% \begin{macrocode} +\newcommand\caption@endnotemark[1]{% + \begingroup + \let\stepcounter\caption@l@stepcounter + \caption@endnotemark@ORI#1\relax + \endgroup} +% \end{macrocode} +% \begin{macrocode} +\newcommand*\caption@l@stepcounter[1]{% + \advance\csname c@#1\endcsname\@ne\relax} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@applyfont} +% \changes{v1.3}{2010/09/04}{This macro added} +% |\caption@applyfont|\\ +% applies the relevant font settings, i.e. by default +% the options set by |justification=|, |font=|, and |size=|. +% \begin{macrocode} +\newcommand*\caption@applyfont{% + \caption@justification\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@textformat} 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} +% \changes{v1.7}{2016/02/01}{Bugfix: \cs{relax} added before \cs{caption@lsep} so the label separator will not be gobbled if the label font command ignores spaces, e.g. by usage of \cs{color}} +% \changes{v1.8}{2018/09/12}{\cs{par} replaced by \cs{caption@textend}} +% \changes{v2.2c}{2020/10/10}{Usage of the label separators \opt{gobble} and \opt{gobbletwo} added} +% \changes{v2.2e}{2020/10/21}{Adaptions to \package{floatrow} package added} +% |\caption@@@make|\marg{caption label}\marg{caption text}\\ +% This one finally typesets the caption paragraph, without margin and indention. +% \begin{macrocode} +\newcommand\caption@@@make[2]{% +% \end{macrocode} +% The \package{floatrow} package uses |\caption@@@make|, too, +% but without using |\caption@single|\-|line| or |\caption@multi|\-|line|. +% For this reason we must expand |\caption@format| if |\caption@fmt| isn't defined yet. +% Furthermore it uses |\caption@lfmt| as argument which was renamed to +% |\caption@label|\-|format| in \package{caption3}\version{2.0}. +% \begin{macrocode} + \ifx\caption@fmt\@undefined\caption@format\fi + \let\caption@lfmt\caption@labelformat +% \end{macrocode} +% If the label is empty, we use the label separator `none'. +% Futhermore we use this check to determine if |#1| ends with either +% |\@gobble|, |\@gobble|\-|two|, and/or |\ignore|\-|spaces|. +% If yes, we use the corresponding label separator. +% \begin{macrocode} + \global\def\caption@tempa{gobbletwo}% + \global\def\caption@tempb{}% + \sbox\@tempboxa{% + \let\caption@ignorespaces\ignorespaces + \def\ignorespaces{% + \global\def\caption@tempb{two}% "gobble" -> "gobbletwo" if \ignorespaces is used addtionally + \caption@ignorespaces}% + #1% + {\global\let\caption@tempa\@undefined\aftergroup\@gobble}% + {\global\def\caption@tempa{gobble\caption@tempb}}}% + \ifdim\wd\@tempboxa=\z@ + \gdef\caption@tempa{none}% +% \@capbreakfalse + \fi + \ifx\caption@tempa\@undefined \else + \@expandtwoargs\caption@set{labelseparator}{\caption@tempa}% + \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}{% + \caption@set{labelseparator}{none}% + \caption@set{textformat}{simple}% +% \@capbreakfalse +% \let\caption@ifstrut\@secondoftwo + }% +% \end{macrocode} +% \begin{macrocode} + \caption@labelseparator % defines \caption@iflabelfont, \caption@labelsep and \caption@labelsep@name (the latter is needed by \caption@fmt) +% \end{macrocode} +% Take care that |\caption@par|\-|indent| and |\caption@hang|\-|indent| +% 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 + \begingroup + \captionlabelfont + #1\relax\relax + \endgroup + \fi}% + {\ifcaption@star\else + \begingroup + \caption@iflabelfont\captionlabelfont + \relax\caption@labelsep + \endgroup + \fi}% + {{\captiontextfont + \caption@textstart + \caption@ifstrut + {\vrule\@height\ht\strutbox\@width\z@}% + {}% + \nobreak\hskip\z@skip % enable hyphenation + \caption@textformat{#2}% +% \caption@ifstrut{\vrule\@height\z@\@depth\dp\strutbox\@width\z@}{}% + \caption@ifstrut + {\ifhmode\@finalstrut\strutbox\fi}% + {}% + \caption@textend}}} +% \end{macrocode} +% \begin{macrocode} +\newcommand*\caption@textstart{} +\newcommand*\caption@textend{\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{yes-code}\\ +% 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|\\ +% will be expanded with every |\par| inside the caption. +% \begin{macrocode} +\newcommand*\caption@@par{% + \parindent\caption@parindent\hangindent\caption@hangindent}% +% \end{macrocode} +% \end{macro} +% +% \section{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} +% \changes{v1.4a}{2011/10/29}{Outsourced to \package{newfloat} package} +% |\DeclareCaptionType|\oarg{options}\marg{environment}\oarg{name}\oarg{list name}\\ +% loads the \package{newfloat} package and uses |\Declare|\-|Floating|\-|Environment|. +% \begin{macrocode} +\newcommand*\DeclareCaptionType{% + \caption@loadpackage{newfloat}{declare type}% + \DeclareFloatingEnvironment} +\@onlypreamble\DeclareCaptionType +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ForEachCaptionType} +% \changes{v1.4a}{2011/10/29}{This macro added} +% \changes{v1.13}{2020/07/29}{Renamed from \cs{caption@ForEachType} to \cs{ForEachCaptionType} and starred variant added} +% |\ForEachCaptionType*|\marg{code with \#1}\\ +% will execute the given code for each (known) floating environment. +% The starred variant will only work for already existing environments, +% i.e.~no hook will be placed inside |\Declare|\-|Floating|\-|Environment| +% (offered by the \package{newfloat} package). +% \begin{macrocode} +\newcommand*\ForEachCaptionType{% + \@ifstar + {\caption@foreach@type\@gobble}% + {\caption@foreach@type\@iden}} +% \end{macrocode} +% \begin{macrocode} +\newcommand\caption@foreach@type[2]{% + \caption@ifdefined\ForEachFloatingEnvironment + {\ForEachFloatingEnvironment*{#2}}% + {\def\@elt##1{#2}% + \caption@ifdefined\c@figure\@elt\@gobble{figure}% + \caption@ifdefined\c@table\@elt\@gobble{table}% + \let\@elt\relax}% + #1{\newfloat@addtohook{#2}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\newfloat@addtohook} +% |\newfloat@addtohook|\marg{code with \#1}\\ +% adds code to the hook called in |\Declare|\-|Floating|\-|Environment|.\par +% Note: We use |\provide|\-|command| instead of |\new|\-|command| here since the +% exact same code is defined in the \package{newfloat} package. +% \begin{macrocode} +\providecommand\newfloat@addtohook[1]{% + \toks@=\expandafter{\newfloat@hook{##1}#1}% + \edef\@tempa{\def\noexpand\newfloat@hook####1{\the\toks@}}% + \@tempa} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\newfloat@hook} +% Hook used in |\Declare|\-|Floating|\-|Environment|. +% \begin{macrocode} +\providecommand*\newfloat@hook[1]{} +% \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} +% \changes{v1.4}{2011/10/09}{Support of the titletoc package added} +% \changes{v1.5}{2011/12/29}{Usage of \cs{caption@addtoreset} replaced by \cs{@addtoreset}} +% \changes{v1.5}{2013/01/10}{Bugfix: Definition of autoref string corrected} +% \changes{v1.6}{2013/06/17}{Bugfix: \cs{c@tocdepth} will be set (locally) now} +% \changes{v1.8g}{2020/01/02}{Check revised if the sub-type is already defined or not} +% \changes{v1.13}{2020/07/28}{Uses \cs{caption@l@addto@list} instead of \cs{@cons} now} +% \changes{v1.13}{2020/07/29}{Usage of \cs{caption@subtype@hook} added} +% \changes{v1.13}{2020/07/29}{We don't re-use existing counters anymore (This was a bad idea anyway)} +% |\DeclareCaptionSubType*|\oarg{numbering scheme}\marg{type}\\ +% 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}}% + {\caption@@@declaresubtype{#1}{#2}{#3}{sub#3}}} +\@onlypreamble\caption@@declaresubtype +% \end{macrocode} +% \begin{macrocode} +\newcommand*\caption@@@declaresubtype[4]{% +% \end{macrocode} +% \begin{macrocode} +% Check if the sub-type was already defined by |\Declare|\-|Sub|\-|Type|. +% If not, define the counter and list entry. +% \begin{macrocode} + \caption@ifsubtype{#4}% + {\caption@Debug{Modify subtype `#4'}}% + {\caption@Debug{New subtype `#4'}% + \newcounter{#4}[{#3}]% + \@namedef{ext@#4}{\csname ext@#3\endcsname}% + \caption@declaresublistentry{#3}% + \caption@l@addto@list\caption@subtypelist{#4}% + \caption@subtype@hook{#4}}% +% \end{macrocode} +% Support of \package{titletoc} package +% \begin{macrocode} + \caption@ifdefined\contentsuse{% + \contentsuse{#4}{\csname ext@#4\endcsname}}{}% +% \end{macrocode} +% \begin{macrocode} + \@namedef{#4name}{}% + \@namedef{#4autorefname}{\csname #3autorefname\endcsname}% + #1% is \@firstoftwo in star form, and \@secondoftwo otherwise + {\@namedef{p@#4}{}% + \@namedef{the#4}{\csname the#3\endcsname.\@nameuse{#2}{#4}}}% + {\@namedef{p@#4}{\csname the#3\endcsname}% + \@namedef{the#4}{\@nameuse{#2}{#4}}}% + \@namedef{theH#4}{\csname theH#3\endcsname.\arabic{#4}}} +% \end{macrocode} +% \begin{macrocode} +\@onlypreamble\caption@@@declaresubtype +% \end{macrocode} +% \begin{macrocode} +\newcommand*\caption@declaresublistentry{% + \caption@ifdefined\l@chapter + {\caption@@declaresublistentry\l@subsection}% + {\caption@@declaresublistentry\l@subsubsection}} +\@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}}% + \expandafter\caption@@@@@@declaresublistentry + \expandafter#1\expandafter{\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{c@#2}{}{% + \ifnum ##1>\@nameuse{c@#2}\relax + \let\next\@gobblefour + \else + \c@tocdepth=\@nameuse{c@#2}\relax + \fi}% + \next}% + \fi} +\@onlypreamble\caption@@@@@@declaresublistentry +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@subtypelist} +% A list containing the sub-types defined with +% |\Declare|\-|Caption|\-|Sub|\-|Type|. +% \begin{macrocode} +\newcommand*\caption@subtypelist{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption@ifsubtype} +% \changes{v1.8g}{2020/01/02}{This macro added} +% \changes{v1.13}{2020/07/28}{Uses \cs{caption@ifin@list} now} +% |\caption@ifsubtype|\marg{yes-code}\marg{no-code}\\ +% checks if the given subtype was defined with +% |\Declare|\-|Caption|\-|Sub|\-|Type|. +% \begin{macrocode} +\newcommand*\caption@ifsubtype{% + \caption@ifin@list\caption@subtypelist} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ForEachCaptionSubType} +% \changes{v1.13}{2020/07/29}{This macro added as replacement for \cs{caption@For}} +% |\ForEachCaptionSubType*|\marg{code with \#1}\\ +% will execute the given code for each (known) sub-type. +% The starred variant will only work for already existing sub-types, +% i.e.~no hook will be placed inside |\Declare|\-|Caption|\-|Sub|\-|Type|. +% \begin{macrocode} +\newcommand*\ForEachCaptionSubType{% + \@ifstar + {\caption@foreach@subtype\@gobble}% + {\caption@foreach@subtype\@iden}} +% \end{macrocode} +% \begin{macrocode} +\newcommand\caption@foreach@subtype[2]{% + \caption@for@list\caption@subtypelist{#2}% + #1{\caption@addto@subtype@hook{#2}}} +% \end{macrocode} +% \begin{macrocode} +\providecommand\caption@addto@subtype@hook[1]{% + \toks@=\expandafter{\caption@subtype@hook{##1}#1}% + \edef\@tempa{\def\noexpand\caption@subtype@hook####1{\the\toks@}}% + \@tempa} +% \end{macrocode} +% \begin{macrocode} +\providecommand*\caption@subtype@hook[1]{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@memresetsubcounter} +% \changes{v1.5}{2013/05/01}{The macro \cs{caption@savesubcounters} added} +% \changes{v1.13}{2020/07/28}{Uses \cs{caption@for@list} now for iterating the list} +% \changes{v2.2b}{2020/10/06}{This stuff replaced by a patch of \cs{@memresetsubcounter}} +% The \class{memoir} document class resets the \texttt{subfigure} +% resp.~\texttt{subtable} counter at the begin of floating environments using +% |\@mem|\-|reset|\-|sub|\-|counter|. +% As a side-effect |\continued|\-|float| does not work correctly. +% For that reason we need to patch |\@mem|\-|reset|\-|sub|\-|counter| here, +% suppressing the counter reset if the counter was defined with +% |\Declare|\-|Caption|\-|Sub|\-|Type|. +% \begin{macrocode} +\caption@ifdefined\@memresetsubcounter + {\let\caption@memresetsubcounter\@memresetsubcounter + \renewcommand*\@memresetsubcounter[1]{% + \caption@ifsubtype{sub#1}\@gobble\caption@memresetsubcounter{#1}}}% + {} +% \end{macrocode} +% \end{macro} +% +% \section{Execution of options} +% +% \begin{macrocode} +\ifx\caption@documentclass\@empty\else + \@pushfilename + \edef\@currname{caption-\caption@documentclass} + \edef\@currext{sto} + \InputIfFileExists + {\@currname.\@currext}% + {}% + {\@missingfileerror\@currname\@currext}% + \@popfilename +\fi +% \end{macrocode} +% +% \begin{macrocode} +\captionsetup{style=default,position=default,listformat=default} +% \end{macrocode} +% \begin{macrocode} +\ProcessOptions* +% \end{macrocode} +% +% \iffalse +%</package> +% \fi +% +% \clearpage +% \begin{thebibliography}{99} +% \bibitem{TLC2} +% Frank Mittelbach and Michel Goossens:\\ +% \newblock {\em The {\LaTeX} Companion (2nd.~Ed.)},\\ +% \newblock Addison-Wesley, 2004. +% +% \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://www.ctan.org/pkg/hyperref}% +% {\emph{Hypertext marks in \LaTeX}},\\ +% November 12, 2007 +% +% \bibitem{refcount} +% Heiko Oberdiek:\\ +% \href{http://www.ctan.org/pkg/refcount}% +% {\emph{The refcount package}},\\ +% 2006/02/20 +% +% \bibitem{threeparttable} +% Donald Arseneau:\\ +% \href{http://www.ctan.org/pkg/threeparttable}% +% {\emph{Three part tables: title, tabular environment, notes}},\\ +% 2003/06/13 +% \end{thebibliography} +% +% \iffalse +% --------------------------------------------------------------------------- % +% \fi +% +% \clearpage +% \Finale +% +\endinput |