我正在使用该listings
包来排版代码列表。
我进一步使用我的( )texcl
中的选项,以便我可以在注释中编写 TeX 代码(包括数学)。\lstset
\lstset{texcl}
然而,这在块注释中不起作用。
考虑以下 MWE(当然,大部分都是最小的):
\documentclass{article}
\usepackage{zi4} % if you want a \ttfamily font with bold, italic
\usepackage{listings}
\lstset{
language=C,
basicstyle=\ttfamily,
commentstyle=\rmfamily,
texcl,
}
\begin{document}
\begin{lstlisting}
int main(int argc, char** argv) {
printf("Hello, world!\n");
}
// This is a comment with \TeX: $2^3 = 8$.
/* This is a block comment with \TeX: $2^3 = 8$ */
\end{lstlisting}
\end{document}
输出为:
我也尝试过这个language=Java
,结果是一样的。(您需要进行一些language
设置才能识别评论。)
由于它似乎也弄乱了列,我尝试添加columns=fullflexible
,这解决了列问题,但仍然不允许 TeX 注释行。
我可以说它意识到这是一条注释,因为它不是\ttfamily
,并且写入一些关键字(例如)/* int */
不会使其作为关键字加粗。但 TeX 代码不起作用。
我该如何解决这个问题?
答案1
这是texcl
的预期行为。请参阅清单文档中第 4.14 节的开头:
注意:任何转为 LaTeX 的行为都可能扰乱列对齐,因为包无法控制那里的间距。
texcl
=⟨true
|false
⟩ 或texcl
false 激活或停用 LaTeX 注释行。如果激活,注释行分隔符将照常打印,但注释行文本(直到行末)将读取为 LATEX 代码并以注释样式排版。
就是这样:texcl
只影响行注释(或者更准确地说,到行尾的注释),不是块注释。一种解决方法是在块注释中需要时手动转义为 LaTeX。请注意,为了在行注释和块注释中获得一致的注释样式,您需要在转义为 LaTeX 的开头应用注释样式;您可以使用键escapebegin
来实现这一点。
\documentclass{article}
\usepackage{zi4} % if you want a \ttfamily font with bold, italic
\usepackage{listings}
\makeatletter
\lstset{
language=C,
basicstyle=\ttfamily,
commentstyle=\rmfamily,
texcl,
escapechar =`,
escapebegin=\lst@commentstyle,
}
\makeatother
\begin{document}
\begin{lstlisting}
int main(int argc, char** argv) {
printf("Hello, world!\n");
}
// This is a comment with \TeX: $2^3 = 8$.
/* This is a block comment with `\TeX: $2^3 = 8$` */
\end{lstlisting}
\end{document}