![Schließende Klammer als Trennzeichen wird nicht übernommen, wenn breaklines=true](https://rvso.com/image/254701/Schlie%C3%9Fende%20Klammer%20als%20Trennzeichen%20wird%20nicht%20%C3%BCbernommen%2C%20wenn%20breaklines%3Dtrue.png)
Ich möchte, dass Code in Klammern und in eckigen Klammern in unterschiedlichen Farben angezeigt wird. Im folgenden Dokument werden die WörterKlammern wiedererscheinen wie vorgesehen in grün undwieder draußenist wie vorgesehen schwarz, reicht aber bis an den Seitenrand.
Wenn ich die Zeile auskommentiere ,breaklines=true
, wird die Zeile zwischenKlammernUndwieder, diese und die folgenden Wörter sind jedoch rot, also so, als ob ein durch (
- )
abgegrenzter Abschnitt erkannt und der Abschluss dann )
ignoriert wurde.
Was geht hier vor sich?
Zusatz:Das Problem tritt auch auf, wenn kein Zeilenumbruch vorhanden ist, also wenn ich alle Wörter im Text auf den Anfangsbuchstaben kürze. Das Problem verschwindet in jedem Fall, wenn ich statt ein anderes Trennzeichen wähle ()
, also z.B. {}
.
\documentclass{article}
\usepackage{color}
\usepackage{listings}
\lstdefinelanguage{new}{
moredelim=*[s][\color{red}]{(}{)},
moredelim=*[s][\color{green}]{[}{]},
}
\lstset{
language=new
%,breaklines=true
}
\begin{document}
\begin{figure}
\begin{lstlisting}
outside(in paren) [in brackets (paren+brackets) brackets again] outside again
\end{lstlisting}
\end{figure}
\end{document}
Antwort1
Möglicherweise sind Sie auf einen Fehler gestoßen, der durch die spezielle Behandlung der rechten Klammer durch den Zeilenumbruchalgorithmus deslistings
Paket. Tatsächlich wird der SelectCharTable
vom Paket verwendete Hook bei der listings
Ausführung und aktiviertem Zeilenumbruch )
als Makro definiert, und zwar durch
\lst@Def{`)}{\lst@breakProcessOther)}
Wo
\lst@Def=macro:
#1->\lccode `\~=#1\lowercase {\def ~}.
Dies bedeutet leider, dass )
es nicht mehr als Trennzeichen erkannt wird, was letztendlich zu Ihrer Beobachtung führt.
Ich habe einige Anstrengungen unternommen, um eine Lösung für diesen Fehler zu finden, bin aber bisher nicht erfolgreich gewesen. (Meine TeX-Programmierkenntnisse sind noch begrenzt.) Das einzige, was ich derzeit anbieten kann, ist eine Problemumgehung in Form eines Patches, der die Sonderbehandlung )
durch den Zeilenumbruchalgorithmus einfach aufhebt:
\documentclass{article}
\usepackage{color}
\usepackage{listings}
\lstdefinelanguage{new}{
moredelim=*[s][\color{red}]{(}{)},
moredelim=*[s][\color{green}]{[}{]},
}
\lstset{
language=new,
breaklines=true
}
\usepackage{etoolbox}
\makeatletter
\patchcmd{\lsthk@SelectCharTable}{%
\lst@ifbreaklines\lst@Def{`)}{\lst@breakProcessOther)}\fi
}{%
}{
}{
}
\makeatother
\begin{document}
\begin{lstlisting}
outside (in paren) [in brackets (paren+brackets) brackets again] outside again
\end{lstlisting}
\end{document}
Die resultierende Ausgabe ist:
Antwort2
Eine einfache Problemumgehung besteht darin, anstelle der schließenden Klammer ')' ein anderes Zeichen, z. B. ']', zu verwenden und es durch die schließende Klammer ')' zu ersetzen.
\begin{lstlisting[literate={(}{{\textbf{(}}}1
{]}{{\textbf{)}}}1]
(In text I'm closing using]
\end{lstlisting}