Quebra de linha no texttt

Quebra de linha no texttt

Gostaria que o látex quebrasse um texto longo \texttt{}que não contenha espaços em branco. Atualmente o texto simplesmente sai da página.

O documento látex é gerado a partir de um documento reStructureText (tenho que usar reStructuredText). Portanto prefiro não usar estas soluções:

  • substituindo \texttt{}por \path{}ou \url{}(a menos que alguém possa me dizer como fazer com que o Docutils faça isso)
  • inserção \allowbreak{}/hífens suaves (viável, mas destrói a legibilidade do documento reStructuredText)

Existe alguma configuração global no documento latex que causaria a quebra de strings texttt? Existe alguma outra boa maneira de obter um documento imprimível que mostre todo o texto?

Aqui está um exemplo mínimo para o meu problema:

\documentclass[a4paper]{article}
\begin{document}
If an unrecoverable error occurs during the transformation, then a
\texttt{javax.xml.transform.TransformerException} is thrown.
\end{document}

Quando tento criar um pdf (usando "pdflatex a.tex"), apenas "TranformerEx" fica visível de "TransformerException".

Responder1

Roubando a resposta do egreg emComo emular a hifenização \url sem usar o pacote url?, onde ele redefiniu \url, começo com a mesma redefinição para redefinir \textttem vez de \url. Na encarnação original do egreg, ele permitia quebras de linha em .e /caracteres.

Mas outros símbolos de breakpoint podem ser adicionados, por exemplo, abaixo também faço [um breakpoint:

\documentclass[a4paper]{article}
\renewcommand{\texttt}[1]{%
  \begingroup
  \ttfamily
  \begingroup\lccode`~=`/\lowercase{\endgroup\def~}{/\discretionary{}{}{}}%
  \begingroup\lccode`~=`[\lowercase{\endgroup\def~}{[\discretionary{}{}{}}%
  \begingroup\lccode`~=`.\lowercase{\endgroup\def~}{.\discretionary{}{}{}}%
  \catcode`/=\active\catcode`[=\active\catcode`.=\active
  \scantokens{#1\noexpand}%
  \endgroup
}
\usepackage{lipsum}
\begin{document}
\lipsum[4]
If an unrecoverable error occurs during the transformation, then a
\texttt{javax.xml.transform.TransformerException} is thrown.

If an unrecoverable error occurs during the transformation, then a
\texttt{\$GLOBALS['TCA']['tt\_address']['feInterface']['fe\_admin\_fieldList']}
\end{document}

insira a descrição da imagem aqui

Se você precisar usar esta solução na seção ou em outros títulos, ou em outros locais gravados e lidos em arquivos .aux, será necessário substituí-la \renewcommandpor \DeclareRobustCommand- consulte esta resposta para obter mais informações:Combinando Wrapping \texttt{} com Seções e TOC - Constante alfabética inadequada


SUPLEMENTO

Lemdan pergunta (e Joey perguntou há muito tempo) em um comentário como fazer isso para tornar o sublinhado _um ponto de interrupção? Como o sublinhado geralmente é o código de gato 8, é necessário absorver o argumento para \textttusar o código de gato _definido como 12. É claro que isso impedirá o uso de subscritos dentro de math dentro de a \texttt, mas isso não deve ser muito difícil de viver com. Isso também eliminará a necessidade de escapar de sublinhados em arquivos \texttt.

\documentclass[a4paper]{article}

\catcode`_=12 %
\renewcommand{\texttt}[1]{%
  \begingroup
  \ttfamily
  \begingroup\lccode`~=`/\lowercase{\endgroup\def~}{/\discretionary{}{}{}}%
  \begingroup\lccode`~=`[\lowercase{\endgroup\def~}{[\discretionary{}{}{}}%
  \begingroup\lccode`~=`.\lowercase{\endgroup\def~}{.\discretionary{}{}{}}%
  \begingroup\lccode`~=`_\lowercase{\endgroup\def~}{_\discretionary{}{}{}}%
  \catcode`/=\active\catcode`[=\active\catcode`.=\active\catcode`_=\active
  \scantokens{#1\noexpand}%
  \endgroup
}
\catcode`_=8 % 

\usepackage{lipsum}
\begin{document}
\lipsum[4]
If an unrecoverable error occurs during the transformation, then a
\texttt{javax.xml.transform.TransformerException} is thrown.

If an unrecoverable error occurs during the transformation, then a
\texttt{\$GLOBALS_'TCA']['tt_address']['feInterface']['fe_admin_fieldList']}
\end{document}

insira a descrição da imagem aqui

Responder2

Seguindo a resposta de Steven, em meu documento eu estava usando \textttFiguras para mostrar caminhos e URLs, mas também estava usando \textttem meu texto para destacar pequenos pedaços de código.

Embora o código fornecido por Steven funcione com minhas figuras, ele ainda transborda as margens ao escrever \textttcomandos para texto normal que não usa símbolos. Como mostra a imagem abaixo, \textttfunciona bem para figuras, mas para texto normal não funciona bem.

insira a descrição da imagem aqui

Para corrigir isso, peguei emprestado o código para\justify desta postagem tex.see acabei de adicionar isso ao código existente.

\newcommand*\justify{%
  \fontdimen2\font=0.4em% interword space
  \fontdimen3\font=0.2em% interword stretch
  \fontdimen4\font=0.1em% interword shrink
  \fontdimen7\font=0.1em% extra space
  \hyphenchar\font=`\-% allowing hyphenation
}

\renewcommand{\texttt}[1]{%
  \begingroup
  \ttfamily
  \begingroup\lccode`~=`/\lowercase{\endgroup\def~}{/\discretionary{}{}{}}%
  \begingroup\lccode`~=`[\lowercase{\endgroup\def~}{[\discretionary{}{}{}}%
  \begingroup\lccode`~=`.\lowercase{\endgroup\def~}{.\discretionary{}{}{}}%
  \catcode`/=\active\catcode`[=\active\catcode`.=\active
  \justify\scantokens{#1\noexpand}%
  \endgroup
}

Isso produz um resultado muito melhor e funciona no meu caso em que uso máquina de escrever em lugares diferentes.

insira a descrição da imagem aqui

Responder3

Não tenho certeza de quanto você está disposto a fazer desde o preâmbulo, mas aqui vai uma sugestão:

\documentclass{article}

\begingroup
  \catcode`\.=\active
  \gdef.{\normalperiod\allowbreak}%
\endgroup

\newcommand\aepath[1]{%%
  \bgroup 
    \let\normalperiod=.%%
    \catcode`\.=\active
    \everyeof{\noexpand}%%
    \endlinechar=-1%%
    \ttfamily\scantokens{#1}%%
  \egroup}

\let\oldtexttt\texttt
\let\texttt\aepath

\begin{document}

If an unrecoverable error occurs during the transformation, then a
\texttt{javax.xml.transform.TransformerException} is thrown.

\end{document}

No seu MWE, presumi que você deseja que seu código seja quebrável nos pontos onde .ocorre a. Supondo que todas as situações em que você possa se deparar com um texto longo envolvam .nomes separados e que você não precise \textttde nenhum outro propósito em seu documento, esta pode ser uma solução para você.

Caso você esteja preocupado com o fato de outro pacote desejar .estar ativo, mas definido de forma diferente, você pode adotar a seguinte abordagem:

\documentclass{article}

\begingroup
  \catcode`\.=\active
  \gdef\redefineperiod{\def.{\normalperiod\allowbreak}}%%
\endgroup

\newcommand\aepath[1]{%%
  \bgroup 
    \let\normalperiod=.%%
    \catcode`\.=\active
    \redefineperiod
    \everyeof{\noexpand}%%
    \endlinechar=-1%%
    \ttfamily\scantokens{#1}%%
  \egroup}

\let\oldtexttt\texttt
\let\texttt\aepath

\begin{document}

If an unrecoverable error occurs during the transformation, then a
\texttt{javax.xml.transform.TransformerException} is thrown.  Followed
by more text which is just to fill to the ned of the line.

\end{document}

Ingenuamente (ou seja: foi isso que inicialmente pensei que poderia fazer), você pode tentar

\documentclass{article}

\newcommand\aepath[1]{%%
  \bgroup 
    \let\normalperiod=.%%
    \catcode`\.=\active
    \def.{\normalperiod\allowbreak}%%
    \everyeof{\noexpand}%%
    \endlinechar=-1%%
    \ttfamily\scantokens{#1}%%
  \egroup}

\let\oldtexttt\texttt
\let\texttt\aepath

\begin{document}

If an unrecoverable error occurs during the transformation, then a
\texttt{javax.xml.transform.TransformerException} is thrown.  Followed
by more text which is just to fill to the ned of the line.

\end{document}

Mas isso irá falhar porque o período seguinte \defjá foi tokenizado e não está ativo. Portanto, o LaTeX gerará um erro sobre uma sequência de controle ausente.

ATUALIZAR

Se você não estiver particularmente preocupado com o local onde ocorrem as interrupções, poderá usar algo como:

\documentclass{article}

\makeatletter
\newcommand\aepath[1]{%%
  \bgroup
    \ttfamily
    \ae@path#1\relax\@nil
  \egroup}
\def\ae@path#1#2\@nil{%%
  \def\ae@continue{}%%
  \detokenize{#1}\unskip\penalty\z@  
  \ifx\relax#2%%
  \else 
    \def\ae@continue{\ae@path#2\@nil}%%
  \fi
  \ae@continue}
\makeatother

\let\texttt\aepath

\begin{document}

If an unrecoverable error occurs during the transformation, then a
\texttt{javax.xml.transform.TransformerException} is thrown.

\end{document}

embora isso pareça um pouco abaixo do ideal para mim. Acho que seria melhor decidir onde deveriam estar os pontos de interrupção e seguir o exemplo para .transformar esses caracteres (como /,, -etc.) em caracteres ativos dentro do contexto do comando e contrabandear a penalidade para permitir uma pausa após eles.

Responder4

Esta é uma resposta tardia, mas postei uma pergunta com uma respostaaqui, aqui está novamente, literalmente:

Utilize \seqsplit.

\documentclass[9pt,oneside]{amsart}

\usepackage{seqsplit}

\begin{document}

Filler text. Filler text. Filler text. Filler text. \seqsplit{0xcf416c536ec1a19ed1fb89e4ec7ffb3cf73aa413b3aa9b77d60e4fd81a4296ba}

\end{document}

Usando seqsplit para dividir texto longo.

informação relacionada