
Me gustaría que el látex rompa el texto largo \texttt{}
que no contiene espacios en blanco. Actualmente el texto simplemente se sale de la página.
El documento de látex se genera a partir de un documento reStructureText (tengo que usar reStructuredText). Por eso prefiero no utilizar estas soluciones:
- reemplazando
\texttt{}
por\path{}
o\url{}
(a menos que alguien pueda decirme cómo hacer que Docutils haga eso) - insertar
\allowbreak{}
/guiones suaves (factible pero destruye la legibilidad del documento reStructuredText)
¿Existe alguna configuración global en el documento de látex que podría provocar la rotura de las cadenas de texto? ¿Existe alguna otra buena manera de obtener un documento imprimible que muestre todo el texto?
Aquí un ejemplo mínimo de mi 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}
Cuando intento crear un pdf (usando "pdflatex a.tex"), sólo "TranformerEx" es visible en "TranformerException".
Respuesta1
Robando la respuesta de egreg en¿Cómo emular \url guiones sin utilizar el paquete de URL?, donde redefinió \url
, comienzo con esa misma redefinición para redefinir \texttt
en lugar de \url
. En la encarnación original de egreg, permitía saltos de línea en caracteres .
y /
.
Pero se pueden agregar otros símbolos de punto de interrupción, por ejemplo, a continuación también hago [
un punto de interrupción:
\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}
Si necesita utilizar esta solución en la sección u otros encabezados, u otros lugares escritos y leídos desde archivos .aux, deberá reemplazarla \renewcommand
con \DeclareRobustCommand
; consulte esta respuesta para obtener más información:Combinando envoltura \texttt{} con secciones y TOC - Constante alfabética incorrecta
SUPLEMENTO
Lemdan pregunta (y Joey preguntó hace mucho tiempo) en un comentario cómo hacer esto para que el guión bajo sea _
un punto de interrupción. Debido a que el guión bajo suele ser catcode 8, uno tiene que absorber el argumento para \texttt
usar en su lugar el catcode _
establecido en 12. Por supuesto, esto evitará el uso de subíndices dentro de math dentro de a \texttt
, pero eso no debería ser demasiado difícil de vivir. con. Esto también eliminará la necesidad de evitar los guiones bajos en \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}
Respuesta2
Siguiendo la respuesta de Steven, en mi documento estaba usando \texttt
Figuras para mostrar rutas y URL, pero también estaba usando \texttt
en mi texto para resaltar pequeños fragmentos de código.
Si bien el código que proporcionó Steven funciona con mis figuras, aún desborda los márgenes al escribir \texttt
comandos para texto normal que no usa símbolos. Como muestra la imagen a continuación, \texttt
funciona bien para figuras, pero para texto normal no funciona bien.
Para solucionar este problema, tomé prestado el código de\justify
de esta publicación de tex.sey simplemente lo agregué al 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
}
Esto produce un resultado mucho mejor y funciona en mi caso en el que uso una máquina de escribir en diferentes lugares.
Respuesta3
No estoy seguro de cuánto estás dispuesto a hacer según el preámbulo, pero aquí tienes una sugerencia:
\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}
Desde su MWE, supuse que desea que su código sea rompible en los puntos donde .
ocurre a. Suponiendo que todas las situaciones en las que pueda encontrarse con un texto largo involucran .
nombres separados y que no los necesita \texttt
para ningún otro propósito en su documento, esta podría ser una solución para usted.
En caso de que le preocupe que otro paquete desee .
estar activo pero definido de manera diferente, puede adoptar el siguiente enfoque:
\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 (es decir: esto es lo que inicialmente pensé que podía hacer), podrías intentar
\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}
Pero esto fallará porque el período siguiente \def
ya ha sido tokenizado y no está activo. Entonces, LaTeX arrojará un error sobre una secuencia de control faltante.
ACTUALIZAR
Si no le preocupa especialmente dónde se producen las roturas, puede utilizar 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}
aunque esto me parece un poco subóptimo. Creo que sería mejor decidir dónde deberían estar los puntos de interrupción y seguir el ejemplo para .
convertir esos personajes (como /
,, -
etc.) en personajes activos dentro del contexto del comando e introducir de contrabando la penalización para permitir una pausa después de ellos.
Respuesta4
Esta es una respuesta tardía, pero publiqué una pregunta con una respuesta.aquí, aquí está de nuevo, textualmente:
Utilice \seqsplit.
\documentclass[9pt,oneside]{amsart}
\usepackage{seqsplit}
\begin{document}
Filler text. Filler text. Filler text. Filler text. \seqsplit{0xcf416c536ec1a19ed1fb89e4ec7ffb3cf73aa413b3aa9b77d60e4fd81a4296ba}
\end{document}