![使用‘~’和 Unicode 不间断空格之间有区别吗?](https://linux22.com/image/441584/%E4%BD%BF%E7%94%A8%E2%80%98~%E2%80%99%E5%92%8C%20Unicode%20%E4%B8%8D%E9%97%B4%E6%96%AD%E7%A9%BA%E6%A0%BC%E4%B9%8B%E9%97%B4%E6%9C%89%E5%8C%BA%E5%88%AB%E5%90%97%EF%BC%9F.png)
(Lua)LaTeX 对待这两个字符是否相同,还是有一些区别?我习惯使用 Shift-Space 快捷键编写 Unicode NBSP,对我来说,使用它比波浪号更容易。我应该改变不间断空格字符 (U+00a0) 的行为,或者它是多余的?
答案1
在 PDFLaTeX 和latex
现代发行版上的命令中,它们是相同的。两者都计算为\nobreakspace
。在 LuaLaTeX 和 XeLaTeX 中,它们默认不同,但您可以更改这一点。
该inputenc
包将不间断空格字符(在每个包含它的编码中)解析为\nobreakspace
。例如,在 Latin-1 编码中,定义是
\DeclareInputText{160}{\nobreakspace}
对于默认的 UTF-8,它是
\DeclareUnicodeCharacter{00A0}{\nobreakspace}
LaTeX 内核还创建了~
一个活动字符,定义为
\def~{\nobreakspace{}}
在 LuaLaTeX 或 XeLaTeX 中,~
仍然计算为\nobreakspace
,在 LaTeX 内核中定义为
\DeclareRobustCommand{\nobreakspace}{%
\leavevmode\nobreak\ }
但是,字符 U+00A0 被按字面解释。(尽管它仍然从 PDF 中搜索并复制空格字符。)您可以清楚地看到与测试文件的区别
\documentclass{article}
\begin{document}
foo~bar{^^a0}baz
\end{document}
具体来说,U+00A0 是字体设置的固定宽度,并\nobreakspace
使用与行其余部分相同的字间距 — 因此您可能需要等宽字体的固定宽度不间断空格。不间断空格字符、^^a0
和\symbol{"A0}
均\char"A0
提供相同的输出。
但是,您可以重新定义 U+00A0 来计算\nobreakspace
:
\documentclass{article}
\usepackage{fontspec}
\usepackage{newunicodechar}
\newunicodechar{^^a0}{\nobreakspace}
\begin{document}
foo~bar{^^a0}baz
\end{document}
答案2
在 LuaLaTeX 中它们有所不同。请看这个例子,“here” 前面的空格是 U+00A0。
在第一段中,活动 U+00A0 变为正常 U+00A0(当然,对于此设置,人们不想使用它\newunicodechar
,但测试需要它)。在第二段中,活动 U+00A0 是\nobreakspace
。
\documentclass{article}
\usepackage{newunicodechar}
\def\testchar{ }% U+00A0
\newunicodechar{ }{\test}% U+00A0
\begin{document}
\let\test\testchar
Some text with nonbreaking space up to here; now spaces are normal and we go to the next line
\let\test\nobreakspace
Some text with nonbreaking space up to here; now spaces are normal and we go to the next line
\end{document}
如你所见,在第一段中,单词之间的间距并不统一,并且指定为 U+00A0 的间距较大。
如果你
\newunicodechar{ }{\nobreakspace}% U+00A0
在您的序言中,您实际上是将 U+00A0 更改为\nobreakspace
(本质上与 相同~
)。