Seite 1 von 1

Algorithmus über 2 Seiten mit vertikalen Orientierungslinien

Verfasst: Fr 15. Jan 2016, 09:58
von swizz-john
Hi Leute,

gibt es die Möglichkeit folgendes Beispiel so anzupassen, dass der Algorithmus über 2 Seiten gebrochen werden kann und dennoch die Struktur der vertikalen Linien (also die Orientierung für Schleifen und Verzweigungen am linken Rand, wie im Beispiel zu sehen) erhalten bleiben?

Ein Umbruch ohne diese Orientierungslinien würde es schwer machen bei vielen Verzweigungen, nur anhand der Einrückung des Codes, überhaupt nachzuvollziehen in welcher Verzweigung man sich grad befindet.

Es wäre super, wenn einer eine Idee hätte;)

Hier mein Beispiel:
\documentclass{article}
\usepackage[ansinew]{inputenc}             
\usepackage[TS1,T1]{fontenc}
\usepackage{lmodern,textcomp}
\usepackage[english,ngerman]{babel}
\usepackage[linesnumbered,ruled,vlined]{algorithm2e}

\begin{document}


\begin{algorithm}
\DontPrintSemicolon % Some LaTeX compilers: \dontprintsemicolon 
      \KwIn{A finite set $A=\{a_1, a_2, \ldots, a_n\}$ of integers}
      \KwOut{The largest element in the set}
      $max \gets a_1$\;
      \For{$i \gets 2$ \textbf{to} $n$} {
      \If{$a_i > max$} {
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
       $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
       $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      $max \gets a_i$\;
      }
      }
      \Return{$max$}\;
      \caption{{\sc Max} finds the maximum number}
     \label{algo:max}
     \end{algorithm}
     \end{document}

Verfasst: Fr 15. Jan 2016, 14:54
von Besserwisser
Die algorithm-Umgebung von algorithm2e ist eine Gleitumgebung. Gleitumgebungen können nie über mehrere Seiten umbrochen werden.

Verfasst: Fr 15. Jan 2016, 16:17
von swizz-john
Hi, danke für die Info...

ich habe mittlerweile improvisiert indem ich diese end_if etc alle weglasse...so passt mein Algorithmus nun auf eine Seite;)

Eine Frage bleibt allerdings noch offen. Wie kann ich im algorithm2e - Paket das obige label "Data" und "Result" in von mir gewünschte Namen ändern?

ich hätte da statt "Data" gerne "Funktionsaufruf" und statt "Result" gerne "Resultat".

Mein jetziger Code lautet:
\documentclass[paper=a4,toc=bibliography,nonchapterprefix,parskip=true]{scrreprt}
\usepackage{caption}[2007/09/01] % needs v3.1
\usepackage[ruled,vlined]{algorithm2e}
\usepackage{float}

\begin{document}

\renewcommand{\baselinestretch}{1.3}
\begin{algorithm}
\SetAlgorithmName{Algorithmus}{}
\DontPrintSemicolon
\KwData{IPDP($no_{iter},~no_{path}~,\alpha,~ \beta,~ \rho,~\xi,~ q_0,~ no_{stag},~ flag_{ils},~ no_{ils},~ no_{ni},~ flag_{mff},\newline~\phantom{laaaaaaaaaaaaaa} veh_{data}, no_{veh}, no_{m})$}
\KwResult{Lösung zum IPDP}
$----------\texttt{Initialisierung und Preprocessing}-------------$\;
Lade Datensatz $\rightarrow~set$\;
Berechne Distanz: $\rightarrow~dist$\;
Initialisiere r-Werte: $\rightarrow~r$\;
$----------\texttt{Generiere Startlösung}-------------$\;
\For{$i=1:n_{path}$}{
$sol\_data_{k} \leftarrow new\_path (dist, set, veh_{data}, no_{m}, no_{kunden},\beta , \eta,r, q_0, flag_{mff})$\;
\If{$sol\_data_{k}.cost< sol\_data.cost$}{$sol\_data = sol\_data_{k}$\;}
}
\caption{IPDP Teil I/II\label{IPDP}}
\end{algorithm}
\end{document}

Verfasst: Fr 15. Jan 2016, 17:46
von Bartman
Sieh Dir den Abschnitt 10.8 der Paketdokumentation an.

Defining a new keyword in algorithm2e

Label anpassen Result, Data wie gewünscht ändern

Verfasst: Mo 18. Jan 2016, 19:09
von swizz-john
Hmm ich habe mir das Paket mal angeschaut und durchgelesen....

ich verstehe leider eine Sache immer noch nicht...Ersteres Beispiel funktioniert tadellos...zweites ist meiner Meingung nach analog, funktioniert aber nicht!
\documentclass[paper=a4,toc=bibliography,nonchapterprefix,parskip=true]{scrreprt}

\usepackage[utf8]{inputenc}
\usepackage[ruled,vlined,linesnumbered]{algorithm2e}
\let\oldnl\nl% Store \nl in \oldnl
\newcommand{\nonl}{\renewcommand{\nl}{\let\nl\oldnl}}% Remove line number for one line
\SetKwInOut{Funktion}{Funktionsaufruf}

\begin{document}

\renewcommand{\baselinestretch}{1.3}
\DontPrintSemicolon
\begin{algorithm}
\SetAlgorithmName{Algorithmus}{}
\Funktion{IPDP($no_{iter},~no_{path}~,\alpha,~\beta,~\rho,~\xi,~q_0,~no_{stag},~flag_{ils},~no_{ils},~no_{ni},~flag_{mff},\newline\phantom{laaaii}~veh_{data},~no_{veh},~no_{m})$}
\KwResult{Lösung zum IPDP}\vspace{1mm}
\nonl$----------\texttt{Initialisierung und Preprocessing}---------------$\;\vspace{1mm}
 Lade Datensatz $\rightarrow~set$\;
 Berechne Distanz: $\rightarrow~dist$\;
 Initialisiere r-Werte: $\rightarrow~r$\;\vspace{1mm}
\nonl$----------\texttt{Generiere Startlösung}----------------------$\;\vspace{1mm}
\For{$i=1:n_{path}$\vspace{1mm}}{
$sol\_data_{k}~\leftarrow~new\_path (dist,~set,~veh_{data},~no_{m},~no_{kunden},~\beta ,~\eta,~r,~q_0,~flag_{mff})$\;\vspace{1mm}
\If{$sol\_data_{k}.cost~<~sol\_data.cost$\vspace{1mm}}
{$sol\_data~\leftarrow~sol\_data_{k}$\;}
}
\caption{IPDP Teil I/II\label{IPDP}}
\end{algorithm}

%Jetzt beginnt der zweite Algorithmus, wobei obiges hier nicht funktioniert.

\renewcommand{\baselinestretch}{1.3}
\begin{algorithm}
\SetAlgorithmName{Algorithmus}{}
\DontPrintSemicolon
\Funktion{IPDP($no_{iter}$)}
\KwResult{Lösung zum IPDP}\vspace{1mm}
\For{$i=1:n_{path}$}{
$sol\_data_{k} \leftarrow new\_path (dist, set)$\;
\eIf{$sol\_data_{k}.cost< sol\_data.cost$}{$sol\_data = sol\_data_{k}$\;}{blablba}}
\caption{IPDP Teil I/II\label{IPDP}}
\end{algorithm}


\end{document}

Hat einer ne Idee was der Unterschied ist, warum das obige funktioniert und ich dort "Funktionsaufruf" stehen habe! aber dies unten nicht funktioniert?

Schöne Grüße

Verfasst: Mo 18. Jan 2016, 21:19
von Bartman
\DontPrintSemicolon steht oben außerhalb der algorithm-Umgebung und unten innerhalb.
\documentclass{scrreprt}

\usepackage[utf8]{inputenc}
\usepackage[ruled,vlined,linesnumbered]{algorithm2e}
\let\oldnl\nl% Store \nl in \oldnl
\newcommand{\nonl}{\renewcommand{\nl}{\let\nl\oldnl}}% Remove line number for one line
\SetKwInOut{Funktion}{Funktionsaufruf}
\SetKwInput{KwResult}{Resultat}

\begin{document}

\renewcommand{\baselinestretch}{1.3}
\begin{algorithm}
\SetAlgorithmName{Algorithmus}{}
\DontPrintSemicolon
\Funktion{IPDP($no_{iter},~no_{path}~,\alpha,~\beta,~\rho,~\xi,~q_0,~no_{stag},~flag_{ils},~no_{ils},~no_{ni},\newline\phantom{laaaii}~flag_{mff},~veh_{data},~no_{veh},~no_{m})$}
\KwResult{Lösung zum IPDP}\vspace{1mm}
\tcp{----------Initialisierung und Preprocessing-------------}
 Lade Datensatz $\rightarrow~set$\;
 Berechne Distanz: $\rightarrow~dist$\;
 Initialisiere r-Werte: $\rightarrow~r$\;\vspace{1mm}
 \tcp{----------Generiere Startlösung-------------------------}
\For{$i=1:n_{path}$\vspace{1mm}}{
$sol\_data_{k}~\leftarrow~new\_path (dist,~set,~veh_{data},~no_{m},~no_{kunden},~\beta ,~\eta,~r,~q_0,~flag_{mff})$\;\vspace{1mm}
\If{$sol\_data_{k}.cost~<~sol\_data.cost$\vspace{1mm}}
{$sol\_data~\leftarrow~sol\_data_{k}$\;}
}
\caption{IPDP Teil I/II\label{IPDP}}
\end{algorithm}

\begin{algorithm}
\SetAlgorithmName{Algorithmus}{}
\DontPrintSemicolon
\Funktion{IPDP($no_{iter}$)}
\KwResult{Lösung zum IPDP}\vspace{1mm}
\For{$i=1:n_{path}$}{
$sol\_data_{k} \leftarrow new\_path (dist, set)$\;
\eIf{$sol\_data_{k}.cost< sol\_data.cost$}{$sol\_data = sol\_data_{k}$\;}{blablba}}
\caption{IPDP Teil I/II\label{IPDP}}
\end{algorithm}

\end{document}
Außerdem habe ich Deine beiden Bemerkungen im oberen Algorithmus in Kommentare verwandelt, weil ich den Eindruck habe, es sollen welche sein.

Die Änderung von \baselinestretch findet beim ersten Mal außerhalb der algorithm-Umgebung statt, d. h. die Folgen gelten auch für alle weiteren Umgebungen. Der zweite Aufruf von \renewcommand darf entfallen.

Was beabsichtigst Du mit Deinen \vspace{1mm}-Aufrufen innerhalb der algorithm-Umgebungen?

Verfasst: Mo 18. Jan 2016, 22:38
von swizz-john
Super! Vielen Dank Bartman!;)

Ich nutze \vspace nur für optische Zwecke...mir scheint es an ein zwei Stellen in der Algorithmusumgebung manchmal so eng zu sein...vor allem mit den Subindizes...daher baue ich das einfach ein! finde ich halt schöner so!^^

Besten Dank nochmal!!

:!: