我有一些包含古英语文本片段的文件。这些文件使用字母永利(ƿ ( U+01BF
) 和 Ƿ ( U+01F7
)),我想将其打印为现代 w ( U+0077
) 和 W ( U+0057
)。使用映射文件我可以毫无问题地做到这一点,我已将其编译到文件 ( )teckit_compile
中。我还想要序列 ' ·'(空格(.tec
teckit_compile oldenglish.map -o oldenglish.tec
U+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}·
也会删除空格。