将“空格 + 字符”映射到“不间断空格 + 字符”

将“空格 + 字符”映射到“不间断空格 + 字符”

我有一些包含古英语文本片段的文件。这些文件使用字母永利(ƿ ( U+01BF) 和 Ƿ ( U+01F7)),我想将其打印为现代 w ( U+0077) 和 W ( U+0057)。使用映射文件我可以毫无问题地做到这一点,我已将其编译到文件 ( )teckit_compile中。我还想要序列 ' ·'(空格(.tecteckit_compile oldenglish.map -o oldenglish.tecU+0020 ) 后跟一个插入点)被映射到'·'(不间断空格U+00A0)后跟一个标点符),但是出于某种原因,这不起作用。

这是我的.map文件(oldenglish.map):

LHSName "old"
RHSName "new"

pass(Unicode)

U+01BF <> U+0077 ; ‘ƿ’→‘w’
U+01F7 <> U+0057 ; ‘Ƿ’→‘W’
U+0020 U+00B7 <> U+00A0 U+00B7 ; ‘ ·’→‘ ·’

这是一个示例 LaTeX 文件及其输出:

\documentclass{article}

\usepackage{fontspec}
\setmainfont[Mapping=oldenglish]{Junicode}

\begin{document}
abcwxyz · ABCWXYZ

abcƿxyz · ABCǷXYZ
\end{document}

上述代码的输出

我知道U+0020 U+00B7没有被替换,U+00A0 U+00B7因为当我在最后一行测试它时,U+0020 U+00B7 <> U+00A0 U+0078我得到的不是“abcwxyz x ABCWXYZ”,而是“abcwxyz·ABCWXYZ”。

我猜是空格 ( U+0020) 导致了这个问题。我做错了什么吗?

非常感谢!☺

答案1

映射替换以字符为基础进行,但 XeTeX 从不使用空格字符;相反,它将空格标记更改为水平粘合,因此当达到替换阶段时,永远不会出现组合U+0020 U+00B7

您可以newunicodechar为此目的使用:

\documentclass{article}

\usepackage{fontspec}
\setmainfont[Mapping=oldenglish]{Junicode}

\usepackage{newunicodechar}
\newunicodechar{·}{\ifhmode\ifdim\lastskip>0pt \unskip~\fi\fi·}

\begin{document}

abcwxyz · ABCWXYZ

abcƿxyz · ABCǷXYZ

\parbox{0pt}{
abcwxyz · ABCWXYZ

abcƿxyz · ABCǷXYZ
}
\end{document}

标点符号被激活;如果在水平模式下发现它并且它前面有一个空格,它会删除该空格并插入一个不间断空格~,然后打印自身。

我不会使用U+00A0,因为这是一个字形,因此不参与线上的空间拉伸或收缩。

在此处输入图片描述

假设 · (U+00B7 MIDDLE DOT) 仅在此上下文中使用。类似代码\hspace{10pt}·也会删除空格。

相关内容