在 XeLaTeX 下切换到 T1 编码时命令 \nobreakspace 不可用

在 XeLaTeX 下切换到 T1 编码时命令 \nobreakspace 不可用

我想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已从与编码无关的命令变为与编码相关的命令,但没有设置默认定义,因此它适用于所有编码。将原始定义重新设置为默认定义可能是最简单的事情,但请注意,您不应混合使用fontencfontspec在单个文档中混合和编码定义。

原始定义是

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

相关内容