我想post--World War II
使用 Adobe 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
有关的:
- 关于
~
和\␣
(在这里没有帮助):控制空格和不间断空格之间的区别 - 关于在 LaTeX 中产生空格的各种方法:长度及何时使用它们
答案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 的)都没有解决:
使用任一解决方案中的宏
\fixedspaceword
,以下内容将对我的表达式“第二次世界大战后”执行此操作 [<- 里面是 Unicode 短划线,尽管它现在在 Stack Exchange 上没有以视觉形式显示]:\fixedspaceword{post--World War~II}
最好不要使用
\fixedspaceword{post--World \mbox{War II}}
在这种情况下这是关于\mbox
这是关于和~
。正如用户 tohecz 指出的那样,他的这个回答解决了短破折号的连字符问题(上面的代码没有处理该问题)。
答案4
我发现,无需创建设置自定义命令\fontdimen
,使用\mbox{ }
它就可以得到固定宽度的空间,这样更简单。