在尝试 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
(在 之外) 。如果您需要多标题图形,则必须立即使用。\caption
figure
truefigure
如果中varwidth
有垂直材料 ( ),则 有用。如果没有,您可以将其删除。\par
figure
如果您愿意,请激活注释的第二个,看看会发生什么,如果您在这样的中\caption
使用多个。\caption
figure
我已经使用了,\RenewDocumentEnvironment
因为它支持在结尾声明的一部分。您还可以向新figure
环境添加其他可选参数,以将它们用作内部captionbeside
环境的可选参数。\RenewDocumentEnvironment
不仅限于一个可选参数。