Закрывающая скобка как разделитель не совпадает, если 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}

Связанный контент