在列表中用撇号强调标识符

在列表中用撇号强调标识符

考虑以下代码:

\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'(类似于addroot,...,即蓝色)?

(是的,当然可以使用转义机制,但是,每次使用时,这会使 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}

在此处输入图片描述

相关内容