在 PDFLaTeX 中以定制(类似 IDE)格式显示源代码

在 PDFLaTeX 中以定制(类似 IDE)格式显示源代码

我想在 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 屏幕截图。
  • 括号和其他标点符号/操作符的颜色由 功能设置literatelistings此列表可以扩展到其他符号。例外,如果*/被使用 重新定义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}

结果 TG 光标

删除字节顺序标记

正确配置的编辑器可以删除 UTF-8 中的字节顺序标记。或者literate也可以使用该功能来删除它们,请参见上文和此处:

literate={^^ef^^bb^^bf{}0}

Ulrike Fischer 的回答xport 的问题“如何抑制输出中的BOM效应?”

相关内容