\verb*
在 XeLaTeX 下无法生成可见空间。如果加载包,问题会修复fontspec
。顺便说一下,\textvisiblespace
在这两种情况下都会生成可见空间。
此外,\verb*
在 pdfLaTeX 下运行正常,但输出\textvisiblespace
有些奇怪。
问题
- 为什么在 XeLaTeX 下
\verb*
无法产生可见空间?fontspec
- 如何
fontspec
修复 XeLaTeX 下的问题? - 在 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}
输出
版本信息
- 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 行。