KOMA 类提供了一个选项captions=nooneline
。如果设置了此选项,则所有图形和表格的标题都会左对齐;如果没有设置,则足够短到可以放在一行中的标题会居中。
我发现,标题和表格顶部之间的距离取决于是否设置此选项:如果标题居中,它将比对齐时更靠近表格。这是一个 MWE:
\documentclass{scrbook}
\newlength{\tabwidth} % Länge für Tabellenbreite (wird bei den Tabellen gesetzt)
\KOMAoptions{%
captions=figurebelow,%
captions=tableheading,%
captions=nooneline,%
}
\setkomafont{caption}{\sffamily\mdseries\footnotesize}
\setkomafont{captionlabel}{\usekomafont{caption}\bfseries}
%----------------------------------
\begin{document}
\chapter{Test}
\setlength{\tabwidth}{.5\textwidth}
\begin{table}[!ht]
\centering
\setcapwidth{\tabwidth}
\caption{Table with short caption}\label{tab:01}
\footnotesize
\sffamily
\framebox[\tabwidth]{\centering Here would be a real table.}
\end{table}
\begin{table}[!hb]
\centering
\setcapwidth{\tabwidth}
\caption{This is a table with a very, very long caption that should span one line, and another line, perhaps even a third one.}\label{tab:02}
\footnotesize
\sffamily
\framebox[\tabwidth]{\centering Here would be another real table.}
\end{table}
\end{document}
然后注释掉captions=nooneline
,再次编译,你应该得到这样的结果:
在这两张图片中,最上面的表格最有趣。请注意,第一张图片中屏幕标尺和桌面之间有间隙,而第二张图片中标尺则紧贴在标题和表格之间?您还可以看到,对于跨多行的较长标题,此选项无效(这是可以预料到的)。
这真的是正确的行为吗,还是说这是一个错误?就我而言,如果所有标题与表格的距离相同,效果会更好。想象一下,一页上有两个浮点数:如果它们距离足够近,人们可能会认为表格的标题实际上是图形的子标题。有人知道无论captions=nooneline
设置如何都可以获得相同对齐方式的方法吗?
答案1
[lt;dr] 当文本必须放入框中时,不要检查距离;-)
详细解释:
KOMA-Script 必须将标题文本放入框中才能提供给定的功能。但 TeX 每个框只有一个基线,当您将文本放入框中时,您必须决定将基线放在哪里,在顶部还是在底部。无论您选择什么,其他距离都是不正确的。
示例代码:
\documentclass{article}
\newcommand\testtext{This is a table with a very, very long caption that should span one line, and another line, perhaps even a third one.}
\begin{document}
\testtext\testtext\testtext
\vtop{\testtext\testtext\testtext}
\testtext\testtext\testtext
\vbox{\testtext\testtext\testtext}
\testtext\testtext\testtext
\end{document}
如您所见,\vtop
将使到上一段的距离正确,但到下一段的距离不正确。\vbox
将产生相反的效果。
人们可以尝试用所谓的支柱来纠正这个问题,但如果简单地添加,\strut
结果可能会更糟:
\documentclass{article}
\newcommand\testtext{This is a table with a very, very long caption that should span one line, and another line, perhaps even a third one.}
\begin{document}
\testtext\AA{}\testtext\AA{}\testtext
\vtop{\testtext\AA{}\testtext\AA{}\testtext\strut}
\testtext\AA{}\testtext\AA{}\testtext
\vbox{\strut\testtext\AA{}\testtext\AA{}\testtext}
\testtext\AA{}\testtext\AA{}\testtext
\end{document}
问题在于\strut
,这就像用锤子来纠正这里的问题:由于它具有字体中最大字符的高度和深度,因此它通常会使距离过大而不是过小。此外,它在两个方向上操作,因此也会改变文本中行之间的距离。(更糟糕的是,我\AA{}
在文本中添加了一些。)可以使用\topstrut
resp 来纠正此问题。\bottomstrut
:
\documentclass{article}
\newcommand\testtext{This is a table with a very, very long caption that should span one line, and another line, perhaps even a third one.}
\makeatletter
\newcommand\topstrut{\vrule\@height\ht\strutbox\@width\z@}
\newcommand\bottomstrut{\@finalstrut\strutbox}
\makeatother
\begin{document}
\testtext\AA{}\testtext\AA{}\testtext
\vtop{\testtext\AA{}\testtext\AA{}\testtext\bottomstrut}
\testtext\AA{}\testtext\AA{}\testtext
\vbox{\topstrut\testtext\AA{}\testtext\AA{}\testtext}
\testtext\AA{}\testtext\AA{}\testtext
\end{document}
虽然这看起来比前面的示例文档好一些,但段落之间的距离仍然略有不同。我们可以在每个框中使用 和 来对齐\topstrut
它\bottomstrut
:
\documentclass{article}
\newcommand\testtext{This is a table with a very, very long caption that should span one line, and another line, perhaps even a third one.}
\makeatletter
\newcommand\topstrut{\vrule\@height\ht\strutbox\@width\z@}
\newcommand\bottomstrut{\@finalstrut\strutbox}
\makeatother
\begin{document}
\testtext\AA{}\testtext\AA{}\testtext
\vtop{\topstrut\testtext\AA{}\testtext\AA{}\testtext\bottomstrut}
\testtext\AA{}\testtext\AA{}\testtext
\vbox{\topstrut\testtext\AA{}\testtext\AA{}\testtext\bottomstrut}
\testtext\testtext\testtext
\end{document}
这看起来最好,因为段落之间的距离现在至少是相等的。但它们(仍然)不正确。如果你添加另一个段落(不使用框),你会看到两个普通段落之间的距离略小于其他段落之间的距离。这是使用\strut
或类似的东西时的一个主要问题,你无法修复该问题,只能尝试使其不那么烦人。
因此,主要问题在于 TeX 本身的构建。但为什么 TeX 只处理每个框的一个基线,而不是两个,一个上基线和一个下基线?这是因为 TeX 编写时的处理器能力和可用的 RAM 数量。所以我们在这里看到的是计算石器时代的遗物。
这与 KOMA-Script 有什么关系?查看\caption
KOMA-Script 的代码时,可以看到它\vbox
在内部使用并尝试使用 来校正距离\strut
。
答案2
更新
该错误已在 KOMA-Script 版本 3.21 中修复,该版本已在 CTAN、TeX Live 2016 和 MiKTeX 中使用。
这是一个KOMA-Script 版本 3.20 的已知问题(德语)。目前的官方解决方法是caption
按照我在评论中所建议的方式加载包。