为什么 \texttt{} 中的 (:) 后面会有多余的空格

为什么 \texttt{} 中的 (:) 后面会有多余的空格

每当我在命令中的冒号(:) 后输入空格时,\texttt{}就会出现多余的空格——这是一个简单的例子:

\documentclass[12pt]{article}

\thispagestyle{empty}

\begin{document}
\section*{Test Space after Colon}  

\texttt{1234 : 8901}\\
\texttt{12345678901}

\vspace{\baselineskip}

\noindent 
The above was produced by 
\begin{verbatim}
\texttt{1234 : 8901}\\
\texttt{12345678901}  
\end{verbatim}
and has extra space after 
the colon (:) 

\vspace{\baselineskip}

\noindent 
\textsf{1234 : 8901}\\
\textsf{12345678901}

\noindent 
The above was produced by 
\begin{verbatim}
\textsf{1234 : 8901}\\
\textsf{12345678901}  
\end{verbatim}
and has no extra space after 
the colon (:) 

\end{document}

上述代码生成

冒号后测试空格

正如您在示例中看到的,\textsf{}例如,命令中没有出现额外的空格。

知道这里发生什么事吗?

答案1

这是默认设置的效果\nonfrenchspacing,即在句子/从句结束标点后添加额外空格。等宽字体突出\texttt显示了该效果。

\texttt{\frenchspacing1234 : 8901}\\

产生均匀的间距

\verb|1234 : 8901|\\

答案2

中冒号后的空间也较大\textsf,但比中小得多\texttt。如果我尝试

\sbox0{\textsf{1234 : 8901}}\showthe\wd0
\sbox0{\frenchspacing\textsf{1234 : 8901}}\showthe\wd0

我明白了

> 59.40216pt.
l.28 \sbox0{\textsf{1234 : 8901}}\showthe\wd0

?
> 58.09662pt.
l.29 ...chspacing\textsf{1234 : 8901}}\showthe\wd0

因此添加了额外的 1.3pt,没有使用法式间距。中的异常间距\texttt是由于字体间距参数造成的;这些是cmtt10

(FONTDIMEN
   (SLANT R 0.0)
   (SPACE R 0.524996)
   (STRETCH R 0.0)
   (SHRINK R 0.0)
   (XHEIGHT R 0.430555)
   (QUAD R 1.049991)
   (EXTRASPACE R 0.524996)
   )

虽然cmss10

(FONTDIMEN
   (SLANT R 0.0)
   (SPACE R 0.333334)
   (STRETCH R 0.166667)
   (SHRINK R 0.111112)
   (XHEIGHT R 0.444445)
   (QUAD R 1.000003)
   (EXTRASPACE R 0.111112)
   )

EXTRASPACE是这里的罪魁祸首,加上与冒号相关的空间因子代码,即 2000。

现在,\ttfamily可以用来模拟打字机和空间因子的工作,就像打字员过去所做的那样(至少在美国),在句子结尾的句号和冒号后留出额外的空间。

您可以\ttfamily通过将以下代码添加到序言中来重新定义为“非空间扩展”

\makeatletter
\let\ttfamily\relax % avoid a spurious warning
\DeclareRobustCommand\ttfamily
        {\not@math@alphabet\ttfamily\mathtt
         \fontfamily\ttdefault\selectfont\frenchspacing}
\makeatother

该命令\texttt在内部使用 的当前定义\ttfamily,因此您不需要重新定义它。

这只是 的核定义\ttfamily\frenchspacing加上 。更简单地说,

\usepackage{xpatch}
\xapptocmd{\ttfamily}{\frenchspacing}{}{}

2022 年更新

LaTeX 的较新版本提供了钩子,因此可以更轻松地完成任务。

\documentclass{article}

\AddToHook{cmd/ttfamily/after}{\frenchspacing}

\begin{document}

\texttt{Look ma: no extra space!}

\texttt{\nonfrenchspacing Look ma: extra space!} % for comparison

\end{document}

在第二个例子中,\nonfrenchspacing撤消了的效果\frenchspacing

在此处输入图片描述

相关内容