¿Cómo hacer que el salto de línea/multifila funcione en el título de mi tabla para principiantes?
\caption{this is my first table's captive caption}
Me gustaría que el título se viera así:
esta es mi primera
título cautivo de la mesa
¿Cómo?
\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
tratando decentrolos títulos de dos líneas:
\usepackage{caption}
(...)
\begin{table}
\captionsetup{singlelinecheck=false, justification=centering}
\begin{threeparttable}
\caption{this is my first\newline table's very captive caption}
... el resultado de este intento no parece del todo correcto ... ¿cómo hacerlo bien?
Editar 2
- ¿Cómo podría hacer que se produzca el salto de línea entre dos palabras (o incluso caracteres) en particular?pero solo si¿El título saltaría de línea en cualquier caso?
Es decir, el salto de línea estaría "inactivo" siempre que el título sea lo suficientemente corto como para caber completamente en una línea; tan pronto como lo haríatengo quesalto de línea, el salto se produce en el lugar predefinido.
Respuesta1
LaTeX utiliza dos pases para el título. En la primera pasada, el título se establece en una línea, \hbox
si el resultado cabe en una línea, el título se establece en una línea; de lo contrario, se establece en varias líneas. En su caso, el título es demasiado corto y cabe en una línea.
Un truco: se establece un salto de línea y se agrega mucho espacio horizontal al título. En la primera pasada, se ignora el salto de línea, pero el espacio horizontal garantiza que el título no quepa en una línea. El título se establece en modo de varias líneas y se ejecuta el salto de línea, pero el espacio horizontal al comienzo de la siguiente línea se descarta (\hspace
sinestrella):
\documentclass{article}
\begin{document}
\begin{table}
\caption{this is my first\newline
\hspace{\linewidth}table's captive caption}
\end{table}
\end{document}
Una alternativa es el paquete caption
que proporciona una opción singlelinecheck
que permite deshabilitar el primer paso que verifica la longitud de los subtítulos:
\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}
(La opción también se puede configurar globalmente en el preámbulo).
Centrado
Lo siguiente utiliza un interno tabular
(y el predeterminado singlelinecheck=true
). El valor de la etiqueta de la tabla Table 1:
se calcula ( \settowidth
) y se tiene en cuenta.
\caption
Si no se utiliza el argumento opcional de , el siguiente ejemplo también lo redefine localmente \centeredmultilineincaption
para eliminar el tabular
y el salto de línea de la 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}
Actualizar:Este método sólo funciona si la primera línea es más larga.
Salto de línea "condicional"
- Se pueden utilizar ambos
\\
y .\linebreak
En el modo de una sola línea desaparecen, por lo que se debe establecer un espacio antes:first line \linebreak second line
, nofirst line\linebreak second line
. Este último pasaría a estarfirst linesecond line
en modo unifilar. Ambas macros son frágiles. Si el mismo salto de línea también debe ocurrir en la lista de tablas, entonces
\protect
es necesario:\caption{First line \protect\\second line}
El argumento opcional de
\caption
se puede utilizar para la lista de tablas:\caption[Short version]{First line \\second line}
o un salto de línea diferente en la lista de tablas:
\caption[Short\protect\\version]{First line \\second line}
El siguiente ejemplo define \captionlinebreak
que
- cuida el espacio antes,
- es robusto y
- se puede redefinir para la lista de tablas.
Si el título de varias líneas también debe estar centrado, se vuelve más feo, porque \@makecaption
necesita redefinirse y su definición depende de la clase y los paquetes. El ejemplo lo redefine para la clase article
sin paquete 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}
Respuesta2
\centering
se redefine \\
para que funcione correctamente, pero desafortunadamente no se redefine \newline
. Por lo tanto combinando \centering
y \newline
da resultados extraños:
\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é? ¿Error en LaTeX? ¿Quizás David Carlisle podría encender la luz aquí?)
Por lo tanto, es mejor usarlo \\
en subtítulos u otras cosas que deban estar tipográficas centradas. Por cierto: cuando se utiliza el caption
paquete, un salto de línea tipográfico \\
se reemplazará automáticamente por un carácter de espacio en las entradas de la lista, por lo que normalmente no es necesario utilizar un 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}
Anexo "Salto de línea condicional"
El uso de \DeclareCaptionStyle
uno puede definir diferentes conjuntos de opciones para subtítulos de "una sola línea" y subtítulos "largos". Con \DeclareCaptionOption
uno puede definir sus propias opciones para su uso con el caption
paquete.
Entonces, como ejemplo, defino un nuevo llamado condicional \ifcaptionlinebreak
y una opción apropiada para usar con el caption
paquete que se puede alternar con linebreak=false
y 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}
Anexo al anexo "Salto de línea condicional"
Acabo de presentar \ifsinglelinecaption
el caption
paquete, por lo que a partir de la próxima versión publicada en CTAN, el documento de ejemplo anterior podría reducirse a:
\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}
(El paciente internado puede obtener la versión reciente enhttp://sourceforge.net/p/latex-caption/code/HEAD/tree/trunk/tex/)