如何将 KOMA-Script 中的 caption 重新定义为 captionbeside?

如何将 KOMA-Script 中的 caption 重新定义为 captionbeside?

在尝试 KOMA-Script 的功能时,我发现captionbeside。这对我来说是一个非常好的选择,因为我希望我的标题以这种方式格式化。唯一的问题是,在我的长文档中,我不想重写每个图。

所以问题是我如何才能自动改变(通过重新定义):

\begin{figure}
\includegraphics{}
\caption{Blub}
\end{figure}

被视为

\begin{figure}
\begin{captionbeside}{Blub}
\includegraphics{}
\end{captionbeside}
\end{figure}

如果有帮助,我会使用 LuaLaTeX,所以 Lua 解决方案也可以(尽管我更喜欢 LaTeX)。

完整代码示例:

\documentclass{scrartcl}
\usepackage{graphicx}

\begin{document}
    \begin{figure}
        \centering
        \includegraphics[height=10\baselineskip]{example-image}
        \caption{Test a}\label{testa}
    \end{figure}
    \begin{figure}
        \begin{captionbeside}{Test b}
            \centering
            \includegraphics[height=10\baselineskip]{example-image}
            \label{testb}
        \end{captionbeside}
    \end{figure}
\end{document}

更新:我已经重新定义figure为吞噬字幕。从这个意义上讲captionbeside,这是可行的,但它当然不会输出正确的字幕。我该如何实现这一点(使用尚未发布的宏的参数)?

\documentclass{scrartcl}
\usepackage{graphicx}

\makeatletter
\let\oldfigure\figure
\let\oldendfigure\endfigure
\renewenvironment{figure}{
    \oldfigure\let\caption\@gobble
        \begin{captionbeside}{Figure}
}{\end{captionbeside}\oldendfigure}
\makeatother

\begin{document}
    \begin{figure}
        \centering
        \includegraphics[height=10\baselineskip]{example-image}
        \caption{Test a}\label{testa}
    \end{figure}
    \begin{figure}
        \centering
        \includegraphics[height=10\baselineskip]{example-image}
        \caption{Test b}\label{testb}
    \end{figure}
\end{document}

答案1

您必须重新定义\caption(和\captionabove\captionbelow) 来存储值并将它们用作环境的参数captionbeside。在下面的示例中,我还存储了 的参数,以便在环境中而不是在参数中\label拥有 (恰好一个) 。\label\caption

\documentclass{scrartcl}
\usepackage{graphicx}
\usepackage{varwidth}
\usepackage{xparse}
\newsavebox\figurebox
\makeatletter
\let\truefigure\figure
\let\endtruefigure\endfigure
\RenewDocumentEnvironment{figure}{ o }{%
  \begin{lrbox}{\figurebox}%
    \begin{varwidth}[b]{\linewidth}
      \global\let\mandatorycaptionarg\relax
      \RenewDocumentCommand{\caption}{om}{%
        \ifx\mandatorycaptionarg\relax
          \IfNoValueTF{##1}%
            {\gdef\optionalcaptionarg{##2}}%
            {\gdef\optionalcaptionarg{##1}}%
          \gdef\mandatorycaptionarg{##2}%
        \else
          \@latex@warning{caption lost.\MessageBreak
            This implementation of `figure' supports only\MessageBreak
            one \string\caption\space per environment.\MessageBreak
            `\string\caption' ignored%
          }%
        \fi
      }%
      \RenewDocumentCommand{\label}{m}{%
        \ifx\labelarg\relax
          \gdef\labelarg{##1}%
        \else
          \@latex@warning{label lost.\MessageBreak
            This implementation of `figure' supports only\MessageBreak
            one \string\label\space per environment.\MessageBreak
            `\string\label' ignored%
          }%
        \fi
      }%
      \global\let\labelarg\relax
      \let\captionabove\caption
      \let\captionbelow\caption
}{%
    \end{varwidth}%
  \end{lrbox}%
  \def\caption{%
    \if@figurecaptionabove\expandafter\captionabove
    \else\expandafter\captionbelow\fi
  }%
  \IfNoValueTF{#1}%
    {\truefigure}%
    {\truefigure[#1]}%
  \begin{captionbeside}[\optionalcaptionarg]{\mandatorycaptionarg}%
    \usebox\figurebox
  \end{captionbeside}%
  \ifx\labelarg\relax\else\label{\labelarg}\fi%
  \endtruefigure
}
\makeatother

\begin{document}
    \begin{figure}
        \centering
        \includegraphics[height=10\baselineskip]{example-image}
        \caption{Test a\label{testB}}\label{testA}% will work
%        \caption{Onther caption}% will be ignored (see warning in log)
    \end{figure}
    \begin{truefigure}
        \begin{captionbeside}{Test b\label{testa}}% \label will work
            \centering
            \includegraphics[height=10\baselineskip]{example-image}
            \label{testb}% will not work
        \end{captionbeside}
        \label{testc}% will work
    \end{truefigure}

    See figures~\ref{testA} and \ref{testB} or \ref{testa}, \ref{testb},
    \ref{testc}.
\end{document}

如您所见,我仅解决了您示例中的 问题。但请注意,在 中,\label您不能有多个\caption或多个\label(在 之外) 。如果您需要多标题图形,则必须立即使用。\captionfiguretruefigure

如果中varwidth有垂直材料 ( ),则 有用。如果没有,您可以将其删除。\parfigure

如果您愿意,请激活注释的第二个,看看会发生什么,如果您在这样的中\caption使用多个。\captionfigure

在此处输入图片描述

我已经使用了,\RenewDocumentEnvironment因为它支持在结尾声明的一部分。您还可以向新figure环境添加其他可选参数,以将它们用作内部captionbeside环境的可选参数。\RenewDocumentEnvironment不仅限于一个可选参数。

相关内容