texcl、escapeinside 和单字符注释,带有 listings 包

texcl、escapeinside 和单字符注释,带有 listings 包

我正在使用优秀的 listings 包来排版一些与 Scheme 非常相似的语言的代码。该语言有一种注释类型:当遇到(未转义的)分号时,行的其余部分(包括分号)将被忽略(作为注释)。虽然只需要一个分号就可以引入注释,但编码约定使用;;;;;;来指定不同级别的注释,例如

;;; Top level comment
(define (foo x)
  ;; within body comment
  (list x x)) ; after line comment

我想使用 listingstexcl选项来使用 LaTeX 排版所有注释,到目前为止我已经能够做到这一点。我还想使用它\label{...}来支持以后对特定代码行的引用。当texcl它打开时,我可以用常规注释来做到这一点,例如

\documentclass{article}
\usepackage{xcolor,listings}
\usepackage{hyperref}

\begin{document}

\lstset{%
  comment=[l]{;},
  texcl=true,
}
\begin{lstlisting}
  ;;; top level
  (defun foo (x) 
    ;; in body
    (let ((y (+ x 1))) ; on line
      y)) ; \label{code:y}
\end{lstlisting}
Cross-reference to line \ref{code:y}.
\end{document}

产生

清单样本

问题是带有标签的注释; \label{code:y}仍然显示前导分号。 listings有一个escapeinside选项可用于转义为 LaTeX,如文档中的示例所示:

\lstset{escapeinside={(*@}{@*)}}
\begin{lstlisting}
for i:=maxint to 0 do
begin
    { comment }(*@\label{comment}@*)
end;
\end{lstlisting}
Line \ref{comment} shows a comment.

该文档还指出,结束转义分隔符可以是\^^M,以支持以换行符终止的转义,如escapeinside={//*}{\^^M}

我想要做的是使用类似的东西escapeinside={;@}{\^^M}来提供仍然在编程语言中的注释中的 LaTeX 转义,例如(从上面修改):

\lstset{%
  comment=[l]{;},
  texcl=true,
  escapeinside={;@}{\^^M}
}
\begin{lstlisting}
  ;;; top level
  (defun foo (x) 
    ;; in body
    (let ((y (+ x 1))) ; on line
      y)) ;@ \label{code:y}
\end{lstlisting}

但这会产生错误(仅在使用该texcl选项时发生):

! Undefined control sequence.
\lst@next ->\lst@c;1 ;

l.14   ;;
         ; top level

有没有办法解决这个问题,或者有另一种方法来获得所需的行为(即,注释行通常用 LaTeX 设置并显示分号,但支持一些以分号开头的转义到 LaTeX,;其中不会显示分号)?

作为一种临时的解决方法,我可以将标准注释序列定义为;;,将转义注释序列定义为;@;这可以毫无问题地工作,只是我不再支持以单个分号开头的注释。

答案1

您需要使用morecomment来添加序列;;;;;

示例输出

\documentclass{article}

\usepackage{listings}

\begin{document}

\lstset{%
  comment=[l];,morecomment=[l];;,morecomment=[l];;;,
  texcl=true,
  escapeinside={;@}{\^^M},
  numbers=left
}
\begin{lstlisting}
  ;;; top level \LaTeX
  (defun foo (x) 
    ;; in body
    (let ((y (+ x 1))) ; on line $y=x+1$
      y)) ;@ \label{code:y}
\end{lstlisting}
A reference to line~\ref{code:y}
\end{document}

相关内容