breaklines=true の場合、区切り文字としての閉じ括弧が一致しません

breaklines=true の場合、区切り文字としての閉じ括弧が一致しません

括弧内と角括弧内のコードを異なる色で表示したい。次の文書では、再び括弧意図したとおり緑色で表示され、再び外へ意図したとおり黒ですが、ページの余白まで伸びています。

行のコメントを外すと,breaklines=true、行は括弧そしてまたただし、これらの単語とそれに続く単語は赤色で表示されます。つまり、(-)で区切られたセクションが検出されたものの、閉じ部分)が無視されたかのようです。

ここで何が起こっているのですか?

追加:この問題は、改行がない場合にも発生します。たとえば、テキスト内のすべての単語を最初の文字に短縮した場合などです。 の代わりに他の種類の区切り文字を選択した場合()、たとえば などの問題はいずれの場合でも解消されます{}

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

答え1

改行アルゴリズムによる右括弧の特別な扱いから生じるバグに遭遇したことがあるかもしれません。listingsパッケージ。実際、パッケージSelectCharTableで使用されるフックlistingsが実行され、改行が有効になっている場合)、マクロとして定義されます。つまり、

\lst@Def{`)}{\lst@breakProcessOther)}

どこ

\lst@Def=macro:
#1->\lccode `\~=#1\lowercase {\def ~}.

残念ながら、これは が)もはや区切り文字として認識されないことを意味し、最終的にあなたの観察につながります。

私はこのバグの修正方法を見つけるために努力しましたが、今のところ成功していません。(私の TeX プログラミング スキルはまだ限られています。) そのため、現時点で私が提供できるのは、)改行アルゴリズムによる特別な処理を単にキャンセルするパッチ形式の回避策だけです。

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

結果の出力は次のようになります。

答え2

簡単な回避策としては、閉じ括弧 ')' を使用する代わりに、別の文字 (例: ']') を使用して、それを閉じ括弧 ')' に置き換えることができます。

\begin{lstlisting[literate={(}{{\textbf{(}}}1                          
                           {]}{{\textbf{)}}}1]
(In text I'm closing using]
\end{lstlisting}

関連情報