列表:突出显示以空格开头的分隔词的一部分

列表:突出显示以空格开头的分隔词的一部分

我想创建一种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) 如下:

  1. 在标识符标记中包含前缀alsoletter{:}
  2. identifierstyle定义一个传递令牌的新命令lstlisting
  3. 扩展当前标记(使用参数o说明符)
  4. 在两个匹配的组上使用正则表达式添加颜色命令(使用\c{}\cB{,构建命令的语法)并\cE}\1\2
  5. 打印替换后的 token
  6. 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}

结果:

在此处输入图片描述

相关内容