Я хочу, чтобы код в скобках и в квадратных скобках отображался разными цветами. В следующем документе словаснова скобкиотображаются зеленым цветом, как и предполагалось, иснова снаружичерный, как и задумано, но выходит на поля страницы.
Если я раскомментирую строку ,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}