我认为我的问题是一个与重新映射有关的一般问题,但我想要做的是在 Linux Libertine(和 XeLaTeX)中使用德语尖锐 s(E04C)的圆形(连字符 ss)形式,而不是标准形式(00DF)。
我认为这可以通过添加来实现
U+00DF <> U+E04C
到我的 tex-text.map。
但这似乎不起作用。编译
\documentclass{minimal}
\usepackage{xltxtra}
\setmainfont[Mapping=tex-text]{Linux Libertine O}
\begin{document}
Lessingstraße
\end{document}
使用 XeLaTeX 仍然会在“Lessingstra_ß_e”中给我 00DF。
有人能告诉我这里缺少什么吗?
提前致谢,
雷纳
答案1
如果您选择使用 LuaLaTeX,您可以通过以下方式实现目标:(a) 定义一个 Lua 函数,用 替换所有 实例ß
;\char"E04C
(b) 将此函数添加到process_input_buffer
回调中。顾名思义,此回调处理输入缓冲区前TeX 进行任何处理。
\documentclass{article}
\usepackage{fontspec,luatextra}
\setmainfont{Linux Libertine O}
\begin{luacode}
function replace_eszett( line )
return string.gsub( line, 'ß', '\\char"E04C ' )
end
luatexbase.add_to_callback( "process_input_buffer",
replace_eszett, "replace_eszett" )
\end{luacode}
\begin{document}
Lessingstraße \emph{Lessingstraße}
\end{document}
为了完整起见,上例的输出如下所示没有基于lua的代码:
答案2
我设法通过以下方式实现了所需的输出newunicodechar
:
\documentclass{minimal}
\usepackage{xltxtra, newunicodechar}
\setmainfont[Mapping=tex-text]{Linux Libertine O}
\newunicodechar{ß}{^^^^e04c}
\begin{document}
Lessingstraße
\end{document}
在第四行中,您还可以使用\newunicodechar{ß}{}
,其中第二个参数是Unicode字符U + E04C。
最后,您可以使用这个答案直接访问字体的字形:
\newunicodechar{ß}{\XeTeXglyph\the\XeTeXglyphindex "germandbls.alt"\relax}
这样,您在任何时候都不会使用 Unicode 的私有使用区域,这使得映射对于字体编码的更改更加健壮,也适用于首先未分配给 Unicode 代码点的字符,并且也适用于使用相同命名约定的其他字体。
答案3
已解决:我需要编译相关的.map文件:
teckit_compile tex-text.map -o tex-text.tec