列表包突出显示“20e3”中的“e3”作为标识符

列表包突出显示“20e3”中的“e3”作为标识符

LaTeX 代码:

\documentclass{article}
\usepackage{listings}
\usepackage{textcomp}
\usepackage{xcolor}
\lstset{
    basicstyle=\ttfamily,
    columns=fullflexible,
    keepspaces=true,
    upquote=true,
    showstringspaces=false,
    language=c,
    commentstyle=\color{olive},
    keywordstyle=\color{blue},
    identifierstyle=\color{violet},
    stringstyle=\color{purple},
    directivestyle=\color{teal},
}
\begin{document}
\begin{lstlisting}
#include <stdio.h>

int main()
{
    int a = 20000;
    double b = 20e3;
    printf("%d %f\n", a, b);
    return 0;
}
\end{lstlisting}
\end{document}

输出:

在此处输入图片描述

在 中20e3e3被错误地突出显示为标识符。 有办法防止这种情况吗? 或者这是软件包中的错误listings。 如果是这样,有任何已知的解决方法吗?

答案1

有一些解决方法,但每种方法都有其局限性。

一种可能性是e使用 将其声明为数字alsodigit={e}。 这样做的缺点是其他用途e也会被视为数字。

第二种可能性是定义e后跟要强调的数字,并将强调设置为\color{black}。遗憾的listings是不能使用正则表达式(尽管在列表包可以通过正则表达式突出显示吗?) 所以缺点是你必须明确设置每个指数。

第三种可能性是手动转义到 LaTeX,使用转义字符设置颜色。最好这个字符是常规代码中不使用的字符,例如 C 的希腊字母 φ。缺点是您必须对代码中的每个指数执行此操作。

或者,您可以使用minted

梅威瑟:

\documentclass{article}
\usepackage{listings}
\usepackage{textcomp}
\usepackage{xcolor}
\usepackage{minted}
\lstset{
    basicstyle=\ttfamily,
    columns=fullflexible,
    keepspaces=true,
    upquote=true,
    showstringspaces=false,
    language=c,
    commentstyle=\color{olive},
    keywordstyle=\color{blue},
    identifierstyle=\color{violet},
    stringstyle=\color{purple},
    directivestyle=\color{teal},
}
\begin{document}
\begin{lstlisting}[alsodigit={e}]
#include <stdio.h>

int main()
{
    int a = 20000;
    double b = 20e3;
    double c = 20e30;
    float example = 0;
    printf("%d %f\n", a, b);
    return 0;
}
\end{lstlisting}

\begin{lstlisting}[emph={e1,e2,e3,e4,e5,e6,e7,e8,e9,e10},emphstyle=\color{black}]
#include <stdio.h>

int main()
{
    int a = 20000;
    double b = 20e3;
    double c = 20e30;
    float example = 0;
    printf("%d %f\n", a, b);
    return 0;
}
\end{lstlisting}

\begin{lstlisting}[escapechar={φ}]
#include <stdio.h>

int main()
{
    int a = 20000;
    double b = φ20e30φ;
    float example = 0;
    printf("%d %f\n", a, b);
    return 0;
}
\end{lstlisting}

\begin{minted}[style=perldoc]{c}
#include <stdio.h>

int main()
{
    int a = 20000;
    double b = 20e3;
    double c = 20e33;
    float example = 0;
    printf("%d %f\n", a, b);
    return 0;
}
\end{minted}

\end{document}

结果:

在此处输入图片描述

相关内容