我无法在 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.tex
:luatex 中的 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}
我通过这种方式得到了半破折号和长破折号。还是我错过了什么,这种获取破折号的方式已经过时了?