区分 lstlisting 中的宏和同名关键字

区分 lstlisting 中的宏和同名关键字

我想在lstlisting环境中显示以下代码片段:

\begin{tikzpicture}
  \duck[stripes=text]
  \stripes{}
\end{tikzpicture}

语法高亮应该是

  • 红色为tikzpicture
  • 蓝色表示命令\begin \duck \stripes \end
  • 橙色为关键字stripes
  • 其他元素text应保持黑色(或至少应有与关键字不同的颜色)

我试图误emphstyle用关键字来着色,但是因为有同名的命令\stripes也会改变颜色,而我只希望stripes它是橙色并且\stripes保持蓝色。

这似乎是一个已知的错误,根据清单文档的第 31 页所述:

错误:texcs... 与其他关键字列表相冲突。例如,如果emph包含单词foo,则控制序列\foo将显示在 中emphstyle

还有其他方法可以为关键字着色吗或解决方法?

梅威瑟:

\documentclass{article}

\usepackage{xcolor}
\usepackage{listings}

\lstdefinestyle{duckstyle}{%
    language={[latex]TeX},
    basicstyle=\footnotesize\ttfamily,
    %
    keywordstyle=\color{red!60!black}\bfseries,
    morekeywords={tikzpicture},
    %
    texcsstyle=*\color{blue}\bfseries,
    moretexcs={duck,stripes},
    %
    emphstyle=\color{orange!70!black},
    emph={stripes}
}

\lstset{style=duckstyle}

\begin{document}

\begin{lstlisting}
\begin{tikzpicture}% <- Perfect color
  \duck[stripes=text]% <- Perfect color
  \stripes{}% <- \stripes should be blue :(
\end{tikzpicture}% <- Perfect color
\end{lstlisting}

\end{document}

在此处输入图片描述


编辑

为了使事情变得更加复杂,我真正的用例是显示代码,但tcblisting不幸的是,Ulrike Fischer 的完美解决方案无法编译列表的输出。

\documentclass{article}

\usepackage{tikzducks}% needs version 0.4
% this will be available on ctan sometime in the next 24 hours
% currently: https://github.com/samcarter8/tikzducks/blob/master/tikzducks.sty

\usepackage{listings}
\usepackage[most]{tcolorbox}

\lstdefinestyle{duckstyle}{%
    language={[latex]TeX},
    basicstyle=\footnotesize\ttfamily,
    %
    keywordstyle=\color{red!60!black}\bfseries,
    morekeywords={tikzpicture},
    %
    texcsstyle=*\color{blue}\bfseries,
    moretexcs={duck,stripes},
    %
    moredelim=[is][\footnotesize\ttfamily\color{orange!70!black}]{|}{|},
}

\lstset{style=duckstyle}

\tcbset{listing options={style=duckstyle}}

\begin{document}

\begin{tcblisting}{title={duck}}
\begin{tikzpicture}
  \duck[|stripes|]
  \stripes{}
\end{tikzpicture}
\end{tcblisting}

\end{document}

编辑2

更进一步:该\pgfkeys{/duck/|stripes|/.style={stripes=#1}}解决方案适用于\duck[|stripes|],但对于 则失败\duck[|stripes|={\stripes[color=blue]}]并显示错误消息

! Extra \fi.
\pgfkeyscurrentkey ->color\fi 
                              \ifduck@cape \begin {pgfinterruptboundingbox} ...
l.2     \duck[|stripes|={\stripes[color=blue]}]

I'm ignoring this; it doesn't match any \if.

梅威瑟:

\documentclass{article}

\usepackage{tikzducks}% needs version 0.4
% this will be available on ctan sometime in the next 24 hours
% currently: https://github.com/samcarter8/tikzducks/blob/master/tikzducks.sty

\usepackage{listings}
\usepackage[most]{tcolorbox}

\lstdefinestyle{duckstyle}{%
    language={[latex]TeX},
    basicstyle=\footnotesize\ttfamily,
    %
    keywordstyle=\color{red!60!black}\bfseries,
    morekeywords={tikzpicture},
    %
    texcsstyle=*\color{blue}\bfseries,
    moretexcs={duck,stripes},
    %
    moredelim=[is][\footnotesize\ttfamily\color{orange!70!black}]{|}{|},
}

\lstset{style=duckstyle}

\tcbset{listing options={style=duckstyle}}

\pgfkeys{/duck/|stripes|/.style={stripes=#1}}

\begin{document}

\begin{tcblisting}{title={working}}
\begin{tikzpicture}
  \duck[|stripes|]
  \stripes{}
\end{tikzpicture}
\end{tcblisting}

\begin{tcblisting}{title={not working}}
\begin{tikzpicture}
    \duck[|stripes|={\stripes[color=blue]}]
\end{tikzpicture}
\end{tcblisting}

\end{document}

答案1

作为一种解决方法,您可以使用分隔符来获取橙色关键字:

\documentclass{article}

\usepackage{xcolor}
\usepackage{listings}

\lstdefinestyle{duckstyle}{%
    language={[latex]TeX},
    basicstyle=\footnotesize\ttfamily,
    %
    keywordstyle=\color{red!60!black}\bfseries,
    morekeywords={tikzpicture},
    %
    texcsstyle=*\color{blue}\bfseries,
    moretexcs={duck,stripes},
    %
    moredelim=[is][\footnotesize\ttfamily\color{orange!70!black}]{|}{|},
}

\lstset{style=duckstyle}

\begin{document}

\begin{lstlisting}
\begin{tikzpicture}% <- Perfect color
  \duck[|stripes|=text]% <- Perfect color
  \stripes{}% <- \stripes should be blue :(
\end{tikzpicture}% <- Perfect color
\end{lstlisting}

\end{document}

在此处输入图片描述

编辑

当使用 tcblisting(代码也被执行)时,必须确保密钥|stripes|不是未知的并且执行一些有意义的操作。

最简单的方法是定义别名键:

  \pgfkeys{/duck/|stripes|/.style={stripes={#1}}}

相关内容