固定宽度的字间空间

固定宽度的字间空间

我想post--World War II使用 Adob​​e InDesign 中所谓的“四分之一空格”进行排版。短划线比普通空格要宽,以明确组成结构([二战后]]),但在良好的排版中,此表达式中的两个空格不应拉伸,这与同一排版行中的其他空格不同。

如何在 LaTeX 中排版固定宽度的“四分之一空格”?

(我以前认为正确的方法是post--World\ War\ II,但我刚刚发现 \␣根本不是固定空格,而只是line␣break--preventing ~. 的换行变体)

实际上,我需要两个不同的宏:一个允许换行,另一个不允许。例如,上面的表达式应该按以下方式换行:

  • 好的:post--/World␣War␣II
  • 好的:post--World/War␣II
  • 坏的:post--World␣War/II

(我们假设这就是我们想要的,而将第二个换行符选项在印刷上是否好的问题留待下次辩论。)

我们还假设要保留组成词中的换行点。两个示例(摘自维基百科的“Dash”文章):

  • “弗朗西斯·科”non--San␣Francisco
  • “min·is·ter” 在ex--prime␣minister

有关的:

答案1

只需设置\spaceskip;如果此参数非零,TeX 将使用它作为单词间空间,而忽略字体定义的参数。

\documentclass{article}
\usepackage{xcolor}
\newcommand{\fixedspaceword}[2][1]{%
  \begingroup
  \spaceskip=#1\fontdimen2\font
  \xspaceskip=0pt\relax % just to be sure
  #2%
  \endgroup
}
\newcommand{\WWII}{{\color{blue}post--World War II}}
\begin{document}

\makebox[\textwidth][s]{a text \fixedspaceword{\WWII} and so ends}

\makebox[\textwidth][s]{a text \fixedspaceword[.75]{\WWII} and so ends}

\end{document}

有了\makebox[\textwidth][s]{...}可以拉伸的词间空间就可以了。

在此处输入图片描述

使用可选参数,您可以减少(或扩大)\fixedspaceword位中的单词间空间。


如果您希望空格与行中的其他空格一起缩小,请将定义更改为

\newcommand{\fixedspaceword}[2][1]{%
  \begingroup
  \spaceskip=#1\fontdimen2\font minus \fontdimen4\font
  \xspaceskip=0pt\relax % just to be sure
  #2%
  \endgroup
}

\spaceskip由于拉伸分量为零,因此空间不允许拉伸。

答案2

单词间的拉伸和收缩可以调整(或删除)。以下最小示例试图强调这一点:

在此处输入图片描述

\documentclass{article}
\usepackage{xcolor}% http://ctan.org/pkg/xcolor
\newdimen\origiwstr% inter-word stretch
\newdimen\origiwshr% inter-word shrink
\makeatletter
\newcommand{\fixedspaceword}[1]{%
  \origiwstr=\fontdimen3\font% original inter-word stretch
  \origiwshr=\fontdimen4\font% original inter-word shrink
  \fontdimen3\font=\z@% No inter-word stretch
  \fontdimen4\font=\z@% No inter-word shrink
  #1%
  \fontdimen3\font=\origiwstr% Restore inter-word stretch
  \fontdimen4\font=\origiwshr% Restore inter-word shrink  
}
\makeatother
\newcommand{\vertruleL}{\llap{\smash{\color{red}\rule[-10\baselineskip]{1pt}{11\baselineskip}}}}
\newcommand{\vertruleR}{\rlap{\smash{\color{red}\rule[-10\baselineskip]{1pt}{11\baselineskip}}}}
\newcommand{\WWII}{{\color{blue}post--World War II}}
\begin{document}
% \mboxed
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse semper 
mauris a odio vestibulum et eleifend quam gravida. Maecenas facilisis odio 
sed velit semper imperdiet. Nullam \vertruleL\mbox{\WWII}\vertruleR{} tortor metus, adipiscing sitalo amet elementum 
lacinia, ullamcorper at velit. Suspendisse nulla elit, bibendum a tempus eu, 
gravida non est.

% Plain
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse semper 
mauris a odio vestibulum et eleifend quam gravida. Maecenas facilisis odio 
sed velit semper imperdiet. Nullam \WWII{} tortor metus, adipiscing sitalo amet elementum 
lacinia, ullamcorper at velit. Suspendisse nulla elit, bibendum a tempus eu, 
gravida non est.

% No shrink/stretch
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse semper 
mauris a odio vestibulum et eleifend quam gravida. Maecenas facilisis odio 
sed velit semper imperdiet. Nullam \fixedspaceword{\WWII} tortor metus, adipiscing sitalo amet elementum 
lacinia, ullamcorper at velit. Suspendisse nulla elit, bibendum a tempus eu, 
gravida non est.

\hrulefill

% \mboxed
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse semper 
mauris a odio vestibulum et eleifend quam gravida. Maecenas facilisis odio 
sed velit semper imperdiet. Nullam tortor metus, adipiscing sitalo \mbox{\WWII} amet elementum 
lacinia, ullamcorper at velit. Suspendisse nulla elit, bibendum a tempus eu, 
gravida non est.

% Plain
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse semper 
mauris a odio vestibulum et eleifend quam gravida. Maecenas facilisis odio 
sed velit semper imperdiet. Nullam tortor metus, adipiscing sitalo \vertruleL\WWII\vertruleR{} amet elementum 
lacinia, ullamcorper at velit. Suspendisse nulla elit, bibendum a tempus eu, 
gravida non est.

% No shrink/stretch
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse semper 
mauris a odio vestibulum et eleifend quam gravida. Maecenas facilisis odio 
sed velit semper imperdiet. Nullam tortor metus, adipiscing sitalo \fixedspaceword{\WWII} amet elementum 
lacinia, ullamcorper at velit. Suspendisse nulla elit, bibendum a tempus eu, 
gravida non est.

\end{document}

在前三个例子中乱数文本,第二个文本的字间距明显发生了变化,因为红色垂直规则覆盖了蓝色,post--World War II而其他任何变化都没有。

与单词间拉伸/收缩相关的维度由以下公式给出:

  • \fontdimen3\font(拉伸用)
  • \fontdimen4\font(收缩)

\fixedspaceword{<stuff>}会先存储原始拉伸/收缩,然后将其设置为零(\z@)并排版<stuff>。最后,它会恢复原始拉伸/收缩。这也允许跨越行边界进行换行,如第二组示例所示。\mbox当然, 不允许这样做。


作为参考,请参阅如何缩短/缩小单词之间的空格?

答案3

关于我的(最终的、经过编辑的)问题的两个方面,目前的答案(用户 egreg 和用户 Werner 的)都没有解决:

  1. 使用任一解决方案中的宏\fixedspaceword,以下内容将对我的表达式“第二次世界大战后”执行此操作 [<- 里面是 Unicode 短划线,尽管它现在在 Stack Exchange 上没有以视觉形式显示]:

    \fixedspaceword{post--World War~II}
    

    最好不要使用\fixedspaceword{post--World \mbox{War II}}在这种情况下这是关于\mbox这是关于和~

  2. 正如用户 tohecz 指出的那样,他的这个回答解决了短破折号的连字符问题(上面的代码没有处理该问题)。

答案4

我发现,无需创建设置自定义命令\fontdimen,使用\mbox{ }它就可以得到固定宽度的空间,这样更简单。

相关内容