lstlisting:彩色 LaTeX 命令,如 `\\` 或 `\!`

lstlisting:彩色 LaTeX 命令,如 `\\` 或 `\!`

我如何使用 lstlisting 来实现 LaTeX 命令(如\\或)\!正确突出显示为语法?将这些命令(带或不带反斜杠)添加到moretexcs不会提供缩进的结果。

\documentclass{scrartcl}

\usepackage{fontspec}

\usepackage{listings}
\usepackage{xcolor}

\lstset{
  language=[LaTeX]TeX,
  basicstyle=\ttfamily,
  texcsstyle=*\color{cyan},
  moretexcs={!},
}


\begin{document}
\begin{lstlisting}
\begin{equation}
  \left(\frac{1}{2}\right)^{\! 2}
\end{equation}
\end{lstlisting}
\end{document}

答案1

您可以使用literate选项将所需的命令替换为突出显示的命令。

问题是,当您使用带星号的选项时,按方面 (列表开发人员指南第 152 页)添加到钩子texcsstyle中的代码会部分覆盖选项使用的代码 (第 137 页)。SelectCharTabletexliterate

如果要listings正确使用文字替换,则需要literate在加载tex方面之后“重新挂钩”所使用的代码。

\documentclass{scrartcl}

\usepackage{fontspec}

\usepackage{listings}
\usepackage{xcolor}


\lstset{
  language=[LaTeX]TeX,
  basicstyle=\ttfamily,
  texcsstyle=*\color{cyan},
  literate=*%
    {\\!}{{\textcolor{cyan}{\textbackslash{}!}}}2
    {\\\\}{{\textcolor{cyan}{\textbackslash{}\textbackslash{}}}}2,
}

% "Rehook" literate char table.
\makeatletter
\lst@AddToHook{SelectCharTable}
    {\ifx\lst@literate\@empty\else
         \expandafter\lst@Literate\lst@literate{}\relax\z@
     \fi}
\makeatother


\begin{document}

\begin{lstlisting}
\begin{equation}
  \left(\frac{1}{2}\right)^{\! 2}
  \gamma!
  \\!
  \\left
\end{equation}
\end{lstlisting}

\end{document}

pdf 屏幕截图

当然,你可以添加所有替换项,例如Ismo 的回答,只是¡开头没有 s。

答案2

所以这是另一个尝试。不幸的是,它需要一些额外的标记,因此不适合在可运行的 TeX 文件中以列表形式读取。

当然,¡ 可以被代码中不需要的任何字符替换。

这里如何使用代码点大于 255 的字符。

编辑:即使空格(文字中的“\”)也可以起作用。

\documentclass{scrartcl}

\usepackage{fontspec}

\usepackage{listings}
\usepackage{xcolor}

\lstset{
  language={[LaTeX]TeX},
  basicstyle=\ttfamily,
  texcsstyle=*\color{red},
  extendedchars,
}

\lstset{
  literate=*{¡\\!}{{\textcolor{red}{\textbackslash!}}}{2}
            {¡\\"}{{\textcolor{red}{\textbackslash"}}}{2}
            {¡\\\#}{{\textcolor{red}{\textbackslash\#}}}{2}
            {¡\\\$}{{\textcolor{red}{\textbackslash\$}}}{2}
            {¡\\\%}{{\textcolor{red}{\textbackslash\%}}}{2}
            {¡\\\&}{{\textcolor{red}{\textbackslash\&}}}{2}
            {¡\\'}{{\textcolor{red}{\textbackslash'}}}{2}
            {¡\\(}{{\textcolor{red}{\textbackslash(}}}{2}
            {¡\\)}{{\textcolor{red}{\textbackslash)}}}{2}
            {¡\\*}{{\textcolor{red}{\textbackslash*}}}{2}
            {¡\\+}{{\textcolor{red}{\textbackslash+}}}{2}
            {¡\\,}{{\textcolor{red}{\textbackslash,}}}{2}
            {¡\\-}{{\textcolor{red}{\textbackslash-}}}{2}
            {¡\\.}{{\textcolor{red}{\textbackslash.}}}{2}
            {¡\\/}{{\textcolor{red}{\textbackslash/}}}{2}
            {¡\\:}{{\textcolor{red}{\textbackslash:}}}{2}
            {¡\\;}{{\textcolor{red}{\textbackslash;}}}{2}
            {¡\\<}{{\textcolor{red}{\textbackslash<}}}{2}
            {¡\\=}{{\textcolor{red}{\textbackslash=}}}{2}
            {¡\\>}{{\textcolor{red}{\textbackslash>}}}{2}
            {¡\\?}{{\textcolor{red}{\textbackslash?}}}{2}
            {¡\\[}{{\textcolor{red}{\textbackslash[}}}{2}
            {¡\\\\}{{\textcolor{red}{\textbackslash\textbackslash}}}{2}
            {¡\\]}{{\textcolor{red}{\textbackslash]}}}{2}
            {¡\\\^}{{\textcolor{red}{\textbackslash\textasciicircum}}}{2}
            {¡\\\{}{{\textcolor{red}{\textbackslash\{}}}{2}
            {¡\\|}{{\textcolor{red}{\textbackslash|}}}{2}
            {¡\\\}}{{\textcolor{red}{\textbackslash\}}}}{2}
            {¡\\\~}{{\textcolor{red}{\textbackslash\textasciitilde}}}{2}
}

\begin{document}
\begin{lstlisting}
  ¡\! ¡\" ¡\# ¡\$ ¡\% ¡\& ¡\' ¡\( ¡\) ¡\* ¡\+ ¡\, ¡\- ¡\. ¡\/ ¡\: ¡\; ¡\< ¡\= ¡\> ¡\? ¡\[ ¡\\ ¡\] ¡\^ ¡\{ ¡\| ¡\} ¡\~
\end{lstlisting}
\end{document}

答案3

这比我想象的要容易。

编辑:不完全是。在清单文档表 2 中“其他”列出的字符中,只有 !、" 和 # 实际上是这样工作的。

\documentclass{scrartcl}

\usepackage{fontspec}

\usepackage{listings}
\usepackage{xcolor}

\lstset{
  language=[LaTeX]TeX,
  basicstyle=\ttfamily,
  texcsstyle=*\color{cyan},
  alsoletter={!},
  moretexcs={!},
}

\begin{document}
\begin{lstlisting}
\begin{equation}
  \left(\frac{1}{2}\right)^{\! 2}
\end{equation}
\end{lstlisting}
\end{document}

相关内容