如果不加载字体规范,\verb* 就无法在 XeLaTeX 下产生可见空间

如果不加载字体规范,\verb* 就无法在 XeLaTeX 下产生可见空间

\verb*在 XeLaTeX 下无法生成可见空间。如果加载包,问题会修复fontspec。顺便说一下,\textvisiblespace在这两种情况下都会生成可见空间。

此外,\verb*在 pdfLaTeX 下运行正常,但输出\textvisiblespace有些奇怪。

问题

  1. 为什么在 XeLaTeX 下\verb*无法产生可见空间?fontspec
  2. 如何fontspec修复 XeLaTeX 下的问题?
  3. 在 pdfLaTeX 下,为什么\textvisiblespace会产生与 不同的输出(符号) ?如何使用符号生成命令(如)\verb*| |获得与 相同的输出?\verb*| |\textvisiblespace

例子

\documentclass{minimal}
%\usepackage{fontspec}    % problem repaired if fontspec loaded

\begin{document}
\verb*|x x|               % failed under XeLaTeX, succeed under pdfLaTeX
\texttt\textvisiblespace  % succeed under both engine,
                          %   but strange under pdfLaTeX
\end{document}

输出

XeLaTeX 输出,不含字体规范

XeLaTeX 输出,带有字体规格

pdfLaTeX 输出

版本信息

  • TeX Live 2018 3.14159265-2.6
  • XeTeX 0.99999
  • pdfTeX 1.40.19
  • LaTeX2e <2018-04-01> 补丁级别 2
  • fontspec 2018/07/30 v2.6h

XeLaTeX 下的字体信息

  • 字体系列\TU/lmtt/m/n/10
  • 使用字体texmf-dist/fonts/opentype/public/lm/lmmono10-regular.otf
  • 使用fontspec,里面的空格符号\verb*{...}被映射到符号U+2423(通过使用 找到\XeTeXtracingfonts=1

答案1

在默认的 OT1 编码中,只有打字机字体具有可见的空格字符(其他字体没有)。因此,\textvisiblespace必须适用于所有字体的默认定义具有与 使用的字符不同的虚构定义\verb*。后者使用插槽 32 中的字符,因为如果您从 pdf 中剪切和粘贴(然后产生空格),该字符可以正常工作。

为了在任何情况下都能获得良好的可见空间,应该使用 pdfTeX 加载 T1 编码,即

\usepackage[T1]{fontenc}

随着新版 LaTeX 的发布(计划于 2018 年 12 月发布),\verb*或使用的字符verbatim*将获得一个名称\verbvisiblespace ,默认情况下,该名称将仅选择插槽 32。因此,它可以与其他字体一起使用,只要它们在该空间中确实具有合适的字形,并且它(但如果没有,则会给出错误的结果)并且可以重新定义为始终使用\textvisiblespace(在这种情况下终止剪切和粘贴),例如,

\DeclareRobustCommand\verbvisiblespace{\textvisiblespace}

在 LuaTeX 或 XeTeX 中,默认值也会被重新定义为明确使用 OT1/cmtt 中的空格字符来保持剪切和粘贴的能力(这是问题 #69)。

答案2

使用 pdflatex 的拉丁现代字体(lmodern 包)和 T1 字体编码。

 \documentclass{minimal}
 %\usepackage{fontspec}    % problem repaired if fontspec loaded
 \usepackage{lmodern}
 \usepackage[T1]{fontenc}

 \begin{document}
 \verb*|x x|               % failed under XeLaTeX, succeed under pdfLaTeX
 \texttt\textvisiblespace  % succeed under both engine,
                           %   but strange under pdfLaTeX
 \end{document}

并使用 xelatex 或 lualatex 取消注释 fontspec 行并注释掉 lmodern 和 fontenc 行。

相关内容