使用 T1 编码和 lmodern 时如何在 \texttt 内自动连字符

使用 T1 编码和 lmodern 时如何在 \texttt 内自动连字符

我正在寻找一种方法来启用 中的连字符\texttt。我发现这个答案它看起来很完美:对很多人来说简单而且实用。

我选择全局启用连字符,\texttt并按照那里的建议,添加了以下行:

\DeclareFontFamily{\encodingdefault}{\ttdefault}{\hyphenchar\font=`\-}

不幸的是,它没有起作用并且产生了不良的副作用:打字机字体不再使用,\texttt并且控制台输出中出现以下错误:

LaTeX Font Warning: Some font shapes were not available, defaults substituted.

这个错误让我走上了正确的道路:我在 LaTeX 文档中总是使用 T1 编码和 lmodern 字体:

\usepackage[T1]{fontenc}
\usepackage{lmodern}

当我注释掉这几行之后,一切都正常了。

有没有办法让原始答案也适用于这种情况?我本来想在那篇文章中添加一条评论,但不幸的是,我的声誉还不够,无法做到这一点。

非常感谢。

答案1

该问题可以通过不同的方式解决,即在使用该系列的任何字体之前,手动加载字体定义文件并更改连字符:

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{lmodern}

\makeatletter
\input{t1lmtt.fd}
\@namedef{T1+lmtt}{}
\makeatother

\begin{document}
\parbox{0pt}{\ttfamily
  \hspace{0pt}hyphenation in typewriter type 
}
\end{document}

在此处输入图片描述

的职责之一\DeclareFontFamily{enc}{fam}{code}是定义\enc+fam扩展为code。由于,控制序列\enc+fam不能直接使用+,因此可以使用\@namedef(即\expandafter\def\csname#1\endcsname)。由于正常声明是

\DeclareFontFamily{T1}{lmtt}{\hyphenchar=-1 }

确实

\@namedef{T1+lmtt}{\hyphenchar=-1 }

我们通过以下方式来抵消它

\@namedef{T1+lmtt}{}

code一旦选择了与字体系列相关的字体形状,就会使用 ,并将其永久附加到所选字体。因此,在实际选择任何字体之前进行重新定义非常重要。

答案2

Franks 的回答遗漏了一个重要点:当你在序言中声明字体系列时,LaTeX 不再尝试输入 .fd 文件,因此所有其他字体声明都会丢失。你可以在进行更改之前输入它们:

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{lipsum}
\makeatletter
\input{t1lmtt.fd}
\makeatother
\DeclareFontFamily{\encodingdefault}{\ttdefault}{\hyphenchar\font=`\-}


\begin{document}
\ttfamily abc \lipsum
\end{document}

或者:

\ttfamily
\hyphenchar\font=`\-
\DeclareFontFamily{\encodingdefault}{\ttdefault}{\hyphenchar\font=`\-}

相关内容