我正在尝试使用 listings 包将 Isabelle 代码粘贴到 LaTeX 文档中。最接近的language=
选项似乎是ML
和Haskell
。
部分代码包含用引号 ( "..."
) 划定的块,其中包含关键字。
指定language=ML
或language=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 if
t 问题:
这是因为,根据文档
[其他关键字] [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]%