我有一个带框的文本,它是两端对齐的,但如果它只有一行,我想让它居中。目前,一旦文本被渲染,我就会将一个\filcenter
选项添加到我的框宏中,但我想知道我是否可以自动执行此操作。
编辑:
我当前的代码是:
% central quote
\newcommand{\dvbox}[2][]{%
\begin{center}\doublebox{%
\parbox{10cm}{%
\vspace{3mm}%
\begin{Center}%
\makeatletter
\@raggedtwoe@spaceskipfalse
\@raggedtwoe@everyselectfont
\makeatother
\parbox{9cm}{#1\textsc{#2}}%
\end{Center}%
\vspace{3mm}%
}
}\end{center}}
目前,我传递的\filcenter
是#1
单行,并且#2
是需要显示的文本。
@Martin:所以你的解决方案给了我这个:
\makeatletter
% justify or center
\newsavebox{\@justcentbox}%
\newcommand{\justifyorcenter}[1]{%
\sbox \@justcentbox{#1}%
\ifdim \wd \@justcentbox >\hsize #1%
\else \centerline{#1} \fi
}
% central quote
\newcommand{\dvbox}[2][]{%
\begin{center}\doublebox{%
\parbox{10cm}{%
\vspace{3mm}%
\begin{Center}%
\@raggedtwoe@spaceskipfalse
\@raggedtwoe@everyselectfont
\parbox{9cm}{\justifyorcenter{#1\textsc{#2}}}%
\end{Center}%
\vspace{3mm}%
}
}\end{center}}
\makeatother
答案1
标准\caption
宏显示了这种行为。格式化实际上是由内部\@makecaption
宏完成的:
\@makecaption:
\long macro:#1#2->\vskip \abovecaptionskip \sbox \@tempboxa {#1: #2}\ifdim \wd \@tempboxa >\hsize #1: #2\par
\else \global \@minipagefalse \hb@xt@ \hsize {\hfil \box \@tempboxa \hfil }\fi \vskip \belowcaptionskip
因此:将内容存储在一个框中(例如使用) ,使用(或)\savebox\yourbox{<content>}
测量宽度,然后将其居中或不居中。在第二种情况下,您需要第二次排版内容,而在第一种情况下,您可以重复使用保存的框。将一行居中最简单的方法是与代码使用非常相似。\ifdim\wd\yourbox>\hsize
\linewidth
\centerline{...}
\@makecaption