我正在使用moredelim
(带前缀il
)以非常特殊的方式排版单行“注释”:
%%
红色分隔符,- 其余线条为蓝色。
我的方法基本符合预期,除了一些非常奇怪的间距问题,我无法解释。例如,在下面列表的第二行中,即使%%
与下一个单词之间只有一个空格字符(在输入文件中),该行的排版方式也完全不同;更具体地说,间距前我的输入文件中的分隔符似乎最终后将其保存在输出文件中。
我很确定这不是与我的代码中留下的虚假空格有关的问题。这到底是怎么回事……?
\documentclass{article}
\usepackage{xcolor}
\usepackage{listings}
\lstset
{%
basicstyle = \ttfamily,
commentstyle= \color{blue},
moredelim =**[il][\processDelimiter]{\%\%},
}
\makeatletter
\def\processDelimiter% auxiliary macro for delimiters
{%
\textcolor{red}{\%\%}% % Typeset the delimiter
\lst@commentstyle% % Apply the comment style.
}
\makeatother
\begin{document}
\begin{lstlisting}
x:=1000; %% a first comment
x:=x/2; %% why so much space on this side?
\end{lstlisting}
\end{document}
答案1
listings
延迟输出空格字符,直到下一个实体排版完成。在 的情况下moredelim
,只有在遇到分隔符时才会排版前面的空格%%
。现在,虽然“样式”(即方括号中的第二个参数)当然会在打印分隔符之前应用,但实际测试是否仍有空格要输出只会在那之后进行。(我不认为这可以称为错误,相反,您使用样式参数来实际排版某些内容可能有点超出规范)。
但是你可以用 强制listings
检查并打印堆栈上的任何空格\lst@CalcLostSpaceAndOutput
。因此,
\def\processDelimiter% auxiliary macro for delimiters
{%
\lst@CalcLostSpaceAndOutput % Typeset spaces
\textcolor{red}{\%\%}% % Typeset the delimiter
\lst@commentstyle% % Apply the comment style.
}
应该管用。
另一种可能性可能是listings
加载keepspaces=true
。