如何使初学者表格的标题具有换行/多行功能?
\caption{this is my first table's captive caption}
我希望标题看起来像这样:
这是我的第一次
表格的标题
如何?
\documentclass{article}
\usepackage{tabulary}
\usepackage{threeparttable}
\usepackage{array}
\usepackage{siunitx}
\usepackage{booktabs}
\usepackage{multirow}
\usepackage{pbox}
\usepackage{lipsum}
\usepackage[utf8]{inputenc}\usepackage{textcomp}
\renewcommand{\arraystretch}{1.2}
\sisetup{round-mode=places,round-precision=1, add-decimal-zero=true, add-integer-zero=true, round-integer-to-decimal}
\begin{document}
\lipsum[1]
\begin{table}
\begin{threeparttable}
\caption{this is my first table's captive caption}
\begin{tabulary}{\textwidth}{@{}*{2}{L}*{6}{S[table-format=3.2]}@{}} \toprule
× & TOTALLY bla percentage of bla & {1000} & {2000} & {3000} &
\multicolumn{1}{c}{\begin{tabular}{@{}c@{}}Bonjour\tabularnewline monde!\end{tabular}} &
{5000} & {6000\tnote{1}}\\ \midrule
% × & TOTALLY bla percentage of bla & {1000} & {2000} & {3000} & \multirow{2}*{4000 apples and pears \\ and whatnot} & {5000} & {6000\tnote{1}}\\ \midrule
DDD 1 & 47.6 & 29.1 & 1.0 & 0.2 & 1.9 & 15.2 & 0.0\\
UUU & 24.8 & 10.8 & 6.4 & 0.0 & 3.2 & 4.5 & 0.0\\
× & × & × & × & × & × & × & ×\\
Unweighted average: & × & × & × & × & × & × & ×\\
BBB & 33.8 & 11.3 & 9.1 & 0.4 & 1.8 & 11.0 & 0.2\\
GGG & 32.9904 & 8.60325 & 9.3845 & 0.0495 & 1.43225 & 10.79525 & 0.119\\
DDD & 39.4545 & 9.8695 & 15.3365 & 0.6915 & 2.246 & 10.6705 & 0.5105\\ \bottomrule
\end{tabulary}
\begin{tablenotes}
\item [1] the first note ...
\end{tablenotes}
\end{threeparttable}
\end{table}
\lipsum[2]
\end{document}
编辑
尝试去中心两行标题:
\usepackage{caption}
(...)
\begin{table}
\captionsetup{singlelinecheck=false, justification=centering}
\begin{threeparttable}
\caption{this is my first\newline table's very captive caption}
...这次尝试的结果看起来不太正确...该如何做对呢?
编辑2
- 我怎样才能让换行发生在两个特定的单词(甚至是字符)之间,但仅当且仅当无论如何,标题都会换行吗?
意思是,只要标题足够短,可以完全放在一行中,换行符就会处于“休眠”状态;一旦它必须换行,换行发生在预定义的位置。
答案1
LaTeX 使用两遍来设置标题。第一遍中,\hbox
如果结果适合一行,则将标题设置为一行,否则将设置为多行。您的情况是,标题太短,一行就够了。
一个技巧:设置换行符,并在标题中添加大量水平空间。第一次传递时,换行符会被忽略,但水平空间会确保标题不适合一行。将标题设置为多行模式并执行换行符,但下一行开头的水平空间会被丢弃(\hspace
没有星星):
\documentclass{article}
\begin{document}
\begin{table}
\caption{this is my first\newline
\hspace{\linewidth}table's captive caption}
\end{table}
\end{document}
另一种方法是使用软件包caption
提供的选项singlelinecheck
,允许禁用检查字幕长度的第一次传递:
\documentclass{article}
\usepackage{caption}
\begin{document}
\begin{table}
\captionsetup{singlelinecheck=false}
\caption{this is my first\newline
table's captive caption}
\end{table}
\end{document}
(该选项也可以在序言中全局设置。)
定心
以下使用内部tabular
(和默认的singlelinecheck=true
)。表格标签的 with 经过Table 1:
计算(\settowidth
)并被考虑在内。
如果不使用可选参数\caption
,以下示例还会局部重新定义\centeredmultilineincaption
以删除tabular
和图形列表的换行符。
\documentclass{article}
\makeatletter
\newlength{\@captionlabelwidth}
\DeclareRobustCommand*{\centeredmultilineincaption}[1]{%
\settowidth{\@captionlabelwidth}{%
\@nameuse{fnum@\@captype}: %
}%
\begin{tabular}[t]{@{\hspace{-\@captionlabelwidth}}c@{}}%
\hspace{\@captionlabelwidth}\ignorespaces
#1%
\end{tabular}%
}
\begin{document}
\begingroup
\renewcommand*{\centeredmultilineincaption}[1]{%
\begingroup
\let\tabularnewline\space
#1%
\endgroup
}%
\listoftables
\endgroup
\begin{table}
\caption{%
\centeredmultilineincaption{%
this is my first\tabularnewline
table's captive caption
}%
}
\end{table}
\end{document}
更新:仅当第一行较长时,此方法才有效。
“条件”换行
\\
和都\linebreak
可以使用。在单行模式下,它们会消失,因此在 之前应该设置一个空格:first line \linebreak second line
,而不是first line\linebreak second line
。后者first linesecond line
在单行模式下会变成 。这两个宏都很脆弱。如果在表格列表中也出现相同的换行符,则
\protect
需要:\caption{First line \protect\\second line}
可选参数
\caption
可用于表列表:\caption[Short version]{First line \\second line}
或者在表格列表中使用不同的换行符:
\caption[Short\protect\\version]{First line \\second line}
下面的例子定义\captionlinebreak
了
- 照顾之前的空间,
- 坚固耐用
- 可以为表列表重新定义。
如果多行标题也需要居中,那就更丑了,因为\@makecaption
需要重新定义,而且它的定义取决于类和包。示例为article
没有包的类重新定义了它caption
:
\documentclass[a5paper]{article}
\usepackage{varwidth}
\DeclareRobustCommand*{\captionlinebreak}{%
\leavevmode\unskip\space % one space before
\\%
}
\makeatletter
\long\def\@makecaption#1#2{%
\vskip\abovecaptionskip
\sbox\@tempboxa{#1: #2}%
\ifdim \wd\@tempboxa >\hsize
\centerline{%
\begin{varwidth}{\hsize}%
#1: #2%
\end{varwidth}%
}%
\else
\global \@minipagefalse
\hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
\fi
\vskip\belowcaptionskip
}
\makeatother
\begin{document}
\begingroup
\let\captionlinebreak\relax
\listoftables
\endgroup
\begin{table}
\centering
\caption{Lorem ipsum\protect\captionlinebreak
dolor sit amet, consetetur sadipscing elitr, \dots}
\end{table}
\begin{table}
\centering
\caption{Lorem ipsum\captionlinebreak
dolor sit amet, \dots}
\end{table}
\end{document}
答案2
\centering
重新定义\\
可以正常工作,但不幸的是没有重新定义\newline
。因此,将\centering
和结合起来\newline
会产生奇怪的结果:
\documentclass{article}
\begin{document}
\parbox{\linewidth}{\centering
This is some text\newline And this is some text, too.}
\par\bigskip
\parbox{\linewidth}{\centering
This is some text\\And this is some text, too.}
\end{document}
(为什么?LaTeX 中存在错误?也许 David Carlisle 可以在这里开灯?)
因此,最好\\
在标题或其他应排版居中的内容中使用。顺便说一句:使用该caption
包时,列表条目中排版的换行符\\
将自动替换为空格字符,因此通常不需要使用替代列表条目文本:
\documentclass{article}
\usepackage[justification=centering]{caption}
\begin{document}
\listoftables
\begin{table}
\caption{This is my first\\table's captive caption}
\end{table}
\end{document}
附录“条件换行”
使用\DeclareCaptionStyle
可以为“单行”标题和“长”标题定义不同的选项集。使用\DeclareCaptionOption
可以定义自己的选项以供包使用caption
。
因此,作为示例,我定义了一个新的条件,称为\ifcaptionlinebreak
和一个适当的选项,用于caption
可以通过linebreak=false
和切换的包linebreak=true
:
\documentclass{article}
\usepackage{caption}
% New conditional \ifcaptionlinebreak
\newif\ifcaptionlinebreak
% New caption package option "linebreak" for toggeling \ifcaptionlinebreak
\DeclareCaptionOption{linebreak}{\csname captionlinebreak#1\endcsname}
% New command \captionlinebreak which either typesets a line break or a space,
% depending on \ifcaptionlinebreak
\newcommand\captionlinebreak{\ifcaptionlinebreak\\\else\space\fi}
% Own caption style which turns the linebreak into a space for short captions
% and into a line break for long captions
\DeclareCaptionStyle{mystyle}[linebreak=false]{linebreak=true}
\captionsetup{style=mystyle,justification=centering}
\begin{document}
\listoftables
\begin{table}[!hb]
\caption{This is my first\\table's captive caption}
\end{table}
\begin{table}[!hb]
\caption{This is my first\captionlinebreak table's captive caption}
\end{table}
\begin{table}[!hb]
\caption{This is my first\captionlinebreak table's captive caption.
This is my first table's captive caption}
\end{table}
\end{document}
附录“条件换行”的附录
我刚刚介绍了\ifsinglelinecaption
该caption
包,因此从 CTAN 上发布的下一个版本开始,上述示例文档可以简化为:
\documentclass{article}
\usepackage[justification=centering]{caption}
\newcommand\captionlinebreak{\ifsinglelinecaption\space\else\\\fi}
\begin{document}
\listoftables
\begin{table}[!hb]
\caption{This is my first\\table's captive caption}
\end{table}
\begin{table}[!hb]
\caption{This is my first\captionlinebreak table's captive caption}
\end{table}
\begin{table}[!hb]
\caption{This is my first\captionlinebreak table's captive caption.
This is my first table's captive caption}
\end{table}
\end{document}
(住院患者可以访问http://sourceforge.net/p/latex-caption/code/HEAD/tree/trunk/tex/)