如何在 LuaTeX 中启用 emdash/endash 连字?

如何在 LuaTeX 中启用 emdash/endash 连字?

我无法在 LuaLaTeX 中启用 emdash (---) 和 endash (--) 的连字符。这是我的测试文件:

% !Mode:: "TeX:UTF-8"
\documentclass{article}
\usepackage{fontspec}
    \defaultfontfeatures{Ligatures=TeX}
    \setmainfont{Cambria}
    \setsansfont[Mapping=tex-text]{Calibri}
\usepackage{ifluatex,ifxetex}
\begin{document}

\ifxetex
    This is XeTeX
\else\ifluatex
    This is LuaTeX
\fi\fi

\section{rmfamily}
\rmfamily
\begin{enumerate}
\item <<double quote>> by ligatures \verb|<<ligatures>>|
\item «double quotes» by symbols \verb|«double quotes»|
\item en--dash by ligatures \verb|en--dash|
\item em---dash by ligatures \verb|em---dash|
\item en–dash by symbol \verb|en–dash|
\item em—dash by symbol \verb|em—dash|
\end{enumerate}

\section{sffamily}
\sffamily
\begin{enumerate}
\item <<double quote>> by ligatures \verb|<<ligatures>>|
\item «double quotes» by symbols \verb|«double quotes»|
\item en--dash by ligatures \verb|en--dash|
\item em---dash by ligatures \verb|em---dash|
\item en–dash by symbol \verb|en–dash|
\item em—dash by symbol \verb|em—dash|
\end{enumerate}

\end{document} 

使用 XeLaTeX 编译时,\sffamily加载过时的选项Mapping=tex-text

    \setsansfont[Mapping=tex-text]{Calibri}

激活连字-----,但在LuaTeX中此选项似乎等同于Ligatures=TeX,所以我不知道如何恢复这两个连字的默认(在LaTeX中)行为。

这是软件包最新版本中引入的错误还是功能fontspec

我已经检查过,如果我不通过命令设置 OTF 字体,连字在 LuaTeX 下仍然可以正常工作

    \setmainfont{Cambria}
    \setsansfont[Mapping=tex-text]{Calibri}

答案1

luatex 中的 TeX-ligatures 不是字体属性,它们是字体加载器代码中实现的“伪造”功能。问题可能是几个月前报告的 luaotfload/context 代码中的错误:

http://archive.contextgarden.net/message/20110310.181448.288f2a38.en.html

我认为它已在上下文中得到纠正,但我怀疑新代码是否已经在 luaotfload 中找到了它的出路。

您可以直接测试字体(以排除字体规格问题并测试两种模式)

\documentclass{article}
\usepackage{luaotfload}
\begin{document}
 \font\test="Calibri:mode=node;+tlig" 

 \font\testb="Calibri:mode=base;+tlig" 
 \test -- --- abc 

 \testb -- --- abc 
\end{document}

答案2

这部分是字体,而 则不是问题fontspec。XeLaTeX 和 LuaTeX 使用不同的机制实现连字替换。XeLaTeX 使用 teckit 映射文件,而 LuaTeX 使用luaotfload进行转换。后者在某种程度上取决于字体如何实际实现某些字符。例如,将字体更改为 Linux Libertine O 可使连字正确显示。

更新

正如 Ulrike Fischer 所指出的,您可以通过在加载字体时为该键指定一个值,针对无法正常工作的字体逐个更改此设置Renderer。在 LuaLaTeX 中,此键有两个可能的(相关)值:Full。在 LuaLaTeX 中,此键有两个可能的(相关)值:(默认)和Basic。使用渲染器加载某些字体Basic将允许连字。但是,这并不适用于所有字体。有关更多讨论,请参阅以下主题comp.text.texluatex 中的 en-dash 和 em-dash

以下修改后的文档版本显示了该问题为何不会出现在 Linux Libertine O 中,以及如何针对 Cambria 进行修复。(Calibri)的工作方式相同。

正如 Ulrike 在她的回答中指出的那样,更强大的修复将会luaotfload在未来的某个时候传播。

% !Mode:: "TeX:UTF-8"
\documentclass{article}
\usepackage{fontspec}
    \defaultfontfeatures{Ligatures={TeX}}
    \setmainfont{Cambria}
    \setsansfont{Calibri}
\usepackage{ifluatex,ifxetex}
\usepackage{expl3}
\begin{document}

\ifxetex
    This is XeTeX
\else\ifluatex
    This is LuaTeX

\fi\fi

\section{Cambria}

\begin{enumerate}
\item <<double quote>> by ligatures \verb|<<ligatures>>|
\item «double quotes» by symbols \verb|«double quotes»|
\item en--dash by ligatures \verb|en--dash|
\item em---dash by ligatures \verb|em---dash|
\item en–dash by symbol \verb|en–dash|
\item em—dash by symbol \verb|em—dash|
\end{enumerate}

\section{Linux Libertine O}
\fontspec{Linux Libertine O}\selectfont
\begin{enumerate}
\item <<double quote>> by ligatures \verb|<<ligatures>>|
\item «double quotes» by symbols \verb|«double quotes»|
\item en--dash by ligatures \verb|en--dash|
\item em---dash by ligatures \verb|em---dash|
\item en–dash by symbol \verb|en–dash|
\item em—dash by symbol \verb|em—dash|
\end{enumerate}

\section{Cambria + Basic Renderer}
\fontspec[Renderer=Basic]{Cambria}\selectfont
\begin{enumerate}
\item <<double quote>> by ligatures \verb|<<ligatures>>|
\item «double quotes» by symbols \verb|«double quotes»|
\item en--dash by ligatures \verb|en--dash|
\item em---dash by ligatures \verb|em---dash|
\item en–dash by symbol \verb|en–dash|
\item em—dash by symbol \verb|em—dash|
\end{enumerate}

\end{document}

答案3

我无法与 Ulrike 和 Alan 的讨论水平相媲美。但多亏了关联在 Alan 的帮助下,我找到了如何使用另一种 Win 字体 Corbel 来获得 en-dash。两周前我遇到了同样的问题,感谢您的帮助,我现在知道如何处理它了:

\documentclass{article}
\usepackage{fontspec}
\setmainfont[Renderer=Basic,Ligatures=TeX]{Corbel}
\begin{document}
-- --- abc 
\end{document}

我通过这种方式得到了半破折号和长破折号。还是我错过了什么,这种获取破折号的方式已经过时了?

相关内容