Mapeando 'espaço + caractere' em 'espaço + caractere inseparável'

Mapeando 'espaço + caractere' em 'espaço + caractere inseparável'

Tenho arquivos contendo fragmentos de textos em inglês antigo. Esses arquivos usam a letraWynn(ƿ ( U+01BF) e Ƿ ( U+01F7)) que desejo imprimir como w ( U+0077) e W ( U+0057) modernos. Não tenho problemas em fazer isso usando um arquivo de mapeamento, que compilei usando teckit_compileno .tecarquivo ( teckit_compile oldenglish.map -o oldenglish.tec). Eu também quero a sequência '·' (espaço ( U+0020) seguida por uminterponto) a ser mapeado em ' ·' (Espaço inquebrável( U+00A0) seguido de um interponto), mas por algum motivo não funciona.

Este é o meu .maparquivo ( 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 ; ‘ ·’→‘ ·’

E este é um exemplo de arquivo LaTeX e sua saída:

\documentclass{article}

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

\begin{document}
abcwxyz · ABCWXYZ

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

Saída do código anterior

Eu sei U+0020 U+00B7que não está sendo substituído U+00A0 U+00B7porque quando eu testo U+0020 U+00B7 <> U+00A0 U+0078na última linha não recebo 'abcwxyz x ABCWXYZ', mas 'abcwxyz · ABCWXYZ'.

Acho que é o espaço ( U+0020) que causa esse problema. Estou fazendo algo errado?

Muito obrigado! ☺

Responder1

As substituições de mapeamento funcionam com base em caracteres, mas o XeTeX nunca usa o caractere de espaço; em vez disso, ele transforma os tokens de espaço em cola horizontal, de modo que, quando o estágio de substituição for alcançado, nunca haverá uma combinação U+0020 U+00B7.

Você pode usar newunicodecharpara esta finalidade:

\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}

O caractere interponto é ativado; se for encontrado no modo horizontal e for precedido por um espaço, ele remove o espaço e insere um espaço inseparável ~e então se imprime.

Eu não usaria U+00A0, porque este é um glifo e, portanto, não participa do alongamento ou redução do espaço em uma linha.

insira a descrição da imagem aqui

Isso pressupõe que · (U+00B7 MIDDLE DOT) seja usado apenas neste contexto. Algo como \hspace{10pt}·removeria o espaço também.

informação relacionada