Принудительный перенос строки, так что каждая последующая строка становится длиннее

Принудительный перенос строки, так что каждая последующая строка становится длиннее

Привет, ребята. В нашем институте есть некоторые особые требования к формату, и мне интересно, можно ли автоматизировать одно из них с помощью какого-нибудь хитрого волшебства LaTex:

Подпись (также разделы и подразделы) устанавливается рваным справа. Однако разрыв строк осуществляется таким образом, что последующая строка длиннее предыдущей (за исключением последней строки, если ее невозможно сохранить). Однако не предполагается, что последняя строка полностью \textwith, а скорее поиск первой точки разрыва, которая каким-то образом делает следующую строку немного длиннее.

Вот несколько примеров:

Этот:

This is an example of a very long caption of a figure which might be too long to stay in one line so that it will automatically jump to a new line.

Должно получиться так:

This is an example of a very long caption of a figure which might be too long to stay in one line so that it will automatically jump to a new line instead.

This is an example of a very long caption of a figure which might be too long to stay in one line so that it will automatically jump to a new line instead but now it is even more text.

Мне очень интересно, можно ли автоматизировать такое форматирование.

Всего наилучшего, Бернте.

решение1

это начинается с того, что первая строка имеет половинную ширину, а затем становится длиннее... Это действительно выдает много предупреждений в журнале...

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

\documentclass{article}

\usepackage{shapepar}
\makeatletter

\def\zzshape#1{%
{0}%
{0}b{0}\\%
{0}t{0}{10}\\%
{#1}t{0}{20}\\%
{#1}e{20}%
}
\def\zzzshape{\zzshape\count@}

\def\zz#1{%
\count@=1 %
\loop
\setbox0\hbox{\Shapepar\zzzshape#1\par}%
\ifdim\wd0>\linewidth
\advance\count@\@ne
\repeat
\usebox0
\par}

\begin{document}

\raggedright
\setlength\parskip\bigskipamount

\zz{%
This is an example of a very long caption of a figure which might be
too long to stay in one line so that it will automatically jump to a
new line.}

\zz{%
This is an example of a very long caption of a figure which might be
too long to stay in one line so that it will automatically jump to a
new line.
This is an example of a very long caption of a figure which might be
too long to stay in one line so that it will automatically jump to a
new line.}

\zz{%
This is an example of a very long caption of a figure which might be
too long to stay in one line so that it will automatically jump to a
new line.
This is an example of a very long caption of a figure which might be
too long to stay in one line so that it will automatically jump to a
new line.
This is an example of a very long caption of a figure which might be
too long to stay in one line so that it will automatically jump to a
new line.}

\zz{%
This is an example of a very long caption of a figure which might be
too long to stay in one line so that it will automatically jump to a
new line.
This is an example of a very long caption of a figure which might be
too long to stay in one line so that it will automatically jump to a
new line.
This is an example of a very long caption of a figure which might be
too long to stay in one line so that it will automatically jump to a
new line.
This is an example of a very long caption of a figure which might be
too long to stay in one line so that it will automatically jump to a
new line.}

\end{document}

или с

\def\zzshape#1{%
{0}%
{0}b{0}\\%
{0}t{0}{17}\\%
{#1}t{0}{20}\\%
{#1}e{20}%
}

вы получите более прямоугольный блок:

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

решение2

Это попытка создать треугольник, чтобы заменить лишний пробел в последней строке. Не совсем идеально, так как я хотел бы избежать переносов и всегда заканчивать полной строкой. Ошибки можно исправить, аккуратно используя \rlap. Например, exam\rlap{ple}.

Вероятно, это несовместимо со всеми пакетами, которые изменяют \@makecaption.

\documentclass[12pt]{article}

\makeatletter
\long\def\@makecaption#1#2{\bgroup
  \vskip\abovecaptionskip
  \sbox\@tempboxa{#1: #2}%
  \ifdim \wd\@tempboxa < \hsize
    \global \@minipagefalse
    \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
  \else
    \ifdim \wd\@tempboxa < 2\hsize
      \dimen0=\dimexpr \wd\@tempboxa - \hsize\relax
      \parshape=2 0pt \dimen0 0pt \hsize
      #1: #2\par
    \else
      \count1=\numexpr \wd\@tempboxa/\hsize\relax% number lines
      \dimen0=\dimexpr \count1\hsize - \wd\@tempboxa\relax% extra space      
      \ifdim \dimen0 < 0pt
        \advance \count1 by 1
        \advance \dimen0 by \hsize
      \fi
      \count2=\numexpr \count1-1\relax
      \dimen1=\dimexpr 2\dimen0/\count1/\count2\relax% increment
      \ifdim\dimen1 < 2em\relax
        \count2=\count1
        \advance\count1 by 1
        \advance\dimen0 by \hsize
        \dimen1=\dimexpr 2\dimen0/\count1/\count2\relax
      \fi
      \dimen2=\dimexpr \hsize - \count2\dimen1\relax
      \edef\@makecaptionparshapeargs{\the\count1}% \parshape arguments
      \loop\ifnum\count1>0\relax
        \edef\@makecaptionparshapeargs{\@makecaptionparshapeargs\space0pt \the\dimen2}%
        \advance\count1 by -1
        \advance\dimen2 by \dimen1
      \repeat
      \parshape=\@makecaptionparshapeargs
      #1: #2\par
    \fi
  \fi
  \vskip\belowcaptionskip
\egroup}
\makeatother

\begin{document} 
\begin{figure}
\caption{Short cpation.}

\caption{This is an example of a very long caption of a figure which might be
too long to stay in one line.}

\caption{This is an example of a very long caption of a figure which might be
too long to stay in one line so that it will automatically jump to a
new line.}

\caption{This is an example of a very long caption of a figure which might be
too long to stay in one line so that it will automatically jump to a
new line.
This is an example of a very long caption of a figure which might be
too long to stay in one line so that it will automatically jump to a
new line.}

\caption{This is an example of a very long caption of a figure which might be
too long to stay in one line so that it will automatically jump to a
new line.
This is an example of a very long caption of a figure which might be
too long to stay in one line so that it will automatically jump to a
new line.
This is an example of a very long caption of a figure which might be
too long to stay in one line so that it will automatically jump to a
new line.}
\end{figure}
\end{document}

демо

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