我正在尝试在 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 picture
which 这样的环境中使用它也就不足为奇了)中使用它。
编辑:你应该不是\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}