我正在排版包含大量 Java 代码清单的内容。由于 Java 代码包含大量注释,并且注释对读者来说很重要,因此我希望将它们突出显示,就像其他关键字(如 class、public 等)一样。
我希望输出是黑白色的。
我尝试使用 minted,但 bw 输出没有突出显示注释。
我怎样才能迫使列表突出显示注释?
PS 这是我正在使用的 lstset:
\lstset{
basicstyle=\footnotesize\tt, % the size of the fonts that are used for the code
breakatwhitespace=false, % sets if automatic breaks should only happen at whitespace
breaklines=true, % sets automatic line breaking
captionpos=b, % sets the caption-position to bottom
extendedchars=true, % lets you use non-ASCII characters; for 8-bits encodings only, does not work with UTF-8
frame=single, % adds a frame around the code
language=Java, % the language of the code
keywordstyle=\bf,
showspaces=false, % show spaces everywhere adding particular underscores; it overrides 'showstringspaces'
showstringspaces=false, % underline spaces within strings only
showtabs=false, % show tabs within strings adding particular underscores
tabsize=2 % sets default tabsize to 2 spaces
}
答案1
首先,minted
:这个伟大的软件包依赖于皮格门特斯据我所知,大多数可用的样式做支持 Java 注释。遗憾的是,正如您所指出的,该bw
样式不会突出显示注释。
一种可能性是创建此样式的扩展版本(换句话说,创建一个以此为bw
基础的新样式),然后包含设置注释格式的指令(我只是快速浏览了一些样式,但未能确定 Pygments 使用哪条指令来引用注释)。
如果您想尝试listings
,我会采纳 Pouya 的建议,使用自定义分隔符。原因是,在我看来,由于注释是语法元数据,因此不能将其视为关键字或注释,因此采用不同的样式来表示它们会是更明智的选择。
我知道您使用的是黑白主题,但我决定创建一个彩色输出,以便我们查看每个标识符应用了哪种样式。概念是一样的,只需用color
您想要的字体系列替换出现的内容即可。
在我的代码中,我将创建两个分隔符:
moredelim=[il][\textcolor{pgrey}]{$$},
moredelim=[is][\textcolor{pgrey}]{\%\%}{\%\%}
第一个,$$
,应用于整行,可用于单独一行的注释(此处可视为单行注释)。第二个,%% ... %%
,行为类似于多行注释,它将分隔符内的所有内容括起来,对于内联应用于方法或字段的注释非常有用。
示例代码如下(此处的 Java 示例由龙目岛计划):
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{inconsolata}
\usepackage{color}
\definecolor{pblue}{rgb}{0.13,0.13,1}
\definecolor{pgreen}{rgb}{0,0.5,0}
\definecolor{pred}{rgb}{0.9,0,0}
\definecolor{pgrey}{rgb}{0.46,0.45,0.48}
\usepackage{listings}
\lstset{language=Java,
showspaces=false,
showtabs=false,
breaklines=true,
showstringspaces=false,
breakatwhitespace=true,
commentstyle=\color{pgreen},
keywordstyle=\color{pblue},
stringstyle=\color{pred},
basicstyle=\ttfamily,
moredelim=[il][\textcolor{pgrey}]{$$},
moredelim=[is][\textcolor{pgrey}]{\%\%}{\%\%}
}
\begin{document}
\begin{lstlisting}
/**
* This is a doc comment.
*/
package com.ociweb.jnb.lombok;
import java.util.Date;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NonNull;
$$@Data
$$@EqualsAndHashCode(exclude={"address","city","state","zip"})
public class Person {
enum Gender { Male, Female }
// another comment
%%@NonNull%% private String firstName;
%%@NonNull%% private String lastName;
%%@NonNull%% private final Gender gender;
%%@NonNull%% private final Date dateOfBirth;
private String ssn;
private String address;
private String city;
private String state;
private String zip;
}
\end{lstlisting}
\end{document}
输出:
希望能帮助到你。:)
答案2
您可以通过让列表将注释视为评论来实现这一点。将其添加到您的lstset
:
morecomment=[s][\color{gray}]{@}{\ }
简而言之:s 型注释有两个分隔符,不能嵌套,定义为:morecomment=[s][(optional) <style>]{<startDelimiter>}{<endDelimiter>}
因此,上面给出的注释样式将任何以@
空格开头和结尾的字符串视为注释,并以灰色字体显示。
答案3
keywordsprefix
您可以使用定义的选项在第 44 页的文档中例如
keywordsprefix={@},
突出显示所有 Java 注释(所有以 开头的单词@
)。不过,目前存在一些注意事项/错误:
keywordsprefix=<prefix>
All identifers starting with the prefix will be printed as first order
keywords.
Bugs: Currently there are several limitations. (1) The prefix is always
case sensitive. (2) Only one prefix can be defined at a time. (3) If used
‘standalone’ outside a language definition, the key might work only after
selecting a nonempty language (and switching back to the empty language
if necessary). (4) The key does not respect the value of classoffset and
has no optional class number argument.