Как автоматически расставлять переносы в \texttt при использовании кодировки T1 и lmodern

Как автоматически расставлять переносы в \texttt при использовании кодировки T1 и lmodern

Я искал способ включить переносы в\texttt . Я нашелэтот ответи это казалось идеальным: простым и полезным для многих людей.

Я решил включить глобальное расставление переносов \textttи, как там предлагалось, добавил следующую строку:

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

К сожалению, это не сработало и имело нежелательный побочный эффект: шрифт пишущей машинки больше не использовался внутри \texttt, а в выводе консоли появилась следующая ошибка:

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

Эта ошибка указала мне правильный путь: я всегда использую кодировку T1 и шрифты lmodern в своих документах LaTeX:

\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

В ответе Фрэнка отсутствует важный момент: когда вы объявляете семейство шрифтов в преамбуле, 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=`\-}

Связанный контент