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}
输出:
在 中20e3
,e3
被错误地突出显示为标识符。 有办法防止这种情况吗? 或者这是软件包中的错误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}
结果: