У меня есть файлы, содержащие фрагменты древнеанглийских текстов. В этих файлах используется буквавинн(ƿ ( U+01BF
) и Ƿ ( U+01F7
)), которые я хочу напечатать как современные w ( U+0077
) и W ( U+0057
). У меня нет проблем с этим, используя файл сопоставления, который я скомпилировал с помощью teckit_compile
into .tec
file ( 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 СРЕДНЯЯ ТОЧКА) используется только в этом контексте. Что-то вроде этого \hspace{10pt}·
также уберет пробел.