我正在使用优秀的 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}