我想创建一种lstlisting
语法语言,该语法突出显示命名空间以提高可读性。以下是我想要实现的目标:
\documentclass{standalone}
\usepackage{listings}
\usepackage{xcolor}
\definecolor{gray}{rgb}{0.4,0.4,0.4}
\definecolor{darkblue}{rgb}{0.0,0.0,0.6}
\definecolor{cyan}{rgb}{0.0,0.6,0.6}
\lstset{
basicstyle=\ttfamily,
columns=fullflexible,
showstringspaces=false,
commentstyle=\color{gray}\upshape
}
\lstdefinelanguage{turtle}
{
stringstyle=\color{black},
identifierstyle=\color{darkblue},
keywordstyle=\color{cyan},
moredelim=[is][\color{orange!80!black}]{!}{!},
moredelim=[l][\color{orange!80!black}]{\ }{:} % my best guess: does not work
}
\begin{document}
\lstset{language=turtle}
\begin{lstlisting}
!a!:b !c!:d !e!:f .
\end{lstlisting}
\end{document}
但是,我想避免!
在输入中明确输入以包装命名空间。moredelim=[l][\color{orange!80!black}]{\ }{:}
除非我在每个命令前后直接放置一个空格,否则该命令无效:
。
答案1
您可以使用正则表达式将颜色代码插入标识符中expl3
(另请参阅https://tex.stackexchange.com/a/238832/89417) 如下:
- 在标识符标记中包含前缀
alsoletter{:}
identifierstyle
定义一个传递令牌的新命令lstlisting
- 扩展当前标记(使用参数
o
说明符) - 在两个匹配的组上使用正则表达式添加颜色命令(使用
\c{}
和\cB{
,构建命令的语法)并\cE}
\1
\2
- 打印替换后的 token
identifierstyle
返回一个将应用于当前标记的命令lstlisting
,定义此命令以不打印任何内容。
c{lst@token}
请注意,就地修改(而不是步骤 5 和 6)会更干净,但由于我缺乏相关知识,所以expl3
我没有这样做:)
梅威瑟:
\documentclass{article}
\usepackage{listings,xparse}
\usepackage{expl3}
\usepackage{xcolor}
\definecolor{darkblue}{rgb}{0.0,0.0,0.6}
\colorlet{orangeb}{orange!80!black}
\def\noprint#1{}
\ExplSyntaxOn
\NewDocumentCommand \namespaces { }
{
\tl_set:No \l_demo_tl {\the\use:c{lst@token}}
\regex_replace_all:nnN { ([a-zA-Z]*):([a-zA-Z]*) } { \c{textcolor}\cB{ orangeb \cE}\cB{ \1 \cE}:\c{textcolor}\cB\{ darkblue \cE\}\cB{ \2 \cE} } \l_demo_tl
\tl_use:N \l_demo_tl
\noprint
}
\ExplSyntaxOff
\lstset{
basicstyle=\ttfamily,
alsoletter={:},
columns=fullflexible,
identifierstyle=\namespaces
}
\begin{document}
\begin{lstlisting}
a:b c:d e:f .
\end{lstlisting}
\end{document}
结果: