标题最后一句的对齐方式

标题最后一句的对齐方式

我正在使用 caption 包来设置标题样式。考虑一个小的包装图,它有一个分成 n 行的宽标题。

我希望标题的前 n-1 行使用 justification=justified,而最后一行(未填满标题可用的宽度)应为 raggedleft。

理想情况下,我希望能够为标题的最后一行指定不同的对齐方式,独立于浮动环境,例如通过指定 \captionsetup{justification=justified, lastlinejustification=raggedleft} 或其他值。

我知道 caption 包提供了 centerlast,所以像 raggedleftlast 这样的东西也很好 ;)

答案1

知道为什么它有效。

对 John Kormylo 的答案的一种变体,没有重新定义内部结构caption,而是增加了一种辩护模式。

\documentclass{article}
\usepackage{caption}
\usepackage{wrapfig}
\usepackage{lipsum}

\DeclareCaptionOptionNoValue*{rjustified}{%
  \caption@setformat{plain}%
  \caption@setjustification{rjustified}%
}
\DeclareCaptionJustification{rjustified}{\rjustified}
\makeatletter
\newcommand\rjustified{%
  \let\\\@fillcr
  \leftskip\z@\@plus 1fil
  \rightskip\z@\@plus -1fil
  \parfillskip\z@\@plus 1fil\relax
}
% don't bother with this if you don't plan to use \\ in a caption
\protected\def\@fillcr{%
  \let \reserved@e \relax
  \let \reserved@f \relax
  \@ifstar{\let \reserved@e \vadjust \let \reserved@f \nobreak
             \@xnewlinefill}%
  \@xnewlinefill}
\def\@xnewlinefill{\@ifnextchar[% ] bracket matching
                  \@newlinefill
                 {\@gnewlinefill\relax}}
\def\@newlinefill[#1]{\let \reserved@e \vadjust
                   \@gnewlinefill {\vskip #1}}
\def\@gnewlinefill #1{%
  \ifvmode
    \@nolnerr
  \else
    \unskip \reserved@e {\reserved@f#1}\nobreak \hfill \break
  \fi}
%%%% end of `no bother with this'
\makeatother

\begin{document}

\begin{wrapfigure}{l}{4cm}
\centering
\captionsetup{justification=rjustified}
\fbox{\rule{3cm}{0pt}\rule{0pt}{3cm}}
\caption{\lipsum[1][2-3]}
\end{wrapfigure}

\lipsum[1-2]

\end{document}

在此处输入图片描述

如果您不打算在活动\\时使用字幕,请删除上述代码中定义模仿的指令和行。这肯定不是您想要的。justification=rjustified\let\\\@fillcr\@fillcr\@normalcr\@centercr

它是如何工作的?段落中的每一行在金额\leftskip和两侧都有粘连\rightskip。对于正常(对齐)段落,它们都设置为零。

这里前者设置为零,但具有正无限可拉伸性,后者设置为零,具有负无限可拉伸性。因此,它们通常会相互抵消,不会发生任何奇怪的事情。但是,TeX 会\parfillskip在段落的最后一行添加粘连;其值正常0pt plus 1fil(与此处设置的相同,只是为了安全起见)。这种粘连将抵消\rightskip 仅在最后一行,因此在这条线上的正向拉伸力\leftskip将起作用,并移动最后一条线使其与右齐平。

当然,您不希望标题中包含多个段落。

业务\@fillcr是 的一种变体,\@normalcr其中\hfill代替\hfil,因此更高程度的无穷大将优先于和fil的单位。\leftskip\rightskip

答案2

我不知道它为什么有效,但它确实有效。

\documentclass{article}
\usepackage{caption}
\captionsetup{justification=centerlast}
\usepackage{lipsum}% MWE only

\makeatletter
\renewcommand\centerlast{%
  \let\\\@centercr
  \leftskip\z@\@plus 1fil%
  \rightskip\z@\@plus -1fil%
  \parfillskip\z@\@plus 1fil\relax}
\makeatother

\begin{document}

\begin{figure}
\caption{\LipsumPar{2}}
\end{figure}

\end{document}

演示

相关内容