Как сделать так, чтобы перенос строк/многострочный ввод работал в заголовке моей таблицы для новичков?

Как сделать так, чтобы перенос строк/многострочный ввод работал в заголовке моей таблицы для новичков?

Как сделать так, чтобы перенос строк/многострочный ввод работал в заголовке моей таблицы для новичков?

\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значение метки таблицы ( ) и учитывается.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? Может быть, Дэвид Карлайл мог бы включить здесь свет?)

Поэтому лучше использовать \\в подписях или других материалах, которые должны быть набраны по центру. Кстати: при использовании пакета 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}

введите описание изображения здесь

Приложение "Условный перенос строки"

Используя \DeclareCaptionStyleone можно определить различные наборы опций для "однострочных" и "длинных" подписей. С \DeclareCaptionOptionone можно определить собственные опции для использования с 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/)

Связанный контент