我想在 latex 中放入一些“C”源代码片段(我使用 PDFLaTeX),但是使用“listings”包我无法得到我想要的结果。
理想情况下,希望获得的结果与 Keil uVision IDE 中可见的源代码相同。
以下是我想要获得的示例:
…这就是我目前所拥有的:
uVision IDE 使用 10 号“Courier New”字体…
- 文本的正常样式(黑色)
- 斜体样式的评论(绿色)
- 关键词采用粗体样式(黑色)
- 十进制数的正常样式(紫色)
- 括号的正常样式(蓝色)
如果这很难实现,另一种方法是使用全黑文本,但 C 关键字使用粗体(例如“for”、“if”、“void”、“int”等),其余文本使用“Courier New”字体,大小为 10,无空格。此外,最好能够将“TAB”大小编辑为 3 个空格。
我将非常感激任何能提供的帮助。
答案1
该listings
包没有解析器功能来检测十进制数。因此很难捕获它们。密钥literate
没有多大帮助,因为标识符中的数字不能被着色。
其他要求比较简单:
- 下面的示例使用拉丁现代字体。
- 这些颜色取自问题中的 IDE 屏幕截图。
- 括号和其他标点符号/操作符的颜色由 功能设置
literate
。listings
此列表可以扩展到其他符号。例外,如果*
和/
被使用 重新定义literate
,则注释检测会中断。
\documentclass{article}
\usepackage{xcolor}
\usepackage{listings}
\usepackage[T1]{fontenc}
%\usepackage{tgcursor}
\usepackage{lmodern}
\colorlet{comment}{green!50!black}
\colorlet{cppcomment}{teal}
\colorlet{symb}{blue!50!black}
\colorlet{number}{violet}
\newcommand*{\textcolorsymb}{\textcolor{symb}}
\lstdefinestyle{cpp}{%
language=C++,
columns=flexible,
basewidth=.5em,
tabsize=3,
basicstyle=\ttfamily,
commentstyle={\itshape\color{comment}\let\textcolorsymb\relax},
keywordstyle=\bfseries,
morecomment={[l][\itshape\color{cppcomment}\let\textcolorsymb\relax]//},
literate=%
{\{}{\textcolorsymb{\{}}1
{\}}{\textcolorsymb{\}}}1
{(}{\textcolorsymb{(}}1
{)}{\textcolorsymb{)}}1
{;}{\textcolorsymb{;}}1
{=}{\textcolorsymb{=}}1
{<}{\textcolorsymb{<}}1
{>}{\textcolorsymb{>}}1
{!}{\textcolorsymb{!}}1
{\&}{\textcolorsymb{\&}}1
{|}{\textcolorsymb{|}}1
{?}{\textcolorsymb{?}}1
{:}{\textcolorsymb{:}}1
{+}{\textcolorsymb{+}}1
{-}{\textcolorsymb{-}}1
{,}{\textcolorsymb{,}}1
{\%}{\textcolorsymb{\%}}1
{\^}{\textcolorsymb{\textasciicircum}}1
{~}{\textcolorsymb{\textasciitilde}}1
%% {/}{\textcolorsymb{/}}1
%% {*}{\textcolorsymb{*}}1
% 2 (optionally)
{==}{\textcolorsymb{==}}2
{>=}{\textcolorsymb{=>}}2
{<=}{\textcolorsymb{<=}}2
{!=}{\textcolorsymb{!=}}2
{+=}{\textcolorsymb{+=}}2
{-=}{\textcolorsymb{-=}}2
{*=}{\textcolorsymb{*=}}2
{/=}{\textcolorsymb{/=}}2
{\%=}{\textcolorsymb{\%=}}2
{\&\&}{\textcolorsymb{\&\&}}2
{||}{\textcolorsymb{||}}2
{++}{\textcolorsymb{++}}2
{--}{\textcolorsymb{--}}2
{>>}{\textcolorsymb{>\kern0pt>}}2
{<<}{\textcolorsymb{<\kern0pt<}}2
{::}{\textcolorsymb{::}}2
% 3 (optionally)
{>>=}{\textcolorsymb{>\kern0pt>=}}3
{<<=}{\textcolorsymb{<\kern0pt<=}}3
% Remove byte order mark
{^^ef^^bb^^bf}{}0
}
\lstnewenvironment{cpp}{\lstset{style=cpp}}{}
\begin{document}
\begin{cpp}
long some_function();
int other_function();
/* This is a comment ()={}; */
int calling_function()
{
long test1;
int test2;
a == b <= c >= d;
a & b && c | d || e;
a ? b : c;
a + b++, c - d--;
a %= b % c >> e << f;
a *= *c; d /= e;
a / b ^ c ~ d;
a <<= b, c >>= d;
test1 = some_function();
// this is another comment
if (test1 > 0)
{
test2 = 0;
}
else
{
test2 = other_function();
}
return test2;
}
\end{cpp}
\end{document}
使用 TeX Gyre Cursor(由 Ghostscript 的 Cursor 变体开发)的结果:\usepackage{lmodern}
被替换为\usepackage{tgcursor}
。
删除字节顺序标记
正确配置的编辑器可以删除 UTF-8 中的字节顺序标记。或者literate
也可以使用该功能来删除它们,请参见上文和此处:
literate={^^ef^^bb^^bf{}0}