如何使用这种非常具体的语法突出显示来排版 LaTeX 源代码?

如何使用这种非常具体的语法突出显示来排版 LaTeX 源代码?

我想在我的 PDF 输出中放入一些 LaTeX 源代码,样式如下:

在此处输入图片描述

文本模式下颜色为白色,数学模式下颜色为黄色,注释模式下颜色为灰色。对于控制序列,我将其分为四种,每种都有不同的高亮模式:

  • 文本模式下的命令为青色,其参数(非可选)为橙色和斜体。
  • 文本模式下的命令是青色的,但其参数(非可选)是白色且直立的。
  • 文本模式下的命令为玫瑰色,其可选参数为橙色和斜体,非可选参数为青色和斜体。
  • 数学模式下的命令是紫色的,其参数(可选或非可选)应该是玫瑰色且直立。

请记住,命令前的反斜杠始终以与命令相同的颜色突出显示,但参数的分隔符保持白色(正文的颜色)。

我尝试并在网上搜索了大约十个小时,但仍然失败了。任何提示或线索都将不胜感激。

答案1

这个解决方案并不完美(因此需要社区 wiki),但它可能会帮助您或其他人开始(如果有人想改进这个解决方案,请随意)。

截屏

我借用了一些代码强调(颜色)列表中两个分隔符之间的内容,但不强调分隔符本身帮助分组分隔符。

这是一个棘手的问题,因为你本质上想改变listings中途的风格listings(我尝试了一些东西,但无法让它工作)。

% arara: pdflatex
% !arara: indent: {overwrite: yes}
\documentclass{article}
\usepackage{listings}           
\usepackage{xcolor}

% https://tex.stackexchange.com/questions/147836/emphasize-contents-between-two-with-listings
\def\begindollar{\ttfamily\$\bgroup\color{yellow}\aftergroup\enddollar}
\def\enddollar{\$\egroup}

% tweaked from above for { }
\def\beginbrace{\ttfamily\color{white}{\{}\bgroup\color{orange}\itshape\aftergroup\endbrace}
\def\endbrace{\color{white}{\}}\egroup}

% tweaked from above for [ ]
\def\beginbracket{\ttfamily\color{white}{[}\bgroup\color{orange}\itshape\aftergroup\endbracket}
\def\endbracket{\color{white}{]}\egroup}
\lstset{%
    basicstyle=\ttfamily\color{orange},language={[LaTeX]TeX},   
    texcsstyle=*\color{cyan},
    columns=flexible,
    backgroundcolor=\color{black},
    commentstyle=\color{gray},    % comments
    literate={usepackage}{\bgroup\color{purple}{usepackage}\egroup}1
    {documentclass}{\bgroup\color{purple}{documentclass}\egroup}1,
    moredelim = **[is][\begindollar]{\$}{\$},
    moredelim=**[is][\beginbrace]{\{}{\}},
    moredelim=**[is][\beginbracket]{[}{]},
}


\begin{document}

\begin{lstlisting}
\documentclass[10pt]{article}
\usepackage{tikz}
\begin{document}
\tikz \color{blue} $(a+b)$ $n \choose r$ % \tikz
\end{document}
\end{lstlisting}

\end{document}

相关内容