Como hifenizar automaticamente em \texttt ao usar codificação T1 e lmodern

Como hifenizar automaticamente em \texttt ao usar codificação T1 e lmodern

Eu estava procurando uma maneira de ativar a hifenização dentro do arquivo \texttt. eu encontreiesta respostae parecia perfeito: simples e útil para muitas pessoas.

Optei por ativar a hifenização globalmente \texttte, conforme sugerido, adicionei a seguinte linha:

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

Infelizmente, não funcionou e teve um efeito colateral indesejado: a fonte da máquina de escrever não era mais usada internamente \texttte o seguinte erro apareceu na saída do console:

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

Este erro me apontou o caminho certo: eu sempre uso a codificação T1 e as fontes lmodern em meus documentos LaTeX:

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

e assim que comentei essas falas, tudo funcionou bem.

Existe uma maneira de adaptar a resposta original a este caso também? Eu teria adicionado um comentário a esse post, mas infelizmente ainda não tenho reputação suficiente para fazer isso.

Muito obrigado.

Responder1

O problema pode ser resolvido de uma maneira diferente, que requer o carregamento manual do arquivo de definição de fonte e a alteração do hífen antes de qualquer fonte dessa família ser usada:

\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}

insira a descrição da imagem aqui

Uma das funções de \DeclareFontFamily{enc}{fam}{code}é definir \enc+fampara expandir para code. A sequência de controle \enc+famnão pode ser usada diretamente por causa de +, então \@namedef(que é \expandafter\def\csname#1\endcsname) pode ser usada. Como a declaração normal é

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

o que faz

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

nós neutralizamos isso fazendo

\@namedef{T1+lmtt}{}

O codeé usado assim que um formato de fonte relativo à família de fontes é selecionado e anexado permanentemente à fonte escolhida. Portanto, é importante que a redefinição aconteça antes de qualquer fonte ser realmente selecionada.

Responder2

A resposta de Frank está faltando um ponto importante: quando você declara uma família de fontes em seu preâmbulo, o látex não tenta mais inserir o arquivo .fd e, portanto, todas as outras declarações de fontes são perdidas. Você pode inseri-los antes de fazer a alteração:

\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}

Ou alternativamente:

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

informação relacionada