Como fazer com que a quebra de linha/multirow funcione na legenda da minha tabela de iniciante?

Como fazer com que a quebra de linha/multirow funcione na legenda da minha tabela de iniciante?

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, \hboxse 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}

Resultado

Uma alternativa é o pacote captionque oferece uma opção singlelinecheckque 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 \captionnão for usado, o exemplo a seguir também redefine localmente \centeredmultilineincaptionpara eliminar o tabulare 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}

Resultado com centralização

Atualizar:Este método só funciona se a primeira linha for mais longa.

Quebra de linha "condicional"

  • Ambos \\e \linebreakpodem ser usados. No modo linha única eles desaparecem, portanto deve ser definido um espaço antes: first line \linebreak second line, não first line\linebreak second line. Este último entraria first linesecond lineno 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 \captionpode 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 \captionlinebreakque

  • 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 \@makecaptionprecisa ser redefinida e sua definição depende da classe e dos pacotes. O exemplo o redefine para a classe articlesem 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}

Resultado

Responder2

\centeringredefine \\para funcionar corretamente, mas infelizmente não redefine \newline. Portanto combinando \centeringe \newlinedá 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}

insira a descrição da imagem aqui

(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 captionpacote, 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}

insira a descrição da imagem aqui

Adendo "Quebra de linha condicional"

Usar \DeclareCaptionStyleum pode definir diferentes conjuntos de opções para legendas de "linha única" e legendas "longas". Com \DeclareCaptionOptionele é possível definir opções próprias de uso do captionpacote.

Então, como exemplo, defino uma nova chamada condicional \ifcaptionlinebreake uma opção apropriada para uso com o captionpacote que pode ser alternada com linebreak=falsee 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}

insira a descrição da imagem aqui

Adendo ao adendo "Quebra de linha condicional"

Acabei de apresentar \ifsinglelinecaptiono captionpacote, 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/)

informação relacionada