在 tblr 和 talltblr 环境中,文本和表格图例之间的间距不同。在 MWE 中可以观察到这种差异。
\documentclass[12pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{tabularray}
\usepackage{blindtext}
\begin{document}
\blindtext a little more text\par%
%
\begin{table}[h]
\centering
\caption{Caption 1}%
\label{TAB1}%
\begin{tblr}{colspec={%
X[c,m]%
X[c,m]%
X[c,m]%
}}%
\hline
\textbf{Column 1} &
\textbf{Column 1} &
\textbf{Column 1} \\%
\hline
416,09 & 176,20 & 56,00 \\
416,09 & 194,30 & 56,00 \\
416,09 & 336,10 & 56,00 \\
\hline
\end{tblr}
\end{table}%
%\newpage
\blindtext a little more text\par%
%
\begin{table}[h]
\centering
\begin{talltblr}[%
caption={Caption 2},
label={TAB2},
remark{a}={text}
]{%
colspec={%
X[c,m]%
X[c,m]%
X[c,m]%
},
rowhead=1}%
\hline
\textbf{Column 1} &
\textbf{Column 1} &
\textbf{Column 1} \\%
\hline
416,09 & 176,20 & 56,00 \\
416,09 & 194,30 & 56,00 \\
416,09 & 336,10 & 56,00 \\
\hline
\end{talltblr}
\end{table}
\end{document}
答案1
不但上方的空间不同,就连下方的空间也不同。
表1的标题为普通标题。表2的标题由 创建tabularray
。
您可以使用caption
包来自定义表 1 的标题:
\documentclass[12pt,a4paper]{article}
%\usepackage[utf8]{inputenc}% no more needed in up-to-date distributions
\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{caption}
\captionsetup[table]{
position=above, aboveskip=4pt,
belowskip=-2pt
}
\usepackage{tabularray}
\usepackage{blindtext}
\begin{document}
\blindtext a little more text\par%
%
\begin{table}[h]
\centering%
\caption{Caption 1}%
\label{TAB1}%
\begin{tblr}{colspec={%
X[c,m]%
X[c,m]%
X[c,m]%
}}%
\hline
\textbf{Column 1} &
\textbf{Column 1} &
\textbf{Column 1} \\%
\hline
416,09 & 176,20 & 56,00 \\
416,09 & 194,30 & 56,00 \\
416,09 & 336,10 & 56,00 \\
\hline
\end{tblr}
\end{table}%
%\newpage
\blindtext a little more text\par%
%
\begin{table}[h]
\centering
\begin{talltblr}[%
caption={Caption 2},
label={TAB2},
remark{a}={text}
]{%
colspec={%
X[c,m]%
X[c,m]%
X[c,m]%
},
rowhead=1}%
\hline
\textbf{Column 1} &
\textbf{Column 1} &
\textbf{Column 1} \\%
\hline
416,09 & 176,20 & 56,00 \\
416,09 & 194,30 & 56,00 \\
416,09 & 336,10 & 56,00 \\
\hline
\end{talltblr}
\end{table}
\end{document}
编辑:
如果您想做相反的事情(即自定义创建的标题tabularray
,使其看起来像普通标题)使用presep
并headsep
与longtblr
环境一起使用:
\documentclass[12pt,a4paper]{article}
%\usepackage[utf8]{inputenc}% no more needed in up-to-date distributionsè-
\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{tabularray}
\usepackage{blindtext}
\begin{document}
\blindtext a little more text\par%
%
\begin{table}[h]
\centering
\caption{Caption 1}%
\label{TAB1}%
\begin{tblr}{colspec={%
X[c,m]%
X[c,m]%
X[c,m]%
}}%
\hline
\textbf{Column 1} &
\textbf{Column 1} &
\textbf{Column 1} \\%
\hline
416,09 & 176,20 & 56,00 \\
416,09 & 194,30 & 56,00 \\
416,09 & 336,10 & 56,00 \\
\hline
\end{tblr}
\end{table}%
%\newpage
\blindtext a little more text\par%
%
\begin{table}[h]
\centering
\begin{longtblr}[%
presep=10pt,%vertical space between table head and the above text
caption={Caption 2},
label={TAB2},
headsep=1pt,%vertical space between table head and table body
remark{a}={text}
]{%
colspec={%
X[c,m]%
X[c,m]%
X[c,m]%
},
rowhead=1}%
\hline
\textbf{Column 1} &
\textbf{Column 1} &
\textbf{Column 1} \\%
\hline
416,09 & 176,20 & 56,00 \\
416,09 & 194,30 & 56,00 \\
416,09 & 336,10 & 56,00 \\
\hline
\end{longtblr}
\end{table}
\end{document}
答案2
我想提出一个更先进的解决方案,包括字幕间距调整和字幕格式定制。
简而言之,目标是:
- 标题、表格主体和相邻段落文本之间的间距相同;
- 相同的字幕格式(即字幕行的顺序和内容);
- 透明的 LoT 控制。
还有挑战属于:
- 不同类型的表格(例如
tblr
和talltblr
); - 使用几个影响相同文档结构的不同软件包(例如
tabularray
和caption
都可以向 LoT 添加物品); - 不同的包有不同的方式指定字幕格式参数。
数学家协会
为了说明我的解决方案,我准备了一个 MWE。它如下:
\documentclass{article}
\usepackage[a5paper]{geometry} % a5 paper
\usepackage[utf8]{inputenc} % input encoding
\usepackage[english]{babel} % localization
\usepackage{caption} % caption control
\usepackage{tabularray} % tabularray package
\usepackage[unicode=true, % unicode encoded pdf strings
colorlinks=true, % use colored links
linkcolor=black, % color of links
]{hyperref}
\captionsetup[table]
{labelsep=period, % caption separation for tables
position=t, % caption position for tables
justification=raggedright, % caption alignment for tables
singlelinecheck=off, % don't center single line table captions
aboveskip=2em} % above skip for table captions
\ExplSyntaxOn
% Tabularray theme using \captionof macro
\NewTblrTheme { captionof }
{
\DefTblrTemplate { caption } { default }
{
\addtocounter { table } { -1 }
\tl_if_empty:NTF \lTblrEntryTl
{
\captionof { table }
{ \InsertTblrText { caption } }
}
{
\captionof { table }
[ \InsertTblrText { entry } ]
{ \InsertTblrText { caption } }
}
\vspace{ -\abovecaptionskip }
}
\SetTblrTemplate { caption-lot } { empty }
}
\ExplSyntaxOff
\begin{document}
\pagestyle{empty}
\noindent
\textcolor{red}{\rule{\textwidth}{2pt}}
\textcolor{red}{Paragraph text.}
\begin{table}[!h]
\begin{talltblr}
[theme = captionof,
headsep = \abovecaptionskip,
caption = {Simple floating three part table (\texttt{captionof} theme)},
entry = {Floating \texttt{talltblr} with \texttt{captionof} theme},
label = {tab:table-simple-captionof},
note{1} = {The first note text. And a long line of dummy text.},
note{2} = {The second note text. And a long line of dummy text.}]
{colspec = {ccc},
row{1} = {font=\bfseries},
hline{1,2,Z} = {1pt},
vline{2-Y} = {1pt}}
Head:A & Head:B & Head:C \\
A1 & B1 & C1 \\
A2 & B2 & C2 \\
A3 & B3 & C3 \\
\end{talltblr}
\end{table}
\textcolor{red}{Paragraph text.}
\listoftables
\end{document}
首先,让标题向右对齐(左对齐,无连字符),并由以下元素组成:
- 本地化规则定义的对象类型(目前是“Table”字);
- 长度空间;
- 物体编号;
- 时期;
- 标题文字。
布局如下:
水平线显示文本列的整个宽度。表格前的段落和表格后的段落用于显示间距表格与相邻段落之间。下面有一个表格列表并且由单个项目组成,正如它应该的那样。
表格外层规范的前两行选择tblr
主题,并设置表格主体与其标题(由环境生成)之间的间距talltblr
。\abovecaptionskip
长度计算如下caption
取决于浮点类型的包(目前是table
)。浮点周围的间距是默认的(另请参阅回答相应长度)。
这段代码定义了环境captionof
的主题talltblr
:
\NewTblrTheme { captionof }
{
\DefTblrTemplate { caption } { default }
{
\addtocounter { table } { -1 }
\tl_if_empty:NTF \lTblrEntryTl
{
\captionof { table }
{ \InsertTblrText { caption } }
}
{
\captionof { table }
[ \InsertTblrText { entry } ]
{ \InsertTblrText { caption } }
}
\vspace{ -\abovecaptionskip }
}
\SetTblrTemplate { caption-lot } { empty }
}
一般来说captionof
主题由两部分组成(见这个答案):
- 第一部分是表格模板
caption
元素的定义;tblr
- 第二行将
caption-lot
模板元素设置为empty
。
需要设置caption-lot
为以防止empty
tabularray
从将项目添加到表格列表中。其他行重载元素default
模板caption
。标题文本由caption
包(使用\captionof
宏时)。运行\captionof
宏将表计数器增加 1,并在标题段落后添加垂直间距,因此需要在运行前减少表计数器\captionof
,并在之后通过插入负间距来删除垂直间距。如果环境entry
中的短标题(元素)talltblr
未指定(是empty
) ,则调用时\captionof
不带可选参数,否则entry
元素的文本值将作为可选参数传递。原始解决方案没有间距修复:
\ExplSyntaxOn
\prg_generate_conditional_variant:Nnn \tl_if_empty:n { e } { TF }
\let \IfTokenListEmpty = \tl_if_empty:eTF
\ExplSyntaxOff
% modifying the captions of tabularray
\DefTblrTemplate{firsthead}{default}{%
\addtocounter{table}{-1}%
\IfTokenListEmpty{\InsertTblrText{entry}}{%
\captionof{table}{\InsertTblrText{caption}}%
}{%
\captionof{table}[\InsertTblrText{entry}]{\InsertTblrText{caption}}%
}%
}
因此,任务在各个包之间的分配如下:
caption
包组成标题文字并将项目添加到表格列表中,- 对于
talltblr
环境(按主题设置样式captionof
)tabularray
套餐提供标题间距并传递外部规范参数。
此外,还有类似的解决方案不检查短字幕。
完整示例
为了解释我以上述方式分离任务的动机,我准备了一个例子:
\documentclass{article}
\usepackage[a5paper]{geometry} % a5 paper
\usepackage[utf8]{inputenc} % input encoding
\usepackage[english]{babel} % localization
\usepackage{caption} % caption control
\usepackage{indentfirst} % first line indent
\usepackage{tabularray} % tabularray package
\usepackage[unicode=true, % unicode encoded pdf strings
colorlinks=true, % use colored links
linkcolor=black, % color of links
]{hyperref}
\captionsetup[table]
{labelsep=period, % caption separation for tables
position=t, % caption position for tables
justification=raggedright, % caption alignment for tables
singlelinecheck=off, % don't center single line table captions
aboveskip=2em} % above skip for table captions
\UseTblrLibrary{functional} % to evaluate \tblrcontents
\newcommand{\normalparindent}{5ex}
\parindent=\normalparindent
\newcommand{\dummytext}{And a long line of dummy text.}
\newcommand{\nfirsttext}{The first note text. \dummytext}
\newcommand{\nsecondtext}{The second note text. \dummytext}
\newcommand{\parbot}{\par\textcolor{red}{Paragraph text.}}
\newcommand{\partop}
{\clearpage
\par\noindent\textcolor{red}{\rule{\textwidth}{2pt}}\parbot}
\ExplSyntaxOn
% Contents of the table
\prgNewFunction \tblrcontents {}
{
\prgReturn
{
Head:A & Head:B & Head:C \\
A1 & B1 & C1 \\
A2 & B2 & C2 \\
A3 & B3 & C3 \\
}
}
% Period separator
\DefTblrTemplate { caption-sep } { mycapsep } { .\enskip }
% My own version of the simple caption template
\DefTblrTemplate { caption } { mysimple }
{
\UseTblrAlign { caption }
\UseTblrIndent { caption }
\UseTblrHang { caption }
\leavevmode
\strut
\UseTblrTemplate { caption-tag } { default }
\UseTblrTemplate { caption-sep } { mycapsep }
\UseTblrTemplate { caption-text } { default }
\strut
\par
}
% My own caption template
\DefTblrTemplate { caption } { mycaption }
{
\UseTblrAlign { caption }
\UseTblrIndent { caption }
\UseTblrHang { caption }
\leavevmode
\makebox [ \linewidth ] [ l ]
{
\parbox { \textwidth }
{
\raggedright
\strut
\UseTblrTemplate { caption-tag } { default }
\UseTblrTemplate { caption-sep } { mycapsep }
\UseTblrTemplate { caption-text } { default }
\strut
}
}
}
% Tabularray theme using mysimple template
\NewTblrTheme { mysimpletheme }
{
\SetTblrTemplate { caption } { mysimple }
\SetTblrStyle { caption } { halign=l }
}
% Tabularray theme using mycaption template
\NewTblrTheme { mycaptiontheme }
{
\SetTblrTemplate { caption } { mycaption }
}
% Tabularray theme using \captionof macro
\NewTblrTheme { captionof }
{
\DefTblrTemplate { caption } { default }
{
\addtocounter { table } { -1 }
\tl_if_empty:NTF \lTblrEntryTl
{
\captionof { table }
{ \InsertTblrText { caption } }
}
{
\captionof { table }
[ \InsertTblrText { entry } ]
{ \InsertTblrText { caption } }
}
\vspace{ -\abovecaptionskip }
}
\SetTblrTemplate { caption-lot } { empty }
}
\ExplSyntaxOff
\begin{document}
\pagestyle{empty}
\SetTblrInner[tblr, talltblr]
{colspec = {ccc},
row{1} = {font=\bfseries},
hline{1,2,Z} = {1pt},
vline{2-Y} = {1pt}}
\SetTblrOuter[tblr, talltblr]
{evaluate=\tblrcontents}
\SetTblrOuter[talltblr]
{headsep = \abovecaptionskip,
note{1} = {\nfirsttext},
note{2} = {\nsecondtext}}
\partop
\begin{table}[!h]
\caption{Simple floating table}
\label{tab:table-simple-floating}
\begin{tblr}{}
\tblrcontents
\end{tblr}
\end{table}
\parbot\partop
\begin{table}[!h]
\begin{talltblr}
[caption = {Simple floating three part table (\texttt{default} theme)},
entry = {Floating \texttt{talltblr} with \texttt{default} theme},
label = {tab:table-simple-default}]{}
\tblrcontents
\end{talltblr}
\end{table}
\parbot\partop
\begin{table}[!h]
\begin{talltblr}
[theme = captionof,
caption = {Simple floating three part table (\texttt{captionof} theme)},
entry = {Floating \texttt{talltblr} with \texttt{captionof} theme},
label = {tab:table-simple-captionof}]{}
\tblrcontents
\end{talltblr}
\end{table}
\parbot\partop
\begin{table}[!h]
\begin{talltblr}
[theme = captionof,
caption = {Simple floating three part table (\texttt{captionof} theme)},
label = {tab:table-simple-captionof-longcap}]{}
\tblrcontents
\end{talltblr}
\end{table}
\parbot\partop
\begin{table}[!h]
\begin{talltblr}
[theme = mysimpletheme,
caption = {Simple floating three part table (\texttt{mysimpletheme} theme)},
entry = {Floating \texttt{talltblr} \texttt{mysimpletheme} theme},
label = {tab:table-simple-simple}]{}
\tblrcontents
\end{talltblr}
\end{table}
\parbot\partop
\begin{table}[!h]
\begin{talltblr}
[theme = mysimpletheme,
caption = {Simple floating three part table (\texttt{mysimpletheme} theme)},
label = {tab:table-simple-simple-longcap}]{}
\tblrcontents
\end{talltblr}
\end{table}
\parbot\partop
\begin{table}[!h]
\begin{talltblr}
[theme = mycaptiontheme,
caption = {Simple floating three part table
(\texttt{mycaptiontheme} theme with \texttt{simple}-like caption template,
\texttt{\char`\\makebox} and \texttt{\char`\\parbox})},
entry = {Floating \texttt{talltblr} \texttt{mycaptiontheme} theme},
label = {tab:table-simple-mycaption}]{}
\tblrcontents
\end{talltblr}
\end{table}
\parbot
\clearpage
\listoftables
\end{document}
一个非常基本的例子
这是上表简化版本的布局,但是它是用浮点型tblr
嵌套环境制作的table
:
展望未来,我想说图上的标题是遍布整个宽度文本的宽度,而不仅仅是表格的宽度。这种行为有时非常必要。
产生此布局的代码部分是:
\partop
\begin{table}[!h]
\caption{Simple floating table}
\label{tab:table-simple-floating}
\begin{tblr}{}
\tblrcontents
\end{tblr}
\end{table}
\parbot
\parbot
和\partop
宏用于在表格前和表格后生成一个段落。这些段落用于显示间距浮动表格和相邻段落之间。\partop
宏还提供分页符并绘制显示文本列整个宽度的规则。表格内容由宏提供\tblrcontents
,该宏以 -style 定义expl3
:
\prgNewFunction \tblrcontents {}
{
\prgReturn
{
Head:A & Head:B & Head:C \\
A1 & B1 & C1 \\
A2 & B2 & C2 \\
A3 & B3 & C3 \\
}
}
为了使最后工作,它还需要允许评估宏(见tabularray
手动的,第“外部键评估实际操作”):
\UseTblrLibrary{functional} % to evaluate \tblrcontents
和
\SetTblrOuter[tblr, talltblr]
{evaluate=\tblrcontents}
这视觉风格所有表格均由以下几行提供:
\SetTblrInner[tblr, talltblr]
{colspec = {ccc},
row{1} = {font=\bfseries},
hline{1,2,Z} = {1pt},
vline{2-Y} = {1pt}}
该表的全图说明了默认浮动周围的垂直间距和表格标题周围的垂直间距由标题参数定义(aboveskip
故意设置为 2em):
\captionsetup[table]
{labelsep=period, % caption separation for tables
position=t, % caption position for tables
justification=raggedright, % caption alignment for tables
singlelinecheck=off, % don't center single line table captions
aboveskip=2em} % above skip for table captions
default
有主题的桌子
我们来看看下表的布局:
它的代码如下:
\partop
\begin{table}[!h]
\begin{talltblr}
[caption = {Simple floating three part table (\texttt{default} theme)},
entry = {Floating \texttt{talltblr} with \texttt{default} theme},
label = {tab:table-simple-default}]{}
\tblrcontents
\end{talltblr}
\end{table}
\parbot
此表是使用talltblr
环境排版的。假设我需要排版一个带注释的表格,所以我必须使用talltblr
浮动表格。两个虚拟文本表格说明定义为:
\newcommand{\dummytext}{And a long line of dummy text.}
\newcommand{\nfirsttext}{The first note text. \dummytext}
\newcommand{\nsecondtext}{The second note text. \dummytext}
talltblr
并且通过指定外部参数将这些注释添加到所有表中:
\SetTblrOuter[talltblr]
{headsep = \abovecaptionskip,
note{1} = {\nfirsttext},
note{2} = {\nsecondtext}}
上面的宏还指定了标题段落与表格主体之间的间距. 表格整体排版由tabularray
包,无功能caption
使用的包。标题段落外观默认为tabularray
包裹:
- 该段落的文字是合理的,
- 前缀以悬挂方式缩进,
- 分隔符是冒号。
很难注意到,但这个表格的标题文本基线和顶部水平线之间的距离是小一点比上表所需时间要多。这是因为未插入支柱在文本最后一行的末尾。这个问题与下一个表格无关,它是第一个表格的变体(参见 MWE)。
captionof
再次呈现主题的桌子
这是 MWE 中提到的表格的布局,但它是以另一种方式排版的:
这段代码是(它不太冗长,不是吗?):
\partop
\begin{table}[!h]
\begin{talltblr}
[theme = captionof,
caption = {Simple floating three part table (\texttt{captionof} theme)},
entry = {Floating \texttt{talltblr} with \texttt{captionof} theme},
label = {tab:table-simple-captionof}]{}
\tblrcontents
\end{talltblr}
\end{table}
\parbot
主题captionof
的定义与 MWE 中一样,因此布局相同。顺便说一下,此表在示例中再次使用,但没有简短标题。以下是代码:
\partop
\begin{table}[!h]
\begin{talltblr}
[theme = captionof,
caption = {Simple floating three part table (\texttt{captionof} theme)},
label = {tab:table-simple-captionof-longcap}]{}
\tblrcontents
\end{talltblr}
\end{table}
\parbot
我们来看一下表格列表,看看表 3 和表 4 是如何提及的:
mysimpletheme
有主题的桌子
下一桌的主题灵感来自于此关于如何将标题左对齐的答案。 布局:
以及代码:
\partop
\begin{table}[!h]
\begin{talltblr}
[theme = mysimpletheme,
caption = {Simple floating three part table (\texttt{mysimpletheme} theme)},
entry = {Floating \texttt{talltblr} \texttt{mysimpletheme} theme},
label = {tab:table-simple-simple}]{}
\tblrcontents
\end{talltblr}
\end{table}
\parbot
所调用的主题mysimpletheme
由以下代码定义:
\NewTblrTheme { mysimpletheme }
{
\SetTblrTemplate { caption } { mysimple }
\SetTblrStyle { caption } { halign=l }
}
提到的mysimple
标题模板定义如下:
\DefTblrTemplate { caption } { mysimple }
{
\UseTblrAlign { caption }
\UseTblrIndent { caption }
\UseTblrHang { caption }
\leavevmode
\strut
\UseTblrTemplate { caption-tag } { default }
\UseTblrTemplate { caption-sep } { mycapsep }
\UseTblrTemplate { caption-text } { default }
\strut
\par
}
simple
此模板基于tabularray
,但它在文本和分隔符的两端使用了我自己定义的 struts,如下所示:
\DefTblrTemplate { caption-sep } { mycapsep } { .\enskip }
所以,间距的标题是正确的,标题格式是正确的,并且标题结盟符合我的要求。
该表还有一种没有短标题的变体。
mycaptiontheme
有主题的桌子
最后一个是主题为 的表格mycaptiontheme
。布局如下:
代码如下:
\partop
\begin{table}[!h]
\begin{talltblr}
[theme = mycaptiontheme,
caption = {Simple floating three part table
(\texttt{mycaptiontheme} theme with \texttt{simple}-like caption template,
\texttt{\char`\\makebox} and \texttt{\char`\\parbox})},
entry = {Floating \texttt{talltblr} \texttt{mycaptiontheme} theme},
label = {tab:table-simple-mycaption}]{}
\tblrcontents
\end{talltblr}
\end{table}
\parbot
mycaptiontheme
定义为:
\NewTblrTheme { mycaptiontheme }
{
\SetTblrTemplate { caption } { mycaption }
}
模板mycaption
定义为:
\DefTblrTemplate { caption } { mycaption }
{
\UseTblrAlign { caption }
\UseTblrIndent { caption }
\UseTblrHang { caption }
\leavevmode
\makebox [ \linewidth ] [ l ]
{
\parbox { \textwidth }
{
\raggedright
\strut
\UseTblrTemplate { caption-tag } { default }
\UseTblrTemplate { caption-sep } { mycapsep }
\UseTblrTemplate { caption-text } { default }
\strut
}
}
}
可以看出,该定义与mysimple
标题模板的定义略有不同。标题文本排版在 中,并\parbox
嵌套在 的框中\makebox
。这样做是为了实现与环境中的示例标题对齐接近的标题对齐tblr
,即标题段落应分布在文本列的整个宽度由于上述段落应嵌套在talltblr
环境提供的表格的宽度内(目前它小于文本列的宽度),因此应将其放置在合法宽度的框内(目前为\linewidth
)。
该表满足以下要求:
- 间距的标题是正确的,
- 标题格式是正确的,
- 标题结盟是正确的,
- 这标题段落的宽度是正确的。