![使用 T1 编码和 lmodern 时如何在 \texttt 内自动连字符](https://linux22.com/image/299046/%E4%BD%BF%E7%94%A8%20T1%20%E7%BC%96%E7%A0%81%E5%92%8C%20lmodern%20%E6%97%B6%E5%A6%82%E4%BD%95%E5%9C%A8%20%5Ctexttt%20%E5%86%85%E8%87%AA%E5%8A%A8%E8%BF%9E%E5%AD%97%E7%AC%A6.png)
我正在寻找一种方法来启用 中的连字符\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=`\-}