标识符 (0dh) 中出现的关键字名称 (dh) 不受欢迎地突出显示

标识符 (0dh) 中出现的关键字名称 (dh) 不受欢迎地突出显示

我使用的x86masm是方言,Assembler即使寄存器名称出现在标签或十六进制数字中,也会强调它们。例如,dh是寄存器,但是0dh一个数字,但dh它的一部分被强调了。我在listings使用其他语言时没有遇到过这个问题,所以我假设这是语言定义的问题。有没有简单的方法可以重新定义语言以避免这种情况发生?

在此处输入图片描述

\documentclass[12pt]{article}
\usepackage{courier, listings}

\lstset{
  language={[x86masm]Assembler},
  basicstyle=\ttfamily\small,
  frame=single
}

\begin{document}
\begin{lstlisting}
cmp al, 0dh ; dh = register, 0dh = number
je somewhere
\end{lstlisting}

\end{document}

答案1

使用deletekeywords=...。但是,您应该使用另一种 monotypefont,例如 beramono。Courier 不是一种好看的单色字体。

\documentclass[12pt]{article}
\usepackage{courier, listings}

\lstset{
  language={[x86masm]Assembler},
  basicstyle=\ttfamily\small,
  frame=single,
  deletekeywords={dh}
}

\begin{document}
\begin{lstlisting}
cmp al, 0dh ; dh = register, 0dh = number
je somewhere
\end{lstlisting}

\end{document}

答案2

默认情况下,listings分别处理数字序列(和其他字符)和字母序列。更具体地说,listings识别数字0并将其打印出来,然后识别关键字dh(由x86masm语言定义)并将其突出显示。

正如赫伯特所写他的回答当然,你也可以dh从关键字列表中删除,就像这样

deletekeywords={dh}

然而,这种方法并不理想,因为它完全阻止了任何标识符实例dh被突出显示,如下面的屏幕截图所示。

在此处输入图片描述

一种更好的方法是将listings数字和字母一起处理,而不是分开处理,方法是将数字视为“字母”:

alsoletter=0123456789,

然后,listings将被0dh视为一个单一实体;dh将会突出显示,但0dh不会如预期的那样。

在此处输入图片描述

完整代码

\documentclass[12pt]{article}
\usepackage{courier, listings}

\lstset{
  language={[x86masm]Assembler},
% deletekeywords={dh},    % less than ideal
  alsoletter=0123456789,  % better 
  basicstyle=\ttfamily\small,
  frame=single,
}

\begin{document}
\begin{lstlisting}
cmp al, 0dh ; dh = register, 0dh = number
je somewhere
--- TestTestTest: dh ---
\end{lstlisting}

\end{document}

相关内容