使用listings
,我尝试以一种非常特殊的方式排版单行注释:尽管后面的内容应该根据传递给键的值进行排版commentstyle
,但开头的分隔符应该按照标识符样式进行排版(即“正常代码”)。
我一直在尝试不同的类型(s
,m
,l
)以及包提供i
的 前缀,但无济于事。有什么想法吗?morecomment
listings
编辑:当然,有一个要求是我不应该改变列表本身来获得所需的输出;在列表中引入分隔符是作弊行为:)
\documentclass{article}
\usepackage{xcolor}
\usepackage{listings}
\lstset%
{%
basicstyle=\ttfamily,
commentstyle=\itshape\color{blue},
morecomment=[s]{\%\%}{\^^M},
}
\begin{document}
\lstset{}
\begin{lstlisting}
confusion=Inf %% this is a comment
\end{lstlisting}
How can I get the opening comment delimiter (\texttt{\%\%}) to be typeset,
not in blue, but in the default colour (black)?
\end{document}
答案1
我不认为可以用这个comment
密钥来实现,但是你可以滥用它escapeinside
:
\documentclass{article}
\usepackage{xcolor}
\usepackage{listings}
\lstset%
{%
basicstyle=\ttfamily,
% commentstyle=\itshape\color{blue},
% morecomment=[s]{\%\%}{\^^M},
escapeinside={\%\%}{\^^M},
escapebegin={\%\%\itshape\color{blue}\obeyspaces}
}
\begin{document}
\lstset{}
\begin{lstlisting}
confusion=Inf %% this is a comment
confusion=Inf %%this is a comment
confusion=Inf %% this is $\alpha$ comment
\end{lstlisting}
\end{document}
(正如您自己指出的那样,\obeyspaces
应该放在最后,以便尊重注释标记后的所有空格。)
缺点是 TeX 文本将被排版而不是逐字输出:
答案2
经过大量实验,我仍然无法弄清楚如何使用 获得所需的输出morecomment
;我最终改用moredelim
(带il
前缀),并定义了一个\processDelimiter
宏来处理%%
列表中分隔符的每次出现。见下文(我在代码中留下了一些注释)。
这个解决方案基本上没问题,但存在一个非常令人费解的间距问题,我可能会在另一个问题中记录下来(编辑: 看使用列表分隔符时出现奇怪的间距问题)。
可能有更好的方法来获得所需的输出,但我已经束手无策了。
\documentclass{article}
\usepackage{xcolor}
\usepackage{listings}
% switch to keep track of context (in a comment or not)
\newif\ifcom\comfalse
\makeatletter
% This is what happens if a delimiter is encountered
\def\processDelimiter{%
\ifcom% % In this case, we're already in a comment.
\else % Otherwise, we just started a comment;
\global\comtrue% % set the switch to true and
{\lst@basicstyle\%\%}% % typeset the delimiter in the basic style.
\fi
\lst@commentstyle% % In any case, apply the comment style.
}
% Reset the switch at each End-Of-Line character.
\lst@AddToHook{EOL}{\global\comfalse}
\makeatother
\lstset{
basicstyle = \ttfamily,
commentstyle = \itshape\color{blue},
moredelim = [il][\processDelimiter]{\%\%},
}
\begin{document}
\begin{lstlisting}
x:=1000; %% this is a comment %% still in a comment
x:=x/2; %% another comment
\end{lstlisting}
\end{document}