Преобразование «пробел + символ» в «неразрывный пробел + символ»

Преобразование «пробел + символ» в «неразрывный пробел + символ»

У меня есть файлы, содержащие фрагменты древнеанглийских текстов. В этих файлах используется буквавинн(ƿ ( U+01BF) и Ƿ ( U+01F7)), которые я хочу напечатать как современные w ( U+0077) и W ( U+0057). У меня нет проблем с этим, используя файл сопоставления, который я скомпилировал с помощью teckit_compileinto .tecfile ( 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}·также уберет пробел.

Связанный контент