Listing- und Algorithmenverzeichnis zusammenführen Thema ist als GELÖST markiert

Inhalt, Abbildungen, Tabellen, Quellcodes und andere Verzeichnisse


Fenrix
Forum-Anfänger
Forum-Anfänger
Beiträge: 19
Registriert: Sa 9. Mai 2020, 13:45

Listing- und Algorithmenverzeichnis zusammenführen

Beitrag von Fenrix »

Hallo zusammen,

ich möchte gerne meine Algorithmen in das Listingverzeichnis aufnehmen. Dazu folgendes Minimalbeispiel:
\documentclass[a4paper,12pt, oneside]{scrbook}

\usepackage[chapter]{algorithm}
\usepackage{algpseudocode, algorithmicx, listing}



\begin{document}
	
	\chapter{Testkapitel}
	
	\begin{algorithm}
		\caption{ABC}
		\begin{algorithmic}
			\Procedure{processRequest}{$request$}
			
			\State $p\gets someLogic()$
			\If {$request.featureA$}
			\State $result\gets calcA(p)$
			\EndIf
			\State \Return{$result$}
			\EndProcedure
		\end{algorithmic}
	\end{algorithm}

	\begin{listing}
		\caption{DEF}
		Hier steht in echt ein Minted-Codeschnipsel
	\end{listing}

	
	\listoflistings
	
	\listofalgorithms
\end{document}
Dabei sollten Algorithmen und Listings den gleichen Zähler nutzen, sodass kein Algorithmus die gleiche Nummer hat wie ein Listing.

Vllt. kann mir jemand einen Tipp geben, wie ich das bewerkstelligen kann.

VG

Gast.

Re: Listing- und Algorithmenverzeichnis zusammenführen

Beitrag von Gast. »

Das geht zwar, indem man sowohl die Hilfsdatei als auch den Zähler als auch die Befehle für die Ausgabe der Verzeichniseinträge von algorithm auf diejenigen von listing umbiegt:
\documentclass[a4paper,12pt, oneside]{scrbook}

\usepackage[chapter]{algorithm}
\usepackage{algpseudocode, algorithmicx, listing}
\makeatletter
\renewcommand*{\ext@algorithm}{lol}
\let\c@algorithm\c@listing
\let\l@algorithm\l@listing
\makeatother

\begin{document}
	
	\chapter{Testkapitel}
	
	\begin{algorithm}
		\caption{ABC}
		\begin{algorithmic}
			\Procedure{processRequest}{$request$}
			
			\State $p\gets someLogic()$
			\If {$request.featureA$}
			\State $result\gets calcA(p)$
			\EndIf
			\State \Return{$result$}
			\EndProcedure
		\end{algorithmic}
	\end{algorithm}

	\begin{listing}
		\caption{DEF}
		Hier steht in echt ein Minted-Codeschnipsel
	\end{listing}

	
	\listoflistings
	
\end{document}
Wie man sieht, passt aber die Darstellung der Algorithmen überhaupt nicht zu der Darstellung aller anderen Floats. Ich würde mir daher überlegen, auf die Umgebung algorithm zu verzichten und stattdessen lieber mit \DeclareNewTOC (siehe KOMA-Script-Anleitung) eine neue Gleitumgebung für Algorithmen definieren. AFAIK hat Markus Kohm das auch irgendwann einmal, möglicherweise auf der KOMA-Script-Seite oder sogar hier auf goLaTeX, gezeigt.

BTW: Das Paket listing passt auch nicht gut zu KOMA-Script. Das sieht man, sobald man mehr als eine Seite im Listings-Verzeichnis hat. Dann hat man nämlich Versalsatz im Kolumnentitel. Das Paket ist auch gnadenlos alt. Bist du sicher, dass du nicht listings oder minted verwenden willst? Wenn man sieht, wie wenig das Paket listing im Vergleich tut, könnte man auch diese Umgebung direkt mit \DeclareNewTOC definieren. Und dann stellt sich natürlich die Frage, warum man nicht gleich dieselbe Umgebung für Listings und Algorithmen verwendet, wenn diese ohnehin einen gemeinsamen Zähler und ein gemeinsames Verzeichnis verwenden:
\documentclass[a4paper,12pt, oneside]{scrbook}
\usepackage[ngerman]{babel}

\usepackage{algpseudocode, algorithmicx}
\DeclareNewTOC[
  float,
  name=listing,
  type=listing,
  listname=Verzeichnis der Listings und Algorithmen,
]{lol}

\begin{document}
	
	\chapter{Testkapitel}
	
	\begin{listing}
		\captionabove{ABC}
		\begin{algorithmic}
			\Procedure{processRequest}{$request$}
			
			\State $p\gets someLogic()$
			\If {$request.featureA$}
			\State $result\gets calcA(p)$
			\EndIf
			\State \Return{$result$}
			\EndProcedure
		\end{algorithmic}
	\end{listing}

	\begin{listing}
		\captionabove{DEF}
		Hier steht in echt ein Minted-Codeschnipsel
	\end{listing}
	
	\listoflistings
	
\end{document}

Fenrix
Forum-Anfänger
Forum-Anfänger
Beiträge: 19
Registriert: Sa 9. Mai 2020, 13:45

Re: Listing- und Algorithmenverzeichnis zusammenführen

Beitrag von Fenrix »

Danke für die Hilfe, das sieht schon sehr gut aus!

Tatsächlich nutze ich für alle meine Code-Ausschnitte minted. Um den minted-Listings eine Caption hinzufügen, hatte ich damals dieses Beispiel gesehen: https://de.overleaf.com/learn/latex/Code_Highlighting_with_minted#Captions.2C_labels_and_the_list_of_listings
Dort wurde die listing-Umgebung verwendet, deshalb hatte ich das so übernommen.

Das mit dem DeclareNewTOC gucke ich mir nochmal genauer an. Evtl. lassen sich im Falle der Algorithmen da noch die Striche über und unter dem Algorithmus hinzufügen, die gefallen mir ganz gut. :D

Rueben Ase

Re: Listing- und Algorithmenverzeichnis zusammenführen

Beitrag von Rueben Ase »

minted hat eine eingebaute listing-Umgebung, die wahlweise auf dem Paket float oder dem Paket newfloat basiert (das zweite würde ich bevorzugen). Man benötigt dafür also das Paket listing nicht und sollte es auch nicht zusammen mit minted verwenden. Leider bietet das Paket keine Möglichkeit, stattdessen das von den KOMA-Script-Klassen verwendete tocbasic oder eine bereits definierte Umgebung zu verwenden. Die mit newfloat oder notfalls mit float definierte Umgebung kann aber ebenso für Algorithmen verwendet werden, wie das im zweiten Beispiel mit der dort per \DeclareNewTOC definierten Umgebung gezeigt wurde:
\documentclass[a4paper,12pt, oneside]{scrbook}
\usepackage[ngerman]{babel}

\usepackage{algpseudocode, algorithmicx}
\usepackage[frozencache,newfloat]{minted}% Option frozencache, damit es im Online-Compiler läuft.
%\DeclareNewTOC[  float,
%  name=listing,
%  type=listing,
%  listname=Verzeichnis der Listings und Algorithmen,
%]{lol}

\begin{document}
	
	\chapter{Testkapitel}
	
	\begin{listing}
		\captionabove{ABC}
		\begin{algorithmic}
			\Procedure{processRequest}{$request$}
			
			\State $p\gets someLogic()$
			\If {$request.featureA$}
			\State $result\gets calcA(p)$
			\EndIf
			\State \Return{$result$}
			\EndProcedure
		\end{algorithmic}
	\end{listing}

	\begin{listing}
		\captionabove{DEF}
		Hier steht in echt ein Minted-Codeschnipsel
	\end{listing}
	
	\listoflistings
	
\end{document}
Zusammen mit dem Paket caption ist es sogar per Option möglich, die Algorithmen trotzdem als "Algorithmus" zu benennen:
\documentclass[a4paper,12pt, oneside]{scrbook}
\usepackage[ngerman]{babel}

\usepackage{algpseudocode, algorithmicx}
\usepackage[frozencache,newfloat]{minted}
\usepackage{caption}
%\DeclareNewTOC[  float,
%  name=listing,
%  type=listing,
%  listname=Verzeichnis der Listings und Algorithmen,
%]{lol}

\begin{document}
	
	\chapter{Testkapitel}
	
	\begin{listing}
	    \captionsetup{name=Algorithmus}
		\captionabove{ABC}
		\begin{algorithmic}
			\Procedure{processRequest}{$request$}
			
			\State $p\gets someLogic()$
			\If {$request.featureA$}
			\State $result\gets calcA(p)$
			\EndIf
			\State \Return{$result$}
			\EndProcedure
		\end{algorithmic}
	\end{listing}

	\begin{listing}
		\captionabove{DEF}
		Hier steht in echt ein Minted-Codeschnipsel
	\end{listing}
	
	\listoflistings
	
\end{document}
Man kann das aber auch etwas mehr low-level lösen:
\documentclass[a4paper,12pt, oneside]{scrbook}
\usepackage[ngerman]{babel}

\usepackage{algpseudocode, algorithmicx}
\usepackage[frozencache,newfloat]{minted}
%\DeclareNewTOC[  float,
%  name=listing,
%  type=listing,
%  listname=Verzeichnis der Listings und Algorithmen,
%]{lol}

\begin{document}
	
	\chapter{Testkapitel}
	
	\begin{listing}
	    \renewcommand{\listingname}{Algorithmus}
		\captionabove{ABC}
		\begin{algorithmic}
			\Procedure{processRequest}{$request$}
			
			\State $p\gets someLogic()$
			\If {$request.featureA$}
			\State $result\gets calcA(p)$
			\EndIf
			\State \Return{$result$}
			\EndProcedure
		\end{algorithmic}
	\end{listing}

	\begin{listing}
		\captionabove{DEF}
		Hier steht in echt ein Minted-Codeschnipsel
	\end{listing}
	
	\listoflistings
	
\end{document}
BTW: Bist du sicher, dass du ein einseitiges Buch und nicht einfach scrreprt statt scrbook haben willst? Buch und einseitig passt eigentlich nicht zusammen.

Fenrix
Forum-Anfänger
Forum-Anfänger
Beiträge: 19
Registriert: Sa 9. Mai 2020, 13:45

Re: Listing- und Algorithmenverzeichnis zusammenführen

Beitrag von Fenrix »

Danke, die listing-Umgebung von minted sowohl für die Code-Listings, als auch die Algorithmen zu verwenden, scheint mir am einfachsten. Das werde ich mal so übernehmen :)

Was das scrbook betrifft, nutze ich das vor allem wegen der \frontmatter, \mainmatter und \backmatter Kommandos.
Gibt es neben den Abständen noch relevante Unterschiede zwischen scrreprt und scrbook, die einen Wechsel ratsam machen würden?

Rueben Ase

Re: Listing- und Algorithmenverzeichnis zusammenführen

Beitrag von Rueben Ase »

Fenrix hat geschrieben:
Di 25. Jan 2022, 13:08
Was das scrbook betrifft, nutze ich das vor allem wegen der \frontmatter, \mainmatter und \backmatter Kommandos.
Das ist IMHO durchaus ein legitimer Grund, wenn man einen guten Grund für die römischen Seitenzahlen hat: → Römische Seitenzahlen im Vorderteil (und im Endteil)? Ich habe ja auch nur gefragt, ob du sicher bist. Option a4paper ist aber unabhängig davon bei allen KOMA-Script-Klassen die Voreinstellung.
Fenrix hat geschrieben:
Di 25. Jan 2022, 13:08
Gibt es neben den Abständen noch relevante Unterschiede zwischen scrreprt und scrbook, die einen Wechsel ratsam machen würden?
Welche Abstände meinst du? Sind bei scrreprt und scrbook irgendwelche Abstände unterschiedlich? Wusste ich gar nicht.

Fenrix
Forum-Anfänger
Forum-Anfänger
Beiträge: 19
Registriert: Sa 9. Mai 2020, 13:45

Re: Listing- und Algorithmenverzeichnis zusammenführen

Beitrag von Fenrix »

Danke für den Hinweis, das war mir so nicht bewusst. Evtl. kann ich mir die römische Nummerierung tatsächlich sparen, ich guck da nochmal in die Vorgaben meines Fachbereichs, ob ich da was finde :)

Das mit den Abständen hatte ich hier gelesen (https://www.mrunix.de/forums/showthread.php?68450-Diplomarbeit-in-scrreprt-oder-scrbook), aber das scheint nicht wirklich zu stimmen, wie ich im weiteren Verlauf jetzt auch noch gelesen hatte. Konnte ich beim Testen auch nicht feststellen.

Antworten