Zeilenumbruch im Texttt

Zeilenumbruch im Texttt

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

Bildbeschreibung hier eingeben

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 \renewcommanddurch\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, \textttstattdessen 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}

Bildbeschreibung hier eingeben

Antwort2

Ausgehend von Stevens Antwort habe ich in meinem Dokument \textttin Abbildungen Pfade und URLs verwendet, aber auch \textttin 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 \textttBefehle für normalen Text geschrieben werden, der keine Symbole verwendet. Wie das folgende Bild zeigt, \textttfunktioniert es für Abbildungen einwandfrei, für normalen Text jedoch nicht so gut.

Bildbeschreibung hier eingeben

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.

Bildbeschreibung hier eingeben

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 \textttfü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 \defbereits 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}

Verwenden von seqsplit zum Aufteilen von langem Text.

verwandte Informationen