考虑以下代码:
\documentclass{article}
\usepackage{amssymb,xcolor,listings}
\begin{document}
\lstset{
mathescape=true,
basicstyle=\small,
escapeinside={(*@}{@*)},
keywordstyle=\color{black}\bfseries\sffamily,
identifierstyle=\slshape,
stringstyle=\ttfamily,
commentstyle=\color{red},
emphstyle={[1]\bfseries\sffamily},
emphstyle={[2]\sffamily},
emphstyle={[3]\color{blue}\sffamily},
keywords={fun,let,in,if,then,else,fi,elif},
emph={[1]public,protected,private},
emph={[2]Tree,FinSet},
emph={[3]true,false},
morecomment=[l]{//},
morecomment=[s]{/*}{*/},
morecomment=[s]{<<}{>>},
columns=flexible,
frame=tb
%%% ... and a whole bunch of other customization ...
}
\begin{lstlisting}[literate={{α}{$\mathsf{\alpha}$}1},moreemph={[3]all',add,root,left,right,isetree}]
fun all' = (s: FinSet α, t: Tree α) FinSet α:
if isetree(t) then s
else all'(all'(add(s, root(t)), left(t)), right(t))
fi(*@\hfill\(\Box\)@*)
\end{lstlisting}
\end{document}
使用 进行编译pdflatex
,输出很好,只是all'
没有以蓝色突出显示:
如何在不改变 lstlisting 环境的内容而仅改变可选参数的情况下突出显示all'
(类似于add
,root
,...,即蓝色)?
(是的,当然可以使用转义机制,但是,每次使用时,这会使 LaTeX 代码的可读性略有降低。当然,可以放入all'
特殊类型的注释,这会使 LaTeX 源代码的可读性再次略有降低。我希望尽可能保持源代码的可读性:对于比这个 MWE 更大的现实生活中的例子,就我的个人经验而言,源代码的可读性当然是值得的。)
题外话:在 XeLaTeX 中排版这些垃圾会变得更容易吗,即我是否能够直接排版 alpha 和 QED-box 而不需要繁琐的选项?
答案1
问题是'
不被视为字母,因此不能成为关键字或强调词的一部分。只需将其添加alsoletter={'}
到选项列表中即可轻松解决此问题:
\begin{lstlisting}[
literate={{α}{$\mathsf{\alpha}$}1},
moreemph={[3]all',add,root,left,right,isetree},
alsoletter={'} ]
fun all' = (s: FinSet α, t: Tree α) FinSet α:
if isetree(t) then s
else all'(all'(add(s, root(t)), left(t)), right(t))
fi(*@\hfill\(\Box\)@*)
\end{lstlisting}