Como fazer com que a quebra de linha/multirow funcione na legenda da minha tabela de iniciante?
\caption{this is my first table's captive caption}
Eu gostaria que a legenda ficasse assim:
Esse é meu primeiro
legenda cativa da tabela
Como?
\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}
Editar
tentandoCentroos títulos de duas linhas:
\usepackage{caption}
(...)
\begin{table}
\captionsetup{singlelinecheck=false, justification=centering}
\begin{threeparttable}
\caption{this is my first\newline table's very captive caption}
... o resultado dessa tentativa não parece muito certo ... como fazer certo?
Editar 2
- Como eu poderia fazer a quebra de linha acontecer entre duas palavras específicas (ou mesmo caracteres),mas só sea legenda quebraria a linha em qualquer caso?
Ou seja, a quebra de linha ficaria "inativa" desde que a legenda fosse curta o suficiente para caber inteiramente em uma linha; assim que fosseprecisalinebreak, a quebra ocorre no local predefinido.
Responder1
LaTeX usa duas passagens para a legenda. Na primeira passagem a legenda é definida em uma linha, \hbox
se o resultado couber em uma linha, a legenda é definida em uma linha, caso contrário é definida em várias linhas. No seu caso, a legenda é muito curta e cabe em uma linha.
Um truque: uma quebra de linha é definida e muito espaço horizontal é adicionado à legenda. Na primeira passagem a quebra de linha é ignorada, mas o espaço horizontal garante que a legenda não caiba em uma linha. A legenda é definida no modo multilinha e a quebra de linha é executada, mas o espaço horizontal no início da próxima linha é descartado (\hspace
semestrela):
\documentclass{article}
\begin{document}
\begin{table}
\caption{this is my first\newline
\hspace{\linewidth}table's captive caption}
\end{table}
\end{document}
Uma alternativa é o pacote caption
que oferece uma opção singlelinecheck
que permite desabilitar a primeira passagem que verifica o comprimento da legenda:
\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}
(A opção também pode ser definida globalmente no preâmbulo.)
Centralização
O seguinte usa um inner tabular
(e o default singlelinecheck=true
). O with do rótulo da tabela Table 1:
é calculado ( \settowidth
) e levado em consideração.
Se o argumento opcional de \caption
não for usado, o exemplo a seguir também redefine localmente \centeredmultilineincaption
para eliminar o tabular
e a quebra de linha da lista de figuras.
\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}
Atualizar:Este método só funciona se a primeira linha for mais longa.
Quebra de linha "condicional"
- Ambos
\\
e\linebreak
podem ser usados. No modo linha única eles desaparecem, portanto deve ser definido um espaço antes:first line \linebreak second line
, nãofirst line\linebreak second line
. Este último entrariafirst linesecond line
no modo de linha única. Ambas as macros são frágeis. Se a mesma quebra de linha também ocorrer na lista de tabelas, então
\protect
é necessário:\caption{First line \protect\\second line}
O argumento opcional de
\caption
pode ser usado para a lista de tabelas:\caption[Short version]{First line \\second line}
ou uma quebra de linha diferente na lista de tabelas:
\caption[Short\protect\\version]{First line \\second line}
O exemplo a seguir define \captionlinebreak
que
- cuida do espaço antes,
- é robusto e
- pode ser redefinido para a lista de tabelas.
Se a legenda multilinha também for centralizada, ela fica mais feia, pois \@makecaption
precisa ser redefinida e sua definição depende da classe e dos pacotes. O exemplo o redefine para a classe article
sem package 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}
Responder2
\centering
redefine \\
para funcionar corretamente, mas infelizmente não redefine \newline
. Portanto combinando \centering
e \newline
dá resultados estranhos:
\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}
(Por quê? Bug no LaTeX? Talvez David Carlisle pudesse acender a luz aqui?)
Portanto, é melhor usar \\
legendas ou outras coisas que devem ser centralizadas na composição. BTW: Ao usar o caption
pacote, uma quebra de linha digitada com \\
será substituída automaticamente por um caractere de espaço nas entradas da lista, portanto, geralmente não há necessidade de usar um texto de entrada de lista alternativo:
\documentclass{article}
\usepackage[justification=centering]{caption}
\begin{document}
\listoftables
\begin{table}
\caption{This is my first\\table's captive caption}
\end{table}
\end{document}
Adendo "Quebra de linha condicional"
Usar \DeclareCaptionStyle
um pode definir diferentes conjuntos de opções para legendas de "linha única" e legendas "longas". Com \DeclareCaptionOption
ele é possível definir opções próprias de uso do caption
pacote.
Então, como exemplo, defino uma nova chamada condicional \ifcaptionlinebreak
e uma opção apropriada para uso com o caption
pacote que pode ser alternada com linebreak=false
e 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}
Adendo ao adendo "Quebra de linha condicional"
Acabei de apresentar \ifsinglelinecaption
o caption
pacote, então, começando com a próxima versão lançada no CTAN, o documento de exemplo acima poderia ser reduzido para:
\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}
(O paciente internado pode obter a versão recente emhttp://sourceforge.net/p/latex-caption/code/HEAD/tree/trunk/tex/)