
Этот недавний вопрос (напишите синие скобки на одном языке и черные на другом)заставили меня задать еще два вопроса относительно пакета listings
:
- Есть ли аналогичная опция,
opstyle
которая влияет только наодинаргумент (используя"
,,
или;
как первый разделитель и=
как второй) иодинзначение, принадлежащее этому аргументу? (используя=
в качестве первого разделителя и"
,,
или;
в качестве второго)? - Можно ли настроить используемый цвет в середине среды
listings
, чтобы он не отображался как комментарий или строка и т. д.? Все эти решения определяют цвета за пределами фактической среды.
Ни то, ни другоеlistings
руководство, ниСтатья в WikiBooksдают убедительные ответы (и также не упоминают макросы, включая те, которые \lst@thestyle
я мог бы добавить), поэтому я посмотрел на listings.sty
, что неудивительно, но безрезультатно, отчасти потому, что в .sty
файле нет абсолютно никаких комментариев ни к одной строке для пояснения.
Для вашего удобства я включил MWE примера opstyle
и картинку из ранее упомянутой ветки. В моем случае я хотел бы, например, покрасить часть в string: ()
оранжевый цвет, а {}><;&
часть в красный.
\documentclass{article}
\usepackage{xcolor}
\usepackage{listings}
\newcommand\opstyle{\color{red}} % <--- customise operator style here
\makeatletter
\lstset
{%
language=C++,
alsoletter=0123456789,% to prevent \opstyle from being applied to digits
}
% Hook into listings
\lst@AddToHook{OutputOther}{\ProcessOther@silmeth}
% helper macro
\newcommand\ProcessOther@silmeth
{%
\ifnum\lst@mode=\lst@Pmode% % If we're in `Processing' mode...
\def\lst@thestyle{\opstyle}% % ... redefine the style locally
\fi%
}
\makeatother
\begin{document}
\begin{lstlisting}[]
int i = 0;
if(i > 1) && (1/2 < 2) {
// one-line comment ()={}><;&
printf("string: ()={}><;&");
/*
block comment ()={}><&;
*/
}
\end{lstlisting}
\end{document}