listings' otherkeywords={if} 也将 'shift' 标识为关键字

listings' otherkeywords={if} 也将 'shift' 标识为关键字

我正在尝试使用 listings 包将 Isabelle 代码粘贴到 LaTeX 文档中。最接近的language=选项似乎是MLHaskell

部分代码包含用引号 ( "...") 划定的块,其中包含关键字。

指定language=MLlanguage=Haskell不会加粗"..."块内的关键字(例如" ... if ... ")。

另一方面,设置otherkeywords={if}确实会使引号块内的关键字加粗,但也会选择像这样的变量名shift

\documentclass{article}
\usepackage{listings}
\lstset{language=ML,
        otherkeywords={if,then,else,return,"}
        }

\begin{document}
  \begin{lstlisting}
    "if foo then bar * shift"
   \end{lstlisting}
\end{document}

答案1

首先是 sh ift 问题:

这是因为,根据文档

[其他关键字] [d] 定义包含其他字符或以数字开头的关键字。每个给定的“关键字”都以关键字样式打印,但不改变字符的“字母”、“数字”和“其他”状态。这旨在定义 =>、->、-->、--、:: 等关键字。

我相信这morekeywords可能就是你正在寻找的:

\documentclass{article}
\usepackage{listings}
\usepackage{xcolor}
\lstset{%
morekeywords={if,then,else,return},
keywordstyle=\color{red}
}

\begin{document}
\begin{lstlisting}
    "if foo then bar * shift"
\end{lstlisting}
\end{document}

这应该可以修复“shift”中突出显示的“if”问题。

"..."现在,对于括起来的引号。 Listings 将其识别为字符串,考虑到在语言中将其定义为字符串块ML(参见底部代码片段),这并不奇怪。

您可以添加deletestring=[d]",\lstset以使其不被识别"为字符串。

那么这可能就是你想要的:

\documentclass{article}
\usepackage{listings}
\usepackage{xcolor}
\lstset{%
language=ML,
morekeywords={if,then,else,return},
deletestring=[d]",
keywordstyle=\color{red}
}

\begin{document}
\begin{lstlisting}
    "if foo then bar * shift"
\end{lstlisting}
\end{document}

您可能还会发现这很有用:这是列表 ML 语言的定义(来自lstlang2.sty):

%%
%% ML definition (c) 1999 Torben Hoffmann
%%
\lst@definelanguage{ML}%
  {morekeywords={abstype,and,andalso,as,case,do,datatype,else,end,%
       eqtype,exception,fn,fun,functor,handle,if,in,include,infix,%
       infixr,let,local,nonfix,of,op,open,orelse,raise,rec,sharing,sig,%
       signature,struct,structure,then,type,val,with,withtype,while},%
   sensitive,%
   morecomment=[n]{(*}{*)},%
   morestring=[d]"%
  }[keywords,comments,strings]%

相关内容