避免在列表评论样式中使用“减号”破折号

避免在列表评论样式中使用“减号”破折号

有没有一种通用的方法可以把listings包裹送到

  • 在其余代码中将连字符排版为减号(默认行为),但
  • 将连字符排版为真正的连字符如果它出现在评论中(使用罗马字体)?

以下是一个相对简单的例子,可以说明我的担忧。请注意第二条注释中的减号字符。

\documentclass{article}
\usepackage{listings}
\lstset{language=C, commentstyle=\rmfamily, columns=flexible}

\begin{document}
\noindent
$x = a - b$  // perform standard sanity-check
\begin{lstlisting}
x = a - b // perform listings sanity-check
\end{lstlisting}
\end{document}

在此处输入图片描述

似乎不够用的技术:

  1. 使用literate进行替换。据我所知,这些都会影响basicstylecommentstyle,因此它们不会按预期进行区分。

  2. 使用escapechar来以不同的方式呈现注释。如果可能的话,我想要一个通用的解决方案,不需要对原始程序源代码进行任何更改(假设使用\lstinputlisting)。

修订(回应下面 Marco 的回答)。

如果它能够正确处理任何形式的法律注释而无需编辑源代码,那将是理想的,例如:

\begin{lstlisting}
x = a - b // perform $5 worth of listings sanity-check [ideally]
\end{lstlisting}

注意:我的问题与关于连字符和减号的过去问题然而就我而言,我喜欢在实际代码中使用减号,而不是在注释中使用。

答案1

您可以使用选项texcl。有关更多信息,请参阅文档。

编辑

根据 Michael 的编辑——一个简单的解决方案是更改特殊字符的 catcode:

\documentclass{article}
\usepackage{listings}
\lstset{language=C, commentstyle={\rmfamily\catcode`\$=11}, columns=flexible,texcl}

\begin{document}
\noindent
$x = a - b$  // perform standard sanity-check
\begin{lstlisting}
x = a - b // perform listings sanity-check
\end{lstlisting}

\begin{lstlisting}
x = a - b // perform $5 worth of listings sanity-check [ideally]
\end{lstlisting}
\end{document}

在此处输入图片描述

编辑2(感谢 egreg)

Michael 请求不使用 的解决方案texcl。据我所知,这是不可能的。如果您不说texcl,则-始终会将其解释为$-$;这与 无关catcode-

人们应该改变对它的解释-;,但据我所知,不可能在注释中改变它,而不能在正确的代码中改变它。

答案2

作为档案的后续,我已确定以下解决方案,即在源代码中提供减号,在注释中提供连字符(但不使用texcl)。

\documentclass{article}
\usepackage{listings}
\makeatletter
\lst@CCPutMacro\lst@ProcessOther {"2D}{\lst@ttfamily{-{}}{-{}}}
\@empty\z@\@empty
\makeatother
\lstset{language=C, commentstyle=\rmfamily, columns=flexible, literate=*{-}{$-$}1}

\begin{document}
\noindent
$x = a - b$  // perform \$5 of standard sanity-check
\begin{lstlisting}  
x = a - b // perform $5 of listings sanity-check [ideally]                                           
\end{lstlisting}                                                                             
\end{document}                                                                               

这依赖于Alan Munn 建议的技术(针对相关问题)覆盖整个清单中使用减号替换,然后语法literate*会将替换添加回源代码,但不会添加注释/字符串。

答案3

以下方法不需要改变列表或更改任何 catcode。

输出

\documentclass{article}

\usepackage{listings}

\lstset
{
    language     = C,
    commentstyle = \rmfamily,
    columns      = flexible,
    literate     = {-}{{\Processdash}}1,
    keepspaces,
}

\makeatletter
\newcommand\Processdash%
{%
    \lst@ifLmode% if in one-line comment mode
        -%
    \else%
        $-$%
    \fi%
}
\makeatother

\begin{document}
\noindent
$x = a - b$  // perform standard sanity-check

\begin{lstlisting}[frame=single]
x = a - b // perform listings sanity-check
\end{lstlisting}

\begin{lstlisting}[frame=single]
x = a - b // perform $5 worth of listings sanity-check [ideally]
\end{lstlisting}
\end{document}

相关内容