标题和表格之间的距离不同(scrbook)

标题和表格之间的距离不同(scrbook)

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}

按原样编译一次,你应该得到这个结果: 标题=nooneline

然后注释掉captions=nooneline,再次编译,你应该得到这样的结果: 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{}在文本中添加了一些。)可以使用\topstrutresp 来纠正此问题。\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 有什么关系?查看\captionKOMA-Script 的代码时,可以看到它\vbox在内部使用并尝试使用 来校正距离\strut

答案2

更新

该错误已在 KOMA-Script 版本 3.21 中修复,该版本已在 CTAN、TeX Live 2016 和 MiKTeX 中使用。


这是一个KOMA-Script 版本 3.20 的已知问题(德语)。目前的官方解决方法是caption按照我在评论中所建议的方式加载包。

相关内容