我想在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}}}