Schließende Klammer als Trennzeichen wird nicht übernommen, wenn breaklines=true

Schließende Klammer als Trennzeichen wird nicht übernommen, wenn breaklines=true

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 deslistingsPaket. Tatsächlich wird der SelectCharTablevom Paket verwendete Hook bei der listingsAusfü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}

verwandte Informationen