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}

ここに画像の説明を入力してください

の役割の1つは、を に展開することを\DeclareFontFamily{enc}{fam}{code}定義することである。 のため、制御シーケンスは直接使用できないため、()を使用することができる。通常の宣言は\enc+famcode\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=`\-}

関連情報