texcl 选项用于列出包的 lstset - 在块注释中不起作用

texcl 选项用于列出包的 lstset - 在块注释中不起作用

我正在使用该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}

相关内容