我想luximono
在 下使用 face 进行等宽排版XeLaTeX
。由于它已经安装在 下的 MikTeX 发行版中T1 encoding
,因此当我需要等宽类型时,我会切换到后者。为了做到这一点,我定义了相应的命令,如下面的 MWE 所示。现在,如果我不以\nobreakspace
我为 MWE 所做的形式重新定义控制序列,我会收到错误消息Command \nobreakspace unavailable in encoding T1
。我的重新定义是这个问题的一个解决方法,它更像是一个补丁,而不是一个令人满意的解决方案。有人能解释一下发生了什么,以及如何以更合适的方式解决它吗?
\documentclass[11pt]{memoir}
\usepackage[T1]{fontenc}
\usepackage{mathpazo}
\usepackage{fontspec}
\usepackage{xunicode}
\defaultfontfeatures{Numbers=OldStyle,Ligatures=TeX}
\setmainfont[BoldFont=texgyrepagella-bold.otf,
ItalicFont=texgyrepagella-italic.otf,
BoldItalicFont=texgyrepagella-bolditalic.otf]{texgyrepagella-regular.otf}
\usepackage{microtype}
\newcommand{\xlxmono}{
\def\nobreakspace{\nobreak\space\nobreak}
\fontfamily{ul9}\fontencoding{T1}
\selectfont
}
\renewcommand*{\ttfamily}{\xlxmono}
\renewcommand*{\texttt}[1]{
{\xlxmono #1}
}
\begin{document}
{\ttfamily This is one line set in a monotype face with a nobreakspace command~here.}
\texttt{This makes for yet another line with~it.}
\end{document}
答案1
如果你将示例修改为
\show\nobreakspace
\usepackage{fontspec}
\show\nobreakspace
你会看见
> \nobreakspace=macro:
->\protect \nobreakspace .
l.9 \show\nobreakspace
...
> \nobreakspace=macro:
->\EU1-cmd \nobreakspace \EU1\nobreakspace .
l.11 \show\nobreakspace
这意味着 EU1 编码设置\nobreakspace
已从与编码无关的命令变为与编码相关的命令,但没有设置默认定义,因此它适用于所有编码。将原始定义重新设置为默认定义可能是最简单的事情,但请注意,您不应混合使用fontenc
fontspec
在单个文档中混合和编码定义。
原始定义是
\DeclareRobustCommand{\nobreakspace}{%
\leavevmode\nobreak\ }
因此,您可以通过以下方式声明默认值
\DeclareTextCommandDefault{\nobreakspace}{\leavevmode\nobreak\ }
正如评论中指出的那样。
请注意,如果在垂直模式下使用,您的定义将不起作用,例如段落的开头,在该位置\nobreak
将阻止分页符而不是换行符。
与你的问题无关很多定义中的空白标记会在输出中产生空白:在以或%
结尾的定义中的每一行末尾放置一个。}
{
还要注意,您需要使用 xelatex 来使用 fontspec,但您还会加载 microtype,这会生成一个警告,提示它不适用于 xelatex:
Package microtype Warning: You don't seem to be using pdftex.
(microtype) `microtype' only works with pdftex.
(microtype) Try running `pdflatex' instead of `xelatex'.
除非您拥有 @UlrikeFischer 指出的测试版本。请参阅。 http://tlcontrib.metatex.org/cgi-bin/package.cgi/action=view/id=423
答案2
\nobreakspace
我只需在 T1 编码中提供一个合适的定义并定义\ttfamily
以便它同时选择 LuxiMono 和 T1 编码:
\usepackage{xpatch}
\renewcommand{\ttdefault}{ul9}
\xpatchcmd{\ttfamily}{\selectfont}{\fontencoding{T1}\selectfont}{}{}
\DeclareTextCommand{\nobreakspace}{T1}{\leavevmode\nobreak\ }
由于\texttt
依赖于\ttfamily
,因此没有必要对其采取行动。
答案3
使用这个序言:
\documentclass[11pt]{memoir}
\usepackage{fontspec}
\usepackage{unicode-math}
\usepackage{microtype}
\defaultfontfeatures{Numbers=OldStyle,Ligatures=TeX}
\setmainfont[BoldFont=texgyrepagella-bold.otf,
ItalicFont=texgyrepagella-italic.otf,
BoldItalicFont=texgyrepagella-bolditalic.otf]{texgyrepagella-regular.otf}
\newcommand\xlxmono{%
\def\nobreakspace{\nobreak\space\nobreak}
\fontfamily{ul9}\fontencoding{T1}\selectfont}
\renewcommand*\ttfamily{\xlxmono}
\renewcommand*\texttt[1]{{\xlxmono #1}}
\begin{document}