列表包:如何突出显示数学运算符?

列表包:如何突出显示数学运算符?

我正在使用列表包将 GAUSS 代码包含到 Latex 中。

例如这样:

\lstset{
emph={proc,retp,endp,local}, emphstyle=\color{blue}\textbf,
emph={[2]=,.^,./,=}, emphstyle={[2]\color{red}}
}

\begin{lstlisting}
proc(1) = tdist(n,v);
local x, z, z2, u, t;
x=rndn(n,1); 
z=rndn(n,v);
z2=z.^2; 
t=x./((U./v)^(1/2));
retp(t);
endp;
\end{lstlisting}

虽然字符串 (proc、retp 等) 突出显示,但数学运算符 (=、*、/) 却没有突出显示。我在这里做错了什么?

答案1

您无法使用emph密钥执行此操作。但您可以使用密钥执行此操作literate

\documentclass{article}
\usepackage{listings,xcolor}
\begin{document}

\lstset{
emph={proc,retp,endp,local}, emphstyle={\color{blue}\textbf},
literate={./}{{{\color{red}./}}}2 {.^}{{{\color{red}.\^{}}}}2 {=}{{{\color{red}=}}}1
}

\begin{lstlisting}
proc(1) = tdist(n,v);
local x, z, z2, u, t;
x=rndn(n,1); 
z=rndn(n,v);
z2=z.^2; 
t=x./((U./v)^(1/2));
retp(t);
endp;
\end{lstlisting}

\end{document}

请注意,所有括号都是必需的,因为您需要限制\color命令的范围。

代码输出

答案2

我想对艾伦的回答补充一些观察,因为我也遇到了这个问题,来到这里我发现你的问题只是得到了部分回答。

如果您也希望运算符(如/或)*有颜色,那么您可能会遇到代码注释问题。这literate将破坏软件包识别注释的方式listings。以下是示例:

/** 
 * This is a 
 * comment ...
 **/
let java = s / c + r * i - p + t    // and this is some code

截屏:

截图0

现在您想要突出显示等式中的/*,但是它会破坏注释:

literate=%
  {+}{{{\color{Red}+}}}1
  {-}{{{\color{Red}-}}}1
  {*}{{{\color{Red}*}}}1
  {/}{{{\color{Red}/}}}1
  {=}{{{\color{Red}=}}}1

结果:

屏幕截图1

显然,这两条注释都是错误的。现在我尝试在模式中添加空格,但效果不佳。

literate=%
  {\ +}{{{\color{Red}\ +}}}1
  {\ -}{{{\color{Red}\ -}}}1
  {\ *}{{{\color{Red}\ *}}}1
  {\ /}{{{\color{Red}\ /}}}1
  {\ =}{{{\color{Red}\ =}}}1

现在可以识别块注释,但是不能识别单行注释。

截图2

那么,为什么不也附加一个空格呢?

literate=%
  {\ +\ }{{{\color{Red}\ +\ }}}1
  {\ -\ }{{{\color{Red}\ -\ }}}1
  {\ *\ }{{{\color{Red}\ *\ }}}1
  {\ /\ }{{{\color{Red}\ /\ }}}1
  {\ =\ }{{{\color{Red}\ =\ }}}1

这是我能获得的最接近期望的结果。

截图3

你可以看到它以某种方式缩小了空白。有些人可能会深入研究这里有几十种不同的 TeX 空白. 但你会明白的。

相关内容