防止多行标题中的单词间空格“极端”拉伸

防止多行标题中的单词间空格“极端”拉伸

我的论文标题排版在方框中,文本对齐,除了最后一行,它是右对齐的(来自这里):

% Justify all lines in  paragraph, except last line right aligned
\newcommand*{\justlastragged}{%
\leftskip=0pt plus 1fil
\rightskip=-\leftskip
\parfillskip=\leftskip
\parindent=0pt}

这样做效果很好,但有时会导致标题不好看,因为空间被拉得太长。例如,请参见下面的图片:

延伸空间

在这种情况下,我只想让顶行左对齐。我不想将文本默认设置为左对齐(而不是两端对齐),因为这样其他标题的排版就不那么好看了(即那些只需要稍微拉伸的标题)。

我尝试过spaceskip,但只要添加哪怕是最微小的“加号”拉伸,上图中的空间就会扩大,以至于整行都被填满。我尝试过的另一件事是手动添加换行符,但在这种情况下,标题被视为两个段落,并且两行都右对齐。

有什么方法可以实现我想要的吗?能够设置最大拉伸量的限制似乎不错,但我找不到类似的东西。

编辑:现在使用最少的样本:

\documentclass[a4paper, 11pt]{article}

\usepackage[T1]{fontenc}

% Justify all lines in  paragraph, except last line right aligned
\newcommand*{\justlastragged}{%
\leftskip=0pt plus 1fil
\rightskip=-\leftskip
\parfillskip=\leftskip
\parindent=0pt}

% Left-align all lines in paragrahp, except last line right aligned
\newcommand*{\leftlastragged}{%
\leftskip=0pt plus 1fil
\rightskip=0pt plus 1fill
\parfillskip=0pt plus -1fill
\parindent=0pt}

\newcommand{\titlelayoutA}{\justlastragged \Large \scshape \bfseries}
\newcommand{\titlelayoutB}{\leftlastragged \Large \scshape \bfseries}

\begin{document}

% Using justified text
\parbox{2.5cm}{Justified}
\fbox{\parbox{3.2cm}{\titlelayoutA This is just a test}} % Look good
\hspace{0.5em}
\fbox{\parbox{3.2cm}{\titlelayoutA This does not fit}}   % Looks bad

\vspace*{2em}

% Using left aligned
\parbox{2.5cm}{Left-aligned}
\fbox{\parbox{3.2cm}{\titlelayoutB This is just a test}} % Looks bad
\hspace{0.5em}
\fbox{\parbox{3.2cm}{\titlelayoutB This does not fit}}   % Looks good

\end{document}

答案1

如果命令 TeX 填充一定宽度(例如,为了对齐一行),它将使用所有可用的可拉伸胶水。

胶水中指定的拉伸量仅用于计算线的不良程度,但是如果你说

\hbox to 5em{M\hskip 1em plus 1em M}

胶水将被拉伸至完成任务所需的程度。为了简单起见,我们假设“M”的宽度为 1em;要填充的空间为 5em,但材料仅覆盖 3em;因此胶水必须拉伸 2em,因此拉伸因子为 2,这导致不良度为 800(不良度约为拉伸因子立方的 100 倍,但如果该数字超过 10000,则为 10000)。

没有办法告诉 TeX 限制胶水的可拉伸性,除非添加一些其他(有限的)胶水,以便它不需要超出规定的限制。

可以多次排版一行,直到不良度为 100,这意味着拉伸因子为 100。该宏\nostretch有两个参数:第一个是允许的最大宽度,第二个是要排版的文本。

\def\nostretch#1#2{%
  \begingroup\hbadness=10000 % don't report high badness
  \dimen0=#1\relax
  \setbox0=\hbox to\dimen0{#2}\count255=\badness
  \loop\ifnum\count255>100
    \advance\dimen0-.5pt
    \setbox0=\hbox to\dimen0{#2}\count255=\badness
%    \hbox{\copy0\ -- \the\count255}% for debugging
  \repeat
  \box0
  \endgroup
}

\nostretch{5em}{M\hskip 1em plus 1em M}

\bye

如果删除调试行中的注释,您将看到计算结果:

在此处输入图片描述

最后一行是没有调试时打印的内容;两个 M 之间有 2 em 的空格(实际上不是,因为字体中 M 的宽度不是 1em cmr10)。可以使用任何粘连,包括单词间空格。

相关内容