注释分隔符可以采用与注释样式不同的样式排版吗?

注释分隔符可以采用与注释样式不同的样式排版吗?

使用listings,我尝试以一种非常特殊的方式排版单行注释:尽管后面的内容应该根据传递给键的值进行排版commentstyle,但开头的分隔符应该按照标识符样式进行排版(即“正常代码”)。

我一直在尝试不同的类型sml)以及包提供i的 前缀,但无济于事。有什么想法吗?morecommentlistings

编辑:当然,有一个要求是我不应该改变列表本身来获得所需的输出;在列表中引入分隔符是作弊行为:)

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

相关内容