测试文本是否适合一行

测试文本是否适合一行

我有一个带框的文本,它是两端对齐的,但如果它只有一行,我想让它居中。目前,一旦文本被渲染,我就会将一个\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

相关内容