使用 TikZ 显示 C++ 源代码

使用 TikZ 显示 C++ 源代码

我正在尝试在 TikZ 环境中显示一些 C++ 源代码(我使用 TikZ 在单个页面上保留相同文本的多个副本,以便在打印时我可以将纸张切成相同的部分并节省纸张)。

下面的代码不起作用,我不太明白为什么。有人能帮我修复它吗?也许我不应该使用 listing 包?

\documentclass[a4paper]{article}

\usepackage[T1]{fontenc}
\usepackage[margin=0in]{geometry}
\usepackage{tikz}
\usepackage{listings}

\lstset{
language=C,
basicstyle=\small\sffamily,
numbers=left,
numberstyle=\tiny,
frame=tb,
columns=fullflexible,
showstringspaces=false
}


\begin{document}
\pagestyle{empty}
  \noindent   \begin{tikzpicture}[x=1cm,y=1cm]
\foreach \x in {0,10.5,21}
  {
    \draw (\x ,0) -- (\x ,29.65);
  };
\foreach \y in {0,7.41,14.83,22.24,29.65}
  {
    \draw (0, \y) -- (21, \y);
  };

 \foreach \x in {0,10.5}
  {
 \foreach \y in {0,7.41,14.83,22.24}
  {  
\draw(0.5+\x,3.75+\y) node [right,text width=9.5cm] {
{\bf  BTS SIO 1\`ere ann\'ee}\ \newline
{\bf  Correction pour le tri de trois nombres}\ \ 

\begin{lstlisting}
#include <iostream>

using namespace std;

int main(int argc, const char * argv[])
{

    // insert code here...
    int a,b,c,ancien;
    cout << "Entrez le premier nombre\n";
    cin >> a;
    cout << "Entrez le second nombre\n";
    cin >> b;
    cout << "Entrez le troisième nombre\n";
    cin >> c;
    if (b<a) {
        ancien=a;
        a=b;
        b=ancien;
    }
    if (c<b) {
        ancien=b;
        b=c;
        c=ancien;
    }
    if (b<a) {
        ancien=a;
        a=b;
        b=ancien;
    }
    cout << "Voici les nombres dans l'ordre croissant : \n" << a << "," << b << "," << c << "\n";
    return 0;
}
\end{lstlsiting}


};
};

\end{tikzpicture}
\end{document}

答案1

无需 PSTricks 或 TikZ。只需使用pdfpages

步骤1

准备 C++ 源代码,将其保存为source-code.cpp,例如,保存在与 LaTeX 输入文件相同的目录中。source-code.cpp如下所示。

// source-code.cpp

#include <iostream>

using namespace std;

int main(int argc, const char * argv[])
{

    // insert code here...
    int a,b,c,ancien;
    cout << "Entrez le premier nombre\n";
    cin >> a;
    cout << "Entrez le second nombre\n";
    cin >> b;
    cout << "Entrez le troisième nombre\n";
    cin >> c;
    if (b<a) {
        ancien=a;
        a=b;
        b=ancien;
    }
    if (c<b) {
        ancien=b;
        b=c;
        c=ancien;
    }
    if (b<a) {
        ancien=a;
        a=b;
        b=ancien;
    }
    cout << "Voici les nombres dans l'ordre croissant : \n" << a << "," << b << "," << c << "\n";
    return 0;
}

int main(int argc, const char * argv[])
{

    // insert code here...
    int a,b,c,ancien;
    cout << "Entrez le premier nombre\n";
    cin >> a;
    cout << "Entrez le second nombre\n";
    cin >> b;
    cout << "Entrez le troisième nombre\n";
    cin >> c;
    if (b<a) {
        ancien=a;
        a=b;
        b=ancien;
    }
    if (c<b) {
        ancien=b;
        b=c;
        c=ancien;
    }
    if (b<a) {
        ancien=a;
        a=b;
        b=ancien;
    }
    cout << "Voici les nombres dans l'ordre croissant : \n" << a << "," << b << "," << c << "\n";
    return 0;
}

第2步

创建一个名为的辅助 LaTeX 输入文件,auxiliary.tex用于将您的转换source-code.cpp为具有语法高亮的 PDF 版本。auxiliary.tex应保存在存在的同一目录中source-code.cpp

% auxiliary.tex

\documentclass[12pt]{article}
\usepackage[a5paper,margin=15mm]{geometry}


% this part is used to allow your readers to copy the code from a PDF viewer but without copying the line numbers.
\usepackage{accsupp}
\newcommand*{\noaccsupp}[1]{\BeginAccSupp{ActualText={}}#1\EndAccSupp{}}

\usepackage{xcolor}
\usepackage{listings}

\lstdefinestyle{shared}
{
    numbers=left,
    numbersep=1em,
    numberstyle=\tiny\color{red}\noaccsupp,
    frame=single,
    framesep=\fboxsep,
    framerule=\fboxrule,
    rulecolor=\color{red},
    xleftmargin=\dimexpr\fboxsep+\fboxrule\relax,
    xrightmargin=\dimexpr\fboxsep+\fboxrule\relax,
    breaklines=true,
    tabsize=2,
    columns=flexible,
}


\lstdefinestyle{cpp}
{
    style=shared,
    language={[ANSI]C++},
    alsolanguage={Python},
    basicstyle=\small\tt,
    keywordstyle=\color{blue},
    commentstyle=\color[rgb]{0.13,0.54,0.13},
    backgroundcolor=\color{yellow!10},
    morekeywords={
        Console,
        WriteLine,
        int,
  },
}

%\lstnewenvironment{cpp}
%{\lstset{style=cpp}}
%{}

\begin{document}
\lstinputlisting[style=cpp]{source-code.cpp}
\end{document}

步骤3

使用 PDFLaTeX 编译器进行编译auxiliary.tex。您可以在使用的文本编辑器中执行此操作,但为了通用性,请通过控制台窗口执行此操作。将当前目录更改为和都source-code.cpp存在的目录auxiliary.tex。调用

pdflatex auxiliary

现在您将拥有auxiliary.pdf包含语法高亮的 C++ 代码。

步骤4

创建以下输入文件并将其保存为main.tex上述另外两个文件所在的同一目录中。

% main.tex
\documentclass{article}
\usepackage[a4paper,margin=5mm]{geometry}
\usepackage{pdfpages}

\begin{document}
\includepdf[nup=2x2,pages=-,duplicatepages=4,frame=true]{master.pdf}
\end{document}

步骤5

这是最后一步。main.tex通过控制台窗口编译,如下所示。

pdflatex main

您肯定会得到以下没有动画效果的输出。

在此处输入图片描述

答案2

您的代码存在很多问题;其中包括一些多余或缺失的括号,以及您无法在不重叠的情况下将所有这些材料多次放在一张 A4 纸上,列表源代码中的重音字符存在一些问题,以及缺少linewidth传递给 的选项listings。但最重要的是,您可以将listings内容放入一个 Box 中,然后在您的tikz picture(因为 listings 显然会更改 catcodes,因此您不能在像tikz picturewhich 这样的环境中使用它也就不足为奇了)中使用它。

编辑:你应该不是\foreach;!结束循环

\documentclass[a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[margin=0in]{geometry}
\usepackage{tikz}
\usepackage{listings}

\lstset{
language=C,
basicstyle=\small\sffamily,
numbers=left,
numberstyle=\tiny,
frame=tb,
columns=fullflexible,
showstringspaces=false,
extendedchars,%
literate={è}{{\`e}}1,%
linewidth=9.5cm,%
% inputencoding=utf8, % does not seem to work
}

\newbox\CodeBox

\begin{document}
\pagestyle{empty}
\setbox\CodeBox \vbox{\hsize=10cm {% doubled braces for color safety
\begin{lstlisting}
#include <iostream>

using namespace std;

int main(int argc, const char * argv[])
{
    // insert code here...
    int a,b,c,ancien;
    cout << "Entrez le premier nombre\n";
    cin >> a;
    cout << "Entrez le second nombre\n";
    cin >> b;
    cout << "Entrez le troisième nombre\n";
    cin >> c;
    if (b<a) {
        ancien=a;
        a=b;
        b=ancien;
    }
    if (c<b) {
        ancien=b;
        b=c;
        c=ancien;
    }
    if (b<a) {
        ancien=a;
        a=b;
        b=ancien;
    }
    cout << "Voici les nombres dans l'ordre croissant : \n" 
         << a << "," << b << "," << c << "\n";
    return 0;
}
\end{lstlisting}
}}

  \noindent
\begin{tikzpicture}[x=1cm,y=1cm]
\foreach \x in {0,10.5,20.95} 
  {
    \draw (\x ,0) -- (\x ,29.65);
  }% no ; here!
%\foreach \y in {0,7.41,14.83,22.24,29.65}
\foreach \y in {0,14.83,29.65}
  {
    \draw (0, \y) -- (20.95, \y);
  }% no ; here!

 \foreach \x in {0,10.5}
%  {\foreach \y in {0,7.41,14.83,22.24}
  {\foreach \y in {0,14.83}
  {\draw(0.5+\x,\y) node [above right,text width=10cm] 
    {{\bfseries  BTS SIO 1\`ere ann\'ee}\newline
     {\bfseries  Correction pour le tri de trois nombres}\ \ 

     \usebox\CodeBox
    };
  }% end of \y loop
}% end of \x loop

\end{tikzpicture}
\end{document}

列表

相关内容