我正在尝试创建一种listings
语言,其中#
符号开始注释,并以行末或#
遇到的下一个符号(以先到者为准)结束。
#
当然,我也想捕捉符号本身。
有没有什么办法可以达到想要的效果呢?
我想要的是
我拥有的
这次失败尝试对应的代码可以在下面找到,以及一些我想强调的示例注释(空格填充不一致是故意的)。
\documentclass{article}
\usepackage{listings}
\usepackage{color}
\begin{document}
\lstdefinelanguage{Test}
{
morecomment=[s][\color{blue}]{\#}{\#},
morecomment=[l][\color{red}]{\#}
}
\begin{lstlisting}[language=Test]
#comment
foo # comment# bar #comment # dec
baz # comment
#comment# qux
\end{lstlisting}
\end{document}
答案1
编辑
鉴于下面的讨论,我现在假设您希望表单的注释#...#
始终在同一行。据我所知,该listings
包不支持带有两个分隔符的注释必须在同一行上。我查看了包内部结构并对其进行了修改,使 L 类型成为 l 和 s 类型的组合。以下代码适用于您的示例,并且似乎总体上可以正常工作,尽管由于这是一次修改,它可能遗漏了一些极端情况,或者破坏了其他内容?
我所做的是定义一个新的评论类型 L
具有开始和结束分隔符,并且限制为一行(至少我认为我做到了:)。通过我的破解,我得到了您的示例(扩展版本)的以下输出:
这是乳胶代码:
\documentclass{article}
\usepackage{listings}
\usepackage{xcolor}
\makeatletter
\gdef\lst@commenttypes{l,L,f,s,n}
\gdef\lst@CommentDM@L#1#2#3\@empty#4#5#6{%
\lst@CArg #2\relax\lst@DefDelimB{}{}{}#4{#1}{#6\lst@Lmodetrue}%
\lst@CArg #3\relax\lst@DefDelimE{}{}{}#5{#1}}
\makeatletter
\begin{document}
\lstdefinelanguage{Test}
{
morecomment=[L][\color{red}]{\#}{\#},
}
\begin{lstlisting}[language=Test]
#comment
foo # comment# bar #comment # dec
baz # comment
#comment# qux
code # a comment
more code # more comments
\end{lstlisting}
\end{document}
我应该更详细地解释一下新L
评论类型的工作原理。语法是
更多评论=[L]{⟨分隔符⟩}{⟨分隔符⟩}
相应的注释可以从第一个分隔符开始,一直到行末(注释结束的地方),或者注释在第二个分隔符处结束(如果它们出现在同一行)。这就是为什么上面的 OP 示例中只需要声明一种注释类型。出于同样的原因,开始和结束分隔符不必相同,因此,如果我们改为这样写:
\lstdefinelanguage{Test}{
morecomment=[L][\color{blue}]{(*}{*)},
}
\begin{lstlisting}[language=Test]
(*comment
foo (* comment*) bar (*comment *) dec
baz (* comment
(*comment*) qux
code (* a comment
more code (* more comments
\end{lstlisting}
那么输出就变成
我不会解释我从软件包中摘取的命令,listings
因为这需要一段时间。不过,我想说的是,您可以如此轻松地完成这些操作,这证明了软件包作者的优秀listings
。