Mapeo de 'espacio + carácter' en 'espacio + carácter sin separación'

Mapeo de 'espacio + carácter' en 'espacio + carácter sin separación'

Tengo archivos que contienen fragmentos de textos en inglés antiguo. Estos archivos usan la letrawynn(ƿ ( U+01BF) y Ƿ ( U+01F7)) que quiero imprimir como w ( U+0077) y W ( U+0057) modernos. No tengo ningún problema en hacer esto usando un archivo de mapeo, que he compilado usando teckit_compileel .tecarchivo ( teckit_compile oldenglish.map -o oldenglish.tec). También quiero la secuencia ' ·' (espacio ( U+0020) seguido de uninterpunto) que se asignará a ' ·' (espacio irrompible( U+00A0) seguido de un interpunto), pero por alguna razón esto no funciona.

Este es mi .maparchivo ( 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 ; ‘ ·’→‘ ·’

Y este es un archivo LaTeX de ejemplo y su resultado:

\documentclass{article}

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

\begin{document}
abcwxyz · ABCWXYZ

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

Salida del código anterior.

U+0020 U+00B7que no está siendo reemplazado U+00A0 U+00B7porque cuando lo pruebo U+0020 U+00B7 <> U+00A0 U+0078en la última línea no obtengo 'abcwxyz x ABCWXYZ' sino 'abcwxyz · ABCWXYZ'.

Supongo que es el espacio ( U+0020) el que causa este problema. ¿Estoy haciendo algo mal?

¡Muchas gracias! ☺

Respuesta1

Las sustituciones de mapeo funcionan según los caracteres, pero XeTeX nunca usa el carácter de espacio; más bien, convierte las fichas de espacio en pegamento horizontal, de modo que cuando se llega a la etapa de sustitución, nunca hay una combinación U+0020 U+00B7.

Puedes utilizar newunicodecharpara este propósito:

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

El carácter interpuntual se activa; si se encuentra en modo horizontal y está precedido por un espacio, elimina el espacio e inserta un espacio sin separación ~, luego se imprime.

No usaría U+00A0, porque es un glifo y, por lo tanto, no participa en el estiramiento o la reducción del espacio en una línea.

ingrese la descripción de la imagen aquí

Esto supone que · (U+00B7 PUNTO MEDIO) se utiliza sólo en este contexto. Algo así \hspace{10pt}·también eliminaría el espacio.

información relacionada