
Ich möchte, dass Latex langen Text \texttt{}
, der keine Leerzeichen enthält, umbricht. Derzeit läuft der Text einfach über die Seite hinaus.
Das Latex-Dokument wird aus einem reStructureText-Dokument generiert (ich muss reStructuredText verwenden). Daher ziehe ich es vor, diese Lösungen nicht zu verwenden:
- Ersetzen
\texttt{}
durch\path{}
oder\url{}
(es sei denn, jemand kann mir erklären, wie ich das mit Docutils machen kann) - Einfügen
\allowbreak{}
von weichen Trennstrichen (möglich, zerstört aber die Lesbarkeit des reStructuredText-Dokuments)
Gibt es im Latex-Dokument eine globale Konfiguration, die zum Unterbrechen von Texttt-Zeichenfolgen führen könnte? Gibt es eine andere gute Möglichkeit, ein druckbares Dokument zu erhalten, in dem der gesamte Text angezeigt wird?
Hier ein Minimalbeispiel für mein Problem:
\documentclass[a4paper]{article}
\begin{document}
If an unrecoverable error occurs during the transformation, then a
\texttt{javax.xml.transform.TransformerException} is thrown.
\end{document}
Wenn ich versuche, ein PDF zu erstellen (mit „pdflatex a.tex“), ist nur „TranformerEx“ oder „TranformerException“ sichtbar.
Antwort1
Diebstahl von egregs Antwort beiWie emuliert man die Silbentrennung von \url, ohne das URL-Paket zu verwenden?, wobei er neu definiert hat \url
, beginne ich mit derselben Neudefinition, um stattdessen \texttt
anstelle von neu zu definieren \url
. In der ursprünglichen Inkarnation von egreg waren Zeilenumbrüche bei .
und /
Zeichen zulässig.
Es können aber auch andere Haltepunktsymbole hinzugefügt werden. Im Folgenden erstelle ich beispielsweise auch [
einen Haltepunkt:
\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}
Wenn Sie diese Lösung in Abschnitten oder anderen Überschriften oder an anderen Stellen verwenden möchten, an denen .aux-Dateien geschrieben und aus ihnen gelesen werden, müssen Sie ersetzen \renewcommand
durch\DeclareRobustCommand
ersetzen . Weitere Informationen finden Sie in dieser Antwort:Kombinieren des Umbrechens von \texttt{} mit Abschnitten und Inhaltsverzeichnis - Unsachgemäße alphabetische Konstante
ERGÄNZUNG
Lemdan fragt (und Joey hat vor langer Zeit gefragt) in einem Kommentar, wie man den Unterstrich zu _
einem Haltepunkt macht. Da der Unterstrich normalerweise den Catcode 8 hat, muss man das Argument akzeptieren, \texttt
stattdessen den Catcode von _
auf 12 zu setzen. Natürlich verhindert dies die Verwendung von Indizes innerhalb von mathematischen Werten innerhalb von \texttt
, aber damit sollte man nicht allzu schwer leben können. Dadurch entfällt auch die Notwendigkeit, Unterstriche in zu maskieren \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}
Antwort2
Ausgehend von Stevens Antwort habe ich in meinem Dokument \texttt
in Abbildungen Pfade und URLs verwendet, aber auch \texttt
in meinem Text, um kleine Codeteile hervorzuheben.
Obwohl der von Steven bereitgestellte Code mit meinen Abbildungen funktioniert, läuft er dennoch über die Ränder hinaus, wenn \texttt
Befehle für normalen Text geschrieben werden, der keine Symbole verwendet. Wie das folgende Bild zeigt, \texttt
funktioniert es für Abbildungen einwandfrei, für normalen Text jedoch nicht so gut.
Um dies zu beheben, habe ich den Code für\justify
aus diesem tex.se-Beitragund das einfach zum vorhandenen Code hinzugefügt.
\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
}
Dies führt zu einem viel besseren Ergebnis und funktioniert in meinem Fall, in dem ich die Schreibmaschine an verschiedenen Stellen verwende.
Antwort3
Ich bin nicht sicher, wie viel Sie aus der Präambel machen möchten, aber hier ist ein Vorschlag:
\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}
Aus Ihrem MWE bin ich davon ausgegangen, dass Sie möchten, dass Ihr Code an Stellen, an denen ein .
auftritt, unterbrochen werden kann. Vorausgesetzt, dass alle Situationen, in denen Sie auf längeren Text stoßen könnten, solche .
getrennten Namen beinhalten und dass Sie diese nicht \texttt
für andere Zwecke in Ihrem Dokument benötigen, könnte dies eine Lösung für Sie sein.
Falls Sie befürchten, dass ein anderes Paket .
aktiv sein möchte, aber anders definiert ist, können Sie den folgenden Ansatz wählen:
\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}
Wenn Sie ganz naiv sind (also: das ist, was ich anfangs dachte, dass ich tun könnte), könnten Sie versuchen
\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}
Dies schlägt jedoch fehl, da der folgende Punkt \def
bereits tokenisiert wurde und nicht aktiv ist. Daher gibt LaTeX einen Fehler über eine fehlende Steuersequenz aus.
AKTUALISIEREN
Wenn es Ihnen nicht besonders wichtig ist, wo die Unterbrechungen auftreten, können Sie etwas wie Folgendes verwenden:
\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}
obwohl mir das etwas suboptimal erscheint. Ich denke, es wäre besser, zu entscheiden, wo Haltepunkte sein sollten, und dem Beispiel zu folgen, um .
diese Zeichen (wie /
, -
, usw.) im Kontext des Befehls zu aktiven Zeichen zu machen und die Strafe einzuschmuggeln, um einen darauf folgenden Haltepunkt zu ermöglichen.
Antwort4
Dies ist eine späte Antwort, aber ich habe eine Frage mit einer Antwort gepostetHier, hier noch einmal im Wortlaut:
Verwenden Sie \seqsplit.
\documentclass[9pt,oneside]{amsart}
\usepackage{seqsplit}
\begin{document}
Filler text. Filler text. Filler text. Filler text. \seqsplit{0xcf416c536ec1a19ed1fb89e4ec7ffb3cf73aa413b3aa9b77d60e4fd81a4296ba}
\end{document}