我正在使用 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}