Sie sind hier

Quelltext Rahmen

Das listings Packet bietet viele Möglichkeiten um die Darstellung des Quelltextes zu beeinflussen. Besonders hervorzuheben sind die sogenannte Styles. Ein Style beschreibt das Aussehen des generierten Quelltextes. Im folgenden Beispiel wird ein Style erstellt der dem Eclipse Syntax Highlighting nachempfunden ist.

\usepackage{listings}
\usepackage{xcolor}
\usepackage{caption}
\usepackage[framemethod=TikZ]{mdframed
}

%% Farben
\definecolor{darkviolet}{rgb}{0.5,0,0.4}
\definecolor{darkgreen}{rgb}{0,0.4,0.2}
\definecolor{darkblue}{rgb}{0.1,0.1,0.9}
\definecolor{lightblue}{rgb}{0.4,0.4,1}
\definecolor{commentcolor}{gray}{0.50}

\lstdefinestyle{DWEclipse}{
  aboveskip=1mm,
  belowskip=1mm,
  style=small,
  emphstyle=\color{red},
  keywordstyle=\color{darkviolet},
  keywordstyle=[2]\color{darkgreen},
  keywordstyle=[3]\color{darkblue},
  commentstyle=\color{commentcolor},
  stringstyle=\color{darkblue},
  moredelim=**[is][\btHL]{@}{@},
  morecomment=[s][\color{lightblue}]{/**}{*/
},
  breaklines=false,
  showspaces=false,
  showtabs=false,
  tab=rightarrowfill,
  tabsize=2,
  columns=flexible,% fixed,
  escapechar=§,
  showstringspaces=false,
  extendedchars=true,
  keepspaces=true,
  numbers=left,
  numberstyle=\tiny\color{black}\lstfontfamily,
  numbersep=5pt,
  numberblanklines=true,
  extendedchars=true,
  breaklines=false, % Zeilen umbrechen wenn notwendig
  postbreak=\space, % Bei Leerzeichen umbrechen
}%

Dies lässt sich durch das mdframed Packet noch verbessern. Mit diesem Packet ist es ein leichtes den Quelltext mit einem Rahmen zu umgeben. Weiters lässt sich damit ein Hinweis auf die Sprache des Quelltextes anbringen.

\makeatletter
\def\mdf@@codeheading{Code Listings}%new mdframed key:
\define@key{mdf}{title}{%
   \def\mdf@@codeheading{#1}
}

\mdfdefinestyle{lstlisting
}{%
  outerlinewidth=1em,outerlinecolor=white,%
  leftmargin=0,rightmargin=0,%
  leftline = false,%
  rightline = false,%
  skipabove = -1em,%
  skipbelow = -1em,%
  innerleftmargin = 15pt,%
  innerrightmargin = 0pt,%
  innertopmargin = 0pt,%
  innerbottommargin = 0pt,%
  middlelinewidth = 0.5pt,
  backgroundcolor = black!3,%
  singleextra={
      \node [
        rectangle,%
        minimum size=5mm,%
        rounded corners=2.5mm,%
        line width=0.5pt,%
        draw=black,%
        top color=white,%
        bottom color=black!20,%
        anchor=east,%
        xshift=12.3cm,%
     ] at (O|-P) {\scriptsize \csname mdf@@codeheading\endcsname};},%
    firstextra={
      \node [
        rectangle,%
        minimum size=5mm,%
        rounded corners=2.5mm,%
        line width=0.5pt,%
        draw=black,%
        top color=white,%
        bottom color=black!20,%
        anchor=east,%
        xshift=12.3cm,%
     ] at (O|-P) {\scriptsize \csname mdf@@codeheading\endcsname};},%
}%

Durch vordefinierten Kommandos lässt sich das Einfügen von Quelltexten noch zusätzlich vereinfachen.

%% Include source code inline
%%
%% Aufruf: \dwCodeInline{#1}{#2}{#3}{#4}
%% #1 ...: Language (DWC, DWCPP)
%% #2 ...: Style (DWECLIPSE)
%% #3 ...: Filename
%% #4 ...: Language Hint (C++, Cocol-2)
\newcommand{\dwCodeInline}[4]{
  \vspace*{-0.50em\relax
}
  \mdframed[style=lstlisting,title=#4,innertopmargin=2.5mm]%
    \lstinputlisting[language=#1, style=#2]{resources/code/#3}%
  \endmdframed
}%

%% Include source code within program environment
%%
%% Aufruf: \dwCodeInline{#1}{#2}{#3}{#4}{#5}
%% #1 ...: Language (DWC, DWCPP)
%% #2 ...: Style (DWECLIPSE)
%% #3 ...: Filename
%% #4 ...: Language Hint (C++, Cocol-2)
%% #5 ...: Caption
\newcommand{\dwCode}[5]{
  \begin{program
}
    \mdframed[style=lstlisting,title=#4]%
      \lstinputlisting[language=#1, style=#2]{resources/code/#3}%
    \endmdframed
    \caption{#5}
    \label{prog:#3}
  \end{program}
}%

Im folgenden noch einige nützliche Makrodefinitionen für schöne C++ Zeichen und Nummerierungen.

\usepackage{tikz}
\usetikzlibrary{positioning, shapes}

\def\CC{{C\nolinebreak[4]\hspace{-.05em}\raisebox{.4ex}{\tiny\bf ++}}}

\newcommand*\circled[1]{\tikz[baseline=(char.base)]{
            \node[shape=circle,draw,inner sep=1pt] (char) {#1};}}

\newcommand*\rected[1]{\tikz[baseline=(char.base)]{
            \node[shape=rectangle,draw,inner sep=2pt] (char) {#1};}
}

Folgendes Beispiel zeigt die Anwendung und das Ergebnis:

\dwCodeInline{DWCPP}{DWEclipse}{Source.cpp}{\CC}

...