
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 \texttt
em 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}
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 \renewcommand
por \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 \texttt
usar 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}
Responder2
Seguindo a resposta de Steven, em meu documento eu estava usando \texttt
Figuras para mostrar caminhos e URLs, mas também estava usando \texttt
em 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 \texttt
comandos para texto normal que não usa símbolos. Como mostra a imagem abaixo, \texttt
funciona bem para figuras, mas para texto normal não funciona bem.
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.
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 \texttt
de 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 \def
já 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}