我想要的是

我想要的是

我正在尝试创建一种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

相关内容