Seite 1 von 1

längere Matlab-Codes in Latex einbinden

Verfasst: Di 25. Mär 2014, 10:19
von waba
Hallo,

ich binde Matlab-Codes mit Hilfe der mcode.sty Datei von Mathworks in meinen Latex-Text ein. Dies erledige ich dann mit folgendem Befehl:
\begin{figure} 
\begin{lstlisting} 
Matlab ist toll % und Latex auch 
\end{lstlisting} 
      \caption{Matlab ist toll} 
      \label{Mit} 
\end{figure}
Mein Problem ist nun das auf Grund der figure-Umgebung kein Seitenumbruch mehr vorhanden ist und somit längere Matlab-Codes nicht mehr komplett angezeigt werden. Sie werden dann bis zum Ende das Blattes und quasi darüber hinaus erstellt. Auf dem nächsten Blatt gehen sie dann aber nicht mehr weiter.

Wie kann ich nun eine Bildunterschrift und ein Label an den Code anhängen und dennoch den Seitenumbruch erhalten?

Viele Grüße

Verfasst: Di 25. Mär 2014, 10:36
von Johannes_B
In Gleitumgebungen darf grundsätzlich kein Seitenumbruch stattfinden. Also wird die Gleitumgebung nicht verwendet, und stattdessen \captionof{type}{Text} aus KOMA-script benutzt.

An dieser Stelle auch gleich die Definition eines neuen Verzeichnisses mit eigenen Eintragstypen. Nähere Informationen finden sich in der KOMA-Dokumentation.
\documentclass{scrartcl}
\usepackage{tocbasic}
\DeclareNewTOC[%
	type=snippet,%
	types=snippets,%
	float,%Damit kann das Listing gleiten
	name=Codeschnipsel,%
	listname={Liste der Codeschnipsel}%
]{lol}%ListOfListings
\usepackage{listings}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{blindtext}
\begin{document}
\listofsnippets
\blindtext

\begin{snippet}
	\begin{lstlisting}
	  repeat     
    swapped = false
    for i = 1 to length(A) - 1 inclusive do:
      /* if this pair is out of order */
      if A[i-1] > A[i] then
        /* swap them and remember something changed */
        swap( A[i-1], A[i] )
        swapped = true
      end if
    end for
  until not swapped
	\end{lstlisting}
	\caption{bubbleSort}
\end{snippet}

\blindtext[2]
\begin{center}
	\begin{lstlisting}
	  repeat     
    swapped = false
    for i = 1 to length(A) - 1 inclusive do:
      /* if this pair is out of order */
      if A[i-1] > A[i] then
        /* swap them and remember something changed */
        swap( A[i-1], A[i] )
        swapped = true
      end if
    end for
  until not swapped
	  repeat     
    swapped = false
    for i = 1 to length(A) - 1 inclusive do:
      /* if this pair is out of order */
      if A[i-1] > A[i] then
        /* swap them and remember something changed */
        swap( A[i-1], A[i] )
        swapped = true
      end if
    end for
  until not swapped
	  repeat     
    swapped = false
    for i = 1 to length(A) - 1 inclusive do:
      /* if this pair is out of order */
      if A[i-1] > A[i] then
        /* swap them and remember something changed */
        swap( A[i-1], A[i] )
        swapped = true
      end if
    end for
  until not swapped
	  repeat     
    swapped = false
    for i = 1 to length(A) - 1 inclusive do:
      /* if this pair is out of order */
      if A[i-1] > A[i] then
        /* swap them and remember something changed */
        swap( A[i-1], A[i] )
        swapped = true
      end if
    end for
  until not swapped
	  repeat     
    swapped = false
    for i = 1 to length(A) - 1 inclusive do:
      /* if this pair is out of order */
      if A[i-1] > A[i] then
        /* swap them and remember something changed */
        swap( A[i-1], A[i] )
        swapped = true
      end if
    end for
  until not swapped
	  repeat     
    swapped = false
    for i = 1 to length(A) - 1 inclusive do:
      /* if this pair is out of order */
      if A[i-1] > A[i] then
        /* swap them and remember something changed */
        swap( A[i-1], A[i] )
        swapped = true
      end if
    end for
  until not swapped
	  repeat     
    swapped = false
    for i = 1 to length(A) - 1 inclusive do:
      /* if this pair is out of order */
      if A[i-1] > A[i] then
        /* swap them and remember something changed */
        swap( A[i-1], A[i] )
        swapped = true
      end if
    end for
  until not swapped
	\end{lstlisting}
	\captionof{snippet}{ein paar mal bubblesort}
\end{center}
\end{document}

Verfasst: Di 25. Mär 2014, 11:14
von waba
ja das kommt dem schon sehr Nahe nur wie bringe ich noch folgenden Befehl unter?
\counterwithin{figure}{section} % Bildbeschriftung 1.1 ... 2.3 usw.
Wenn ich figure gegen snippet tausche kommt eine Fehlermeldung.

Verfasst: Di 25. Mär 2014, 11:32
von esdd
Bei mir funktioniert das, wenn ich in den Code von Johannes
\usepackage{chngcntr}
\counterwithin{snippet}{section}
einfüge.

Das Paket tocbasic wird von den KOMA-Script Klassen ohnehin verwendet. Du brauchst es deshalb nur dann explizit laden, wenn Du eine andere Dokumentenklasse nutzt.

Gruß
Elke

Verfasst: Di 25. Mär 2014, 11:47
von waba
Meine Präambel sieht jetzt folgendermaßen aus:
\documentclass[a4paper,12pt,titlepage,german,liststotoc,bibtotoc,headsepline]{scrartcl}

\usepackage[ngerman]{babel} % deutsche Silbentrennung
\usepackage[utf8]{inputenc} % deutsche Umlaute
\usepackage{ucs}
\usepackage[T1]{fontenc}
\usepackage{graphicx}
 
% ÜBERSCHRIFTEN, ABSTÄNDE, SEITENSTIL
\frenchspacing
\pagestyle{headings}
\usepackage[left=3.5cm, right=3cm, top=2.5cm, bottom=2.5cm]{geometry} % Seitenränder
\usepackage{xcolor}%Textfarbe
%\renewcommand*{\chapterheadstartvskip}{\vspace*{-0.5cm}} % Abstand der Kapitelüberschriften zum oberen Seitenrand reduziert um x
%\usepackage{lmodern} % neue verbesserte Schrifttypen von LaTex
\usepackage{float}%Gleitumgebung für Bilder

% DOKUMENT ZEILENABSTAND
\usepackage{setspace}
%\onehalfspacing

\usepackage{parskip} %Verhindert das Einrücken nach Zeilenabsatz

%MATHE 
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{amsfonts}
\usepackage{listings} 
\usepackage[framed,numbered,autolinebreaks,useliterate]{mcode} % Matlabcode hinzufügen

\usepackage{tocbasic}
\DeclareNewTOC[% 
   type=snippet,% 
   types=snippets,% 
   float,%Damit kann das Listing gleiten 
   name=Matlab-Code,% 
   listname={Codeverzeichnis}% 
]{lol}%ListOfListings 
\lstloadlanguages{Matlab} 
\lstset{literate=%
  {Ö}{{\"O}}1
  {Ä}{{\"A}}1
  {Ü}{{\"U}}1
  {ß}{{\ss}}2
  {ü}{{\"u}}1
  {ä}{{\"a}}1
  {ö}{{\"o}}1
} % Umlaute in Matlabcode
%\counterwithin{snippet}{section} % Bildbeschriftung 1.1 ... 2.3 usw.

% ANDERES
\usepackage{blindtext}
\usepackage[numbers,square]{natbib} % zum Einbinden von .bib
\usepackage{url} % mit \url{} lassen sich Internetlinks mit Sonderzeichen darstellen
\usepackage{hyperref}
\usepackage{scrpage2}
\pagestyle{scrheadings}
\clearscrheadfoot
\ihead[\headmark]{\headmark} \ohead{Seite \pagemark}
\usepackage{eurosym}%Eurosymbol einfügen mit \EUR{Betrag}
\usepackage[printonlyused]{acronym}%Abkürzungsverzeichniss
\usepackage{csquotes}
\usepackage{chngcntr}

\counterwithin{figure}{section}  % Bildbeschriftung 1.1 ... 2.3 usw.

%\renewcaptionname{ngerman}{\contentsname}{Inhalt}
%\renewcaptionname{ngerman}{\listfigurename}{Abbildungen}
%\renewcaptionname{ngerman}{\listtablename}{Tabellen}
\renewcommand{\refname}{Literaturverzeichnis}
% ZITATE 

\bibliographystyle{natdin}
und meine Matlab-Codes sind jetzt so eingebunden:
\begin{snippet}[H]
\begin{lstlisting}
z = x + y
.
.
.
..
.
..
.
.
.
.
\end{lstlisting}
		\caption{Beispiel}
		\label{Beispiel}
\end{snippet}
Leider habe ich festgestellt das Seiten immernoch nicht umgebrochen werden. Liegt das evtl an dem verwendeten mcode.sty?
http://www.mathworks.com/matlabcentral/ ... ex-package

Falls ja was muss ich daran ändern

Verfasst: Di 25. Mär 2014, 11:57
von waba
Desweiteren habe ich noch das Problem Das im Code-Verzeichnis bei einer Beschriftung zum Beispiel 3.14 der Abstand zwischen den Ziffern und der Buchstaben der Beschriftung nicht groß genug ist und diese übereinander stehen...

Verfasst: Di 25. Mär 2014, 12:06
von esdd
Hast du dir den Code von Johannes richtig angesehen? Nur die kurzen Codestücken, die gleiten dürfen, gehören in die snippet Umgebung. Bei Listings, die einen Seitenumbruch enthalten sollen, darfst du diese nicht verwenden. Die Beschriftung setzt du in dem Fall mit \captionof{snippet}{...}

Den Befehl \counterwithin kannst du erst nach \usepackage{chngcntr} verwenden.

Das Problem mit den Nummern im Verzeichnis kannst du durch die Option listof=flat lösen:
\documentclass[12pt,titlepage,
  listof=totoc,listof=flat,
  bibliography=totoc,
  headsepline]{scrartcl}
Gruß
Elke