有没有一种通用的方法可以把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}
似乎不够用的技术:
使用
literate
进行替换。据我所知,这些都会影响basicstyle
和commentstyle
,因此它们不会按预期进行区分。使用
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}