unerwünschte Leerzeilen im Algorithmus

Formelsatz für Mathematik, Naturwissenschaften und Technik


Sarahmaus

unerwünschte Leerzeilen im Algorithmus

Beitrag von Sarahmaus »

Guten Tag!

Ich habe das Problem, dass ich an einigen Stellen in meinen Algorithmen unerwünschte Leerzeilen habe, in der Regel bei Verschachtelungen. In folgendem Beispiel bekomme ich eine Leerzeile zwischen "if a then" und "if b then". Das sieht aus meiner Sicht nicht sehr schön aus.
\documentclass[11pt, a4paper, twoside, openright,chapterprefix]{scrbook} 

\usepackage[T1]{fontenc}
\usepackage{algorithmic} 
 \usepackage{algorithm} 
 
 \begin{document}     

 \begin{algorithm}[H]
\caption{ein Algorithmus}
\begin{algorithmic}[1]
\REQUIRE bla
\ENSURE blubb
\IF{a}
  \STATE{
    \IF{b}
    \STATE{tu was}
    \ENDIF
  }
\ENDIF
\end{algorithmic}
\end{algorithm}


\end{document}    

Epllus
Forum-Guru
Forum-Guru
Beiträge: 470
Registriert: So 23. Sep 2012, 17:31

Beitrag von Epllus »

Das liegt an der einen \STATE Anweisung. Wenn du diese auskommentierst, verschwindet die Leerzeile:
\documentclass[11pt, a4paper, twoside, openright,chapterprefix]{scrbook} 

\usepackage[T1]{fontenc} 
\usepackage{algorithmic} 
 \usepackage{algorithm} 
  
 \begin{document}     

 \begin{algorithm}[H] 
\caption{ein Algorithmus} 
\begin{algorithmic}[1] 
\REQUIRE bla 
\ENSURE blubb 
\IF{a} 
%  \STATE{ 
    \IF{b} 
    \STATE tu was
    \ENDIF 
%  } 
\ENDIF 
\end{algorithmic} 
\end{algorithm} 

\end{document}    
Hoffe es hilft

PS. STATE braucht keine Klammern.

Sarahmaus

Beitrag von Sarahmaus »

vielen Dank!!!

Sarahmaus

neues Problem

Beitrag von Sarahmaus »

Leider löst es das bei mir nur an einigen Stellen. Es scheint wohl auch etwas mit den von mir eingebundenen Paketen zu tun zu haben. Im Moment entstehen noch Leerzeilen, wenn in Verschachtelungen ein Befehl genau zwei Zeilen lang ist.

Hier ein Beispiel:
\documentclass[11pt, a4paper, twoside, openright,chapterprefix]{scrbook} 
\usepackage[utf8]{inputenc} %dto.
\usepackage[
    colorlinks=true,
    linkcolor=black,
    citecolor=black,
    filecolor=black,
    urlcolor=black,
    pdfpagelabels, 
    pdfstartview={FitH},
    pdfstartpage= 1
           ]{hyperref}
 \usepackage{algorithmic} 
 \usepackage{algorithm} 
 
 \begin{document}     

 \begin{algorithm}[H]
\caption{ein Algorithmus}
\begin{algorithmic}[1]
\REQUIRE bla
\ENSURE blubb
 \IF{a}
  \WHILE{b}
    \STATE ein Befehl, der exakt zwei Zeilen lang ist bbbbbbbbbbbbb bbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb aaaaaabc
      \STATE tu was
  \ENDWHILE
\ENDIF
\end{algorithmic}
\end{algorithm}


\end{document}    

Noch so einer

Beitrag von Noch so einer »

hyperref muss an verschiedenen Stellen in LaTeX eingreifen, um die entsprechenden Informationen unterzubringen. Das ist leider nicht transparent möglich. Da Du die Links ohnehin alle versteckst, dem Leser also ohnehin nicht bewusst ist, dass er irgendwo klicken kann, kannst Du hyperref einfach weglassen:
\documentclass[11pt, a4paper, twoside, openright,chapterprefix]{scrbook}
\usepackage{selinput}
\SelectInputMappings{
  adieresis={ä},
  germandbls={ß},
}
 \usepackage{algorithmic}
 \usepackage{algorithm}
 
 \begin{document}    

 \begin{algorithm}[H]
\caption{ein Algorithmus}
\begin{algorithmic}[1]
\REQUIRE bla
\ENSURE blubb
 \IF{a}
  \WHILE{b}
    \STATE ein Befehl, der exakt zwei Zeilen lang ist bbbbbbbbbbbbb bbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb aaaaaabc
      \STATE tu was
  \ENDWHILE
\ENDIF
\end{algorithmic}
\end{algorithm}


\end{document}
Wenn Du doch einmal ein Dokument mit Links, die der Anwender auch erkennt, erstellen willst, dann musst Du ggf. unerwünschte Leerzeichen durch Zeilenenden in Algorithmen auskommentieren:
\documentclass[11pt, a4paper, twoside, openright,chapterprefix]{scrbook}
\usepackage{selinput}
\SelectInputMappings{
  adieresis={ä},
  germandbls={ß},
}
\usepackage{algorithmic}
\usepackage{algorithm}
\usepackage[pdfborderstyle={/S/U/W 1}]{hyperref}
 
\begin{document}    

\begin{algorithm}[H]
\caption{ein Algorithmus}
\begin{algorithmic}[1]
\REQUIRE bla
\ENSURE blubb
 \IF{a}
  \WHILE{b}
    \STATE ein Befehl, der exakt zwei Zeilen lang ist bbbbbbbbbbbbb bbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb aaaaaabc%
      \STATE tu was
  \ENDWHILE
\ENDIF
\end{algorithmic}
\end{algorithm}


\end{document}
Übrigens passt der Stil von Algorithmen mit algorithm nicht gut zum Stil der Gleitumgebungen von scrbook. Ich würde mir daher überlegen, ob es nicht besser wäre, eine entsprechende Gleitumgebung oder nicht gleitende Umgebung mit KOMA-Script zu definieren und stattdessen zu verwenden, beispielsweise:
\documentclass[11pt, a4paper, twoside, openright,headings=chapterprefix]{scrbook}
\usepackage{selinput}
\SelectInputMappings{
  adieresis={ä},
  germandbls={ß},
}
\usepackage[ngerman]{babel}
\usepackage{algorithmic}
\usepackage[pdfborderstyle={/S/U/W 1}]{hyperref}
\DeclareNewTOC[
  counterwithin=chapter,
  float,
  listname={Verzeichnis der Algorithmen},
  name={Algorithmus},
  type=algorithm
]{alg}

\usepackage{blindtext}

\begin{document}    

\tableofcontents
\listofalgorithms

\chapter{Test}

\blindtext

\begin{flushleft}
\captionaboveof{algorithm}{ein Algorithmus}\nopagebreak
\begin{algorithmic}[1]
\REQUIRE bla
\ENSURE blubb
 \IF{a}
  \WHILE{b}
    \STATE ein Befehl, der exakt zwei Zeilen lang ist bbbbbbbbbbbbb bbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb aaaaaabc%
      \STATE tu was
  \ENDWHILE
\ENDIF
\end{algorithmic}
\end{flushleft}

\end{document}
Wobei sich das Problem in diesem Beispiel bereits durch Verwendung der flushleft-Umgebung gelöst hat. Algorithmen im Blocksatz zu setzen, fand ich nicht der Weisheit letzter Schluss.

BTW: Ich habe auch gleich die veraltete Option entsprechend der zugehörigen Warnung korrigiert. Solltest Du auch machen und künftig auf solche Warnungen achten!

Antworten