PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Diverse Mathematiktheoreme und Algorithmen einheitlich nummerieren und referenzieren



frank
14-07-2010, 19:04
Hallo, liebe Leute!

Ich habe mehrere Fragen hauptsächlich die Pakete hyperref, ntheorem und algorithm betreffend.

Ich hoffe, es ist in Ordnung, wenn ich hier meine ganzen Probleme zusammenwerfe. Wenn nicht, gebt bitte Bescheid, dann werde ich die Nebensächlichkeiten in eigenen Threads auslagern. Hauptsächlich geht es jedenfalls um Nummerierung und Referenzierung.

Schaut euch bitte folgendes Beispiel an. Ist nicht gerade ein Minimalbeispiel, lässt sich aber kaum noch kürzen, wenn alle meine Probleme erfasst sein sollen.


\begin{filecontents}{literatur.bib}
@incollection{hasse1930,
author = {Helmut Hasse},
title = {{Arithmetische Theorie der kubischen Zahlkörper auf klassenkörpertheoretischer Grundlage}},
booktitle = {Mathematische Zeitschrift},
publisher = {Leon Lichtenstein},
year = {1930},
series = {31},
pages = {565–582}
}
\end{filecontents}

\documentclass[ngerman]{scrbook}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}

\usepackage[ngerman]{babel}
\usepackage{hyperref}
\hypersetup{colorlinks=false}
\usepackage{amsmath}
\usepackage{enumerate}
\usepackage[standard, thref, thmmarks]{ntheorem}

\usepackage{algorithmic}
\usepackage[Algorithmus]{algorithm}
\usepackage{listings}
\numberwithin{Satz}{chapter}

\begin{document}

\chapter{Grundlagen}
\section{Polynom- und Körperdiskriminanten}
\label{sec:disk}
\begin{Definition}
Die Diskrimiante von $f$ ist definiert als
\end{Definition}

\begin{Bemerkung}
Dies ist der Abschnitt „\autoref{sec:disk}“.
\end{Bemerkung}

\begin{Satz}
Sei $O$ eine Ordnung.
\begin{enumerate}[(i)]
\item Die Diskriminante ist $d(O)$.
\item $D(f)$ ist ein quadratisches Vielfaches\label{satz:quad_viel}.
\end{enumerate}
\end{Satz}

\begin{Beweis}
Sei
\begin{align}
D = df^2 \label{eq:equat}
\end{align}
\end{Beweis}

Siehe auch \cite{hasse1930} sowie \eqref{eq:equat}.
\begin{Satz}[Stickelbergerscher Diskriminantensatz]\label{satz:stickelberger}
Die Diskriminante $D$ eines algebraischen Zahlkörpers ist kongruent zu $0, 1 \mod 4$.
\end{Satz}

Die Fälle lauten wegen Theorem „\thref{satz:quad_viel}“:
\begin{enumerate}[a)]
\item $f = p$ \label{case:a}
\item $f = q$ \label{case:b}\\
und in diesem Falle darüber hinaus
\begin{enumerate}[\ref{case:b}$_1$)]
\item $d = 0$ \label{case:b1}
\item $d = 1$ \label{case:b2}
\end{enumerate}
\end{enumerate}

Im Falle \ref{case:b} muss einer der Fälle \ref{case:b1} oder \ref{case:b2} gegeben sein.
\begin{algorithm}
\caption{Anzahl nicht-isomorpher kubischer Zahlkörper}
\begin{algorithmic}
\REQUIRE $D \in Z$
\ENSURE Anzahl
\begin{description}
\item[1. Schritt]Prüfe \nameref{satz:stickelberger}\\
\IF{$D = 2, 3$}
\RETURN $0$
\ENDIF
\item[2. Schritt]Prüfe Hassebedingung\\
\STATE $d, f$
\begin{description}
\item[Schritt 2.1]Bestimmung der $\rho_i$
\STATE $\rho_i = 3$
\item[Schritt 2.2]Bestimmung der $e_k$
\IF{$d > 0$}
\STATE $e_k$ Grundeinheit von $O$
\ENDIF
\end{description}
\end{description}
\end{algorithmic}
\end{algorithm}

\appendix
\chapter{Programme}

\begin{lstlisting}[caption=NumberOfCubicFieldsWithDisc.k]
Prog := function(D)
return 0;
\end{lstlisting}

\listofalgorithms
\bibliography{literatur}
\bibliographystyle{alpha}
\end{document}

Ich möchte also die Theoreme Satz, Definition, Bemerkung, Lemma etc. benutzen. Die Nummerierung dieser soll kapitelweise zusammen mit Gleichungen und Algorithmen fortlaufen, also „Definition 1.1, Bemerkung 1.2, Satz 1.3, [Gleichung] (1.4), Satz 1.5, Algorithmus 1.6“. Zur Zeit ist die Nummerierung „1, 1, 1.1, (1.1), 1.2, 1“, also jeder für sich. Ich würde es noch hinkriegen, dass jeder für sich kapitelweise nummeriert (also 1.8 statt einfach nur 8), aber was ich nicht möchte, ist alle Theoreme neu zu definieren. Zum Beispiel per
\renewtheorem{Lemma}[Satz]{Lemma}damit Lemma den Zähler von Satz verwendet.

Das Problem ist nämlich, dass ich dann die ganze Formatierung auch neu machen müsste – Lemmas, Sätze und Korollars stehen z. B. anders als etwa Definitionen in Kursivschrift, andere Klassen von Theoremen sind wieder ganz anders. Bei Gleichungen weiß ich gar nicht, wie ich das hinkriege.

Und die Algorithmen sollen sich auch nahtlos in die Nummerierung einfügen, diese Umgebung kann man auch nicht ohne Weiteres neudefinieren, da sie noch von horizontalen Linien umschlossen wird und ich am Ende List of Algorithms verwenden möchte. Kann man all diese Zähler irgendwie direkt ansprechen und verändern?

Die Referenzierungen sind nicht einfacher. Hier würde ich gerne einen Befehl, der mir „Theoremtyp Nummer“ liefert, also automatisch z. B. „Lemma 3.5“. Mit \thref sollte das gehen, aber diese Funktion hat zusammen mit dem Paket hyperref irgendwie Probleme. (Die rot umrandeten Links, die beim Ausdrucken verschwinden, sollen genau so bleiben.)

Bei \nameref{satz:stickelberger} würde ich gerne „Stickelbergerscher Diskriminantensatz“ statt dem Namen des Abschnitts haben und \thref{satz:quad_viel} sollte idealerweise vollautomatisch „Satz 1.1, (ii)“ liefern.

Auch die Referenzierungen auf die Fälle a), b), b₁), b₂) klappen nicht perfekt, statt „b1“ hätte ich gerne „b₁)“, also genau so, wie es in der Aufzählung schon dargestellt wird.

Und dann noch ein paar andere Sachen:

Mit
pdflatex min
bibtex min
pdflatex min
pdflatex minerhält man eine schönes Literaturverzeichnis. Da ist aber noch etwas englisch drin! Nämlich „page 565–582“. Bei anderen Quellen ist das auch so, z. B. PhD thesis statt Doktorarbeit. Kann man das komplett deutsch machen?
Am Ende von Theoremen stehen kleine Vierecke, am Ende von Beweisen nichts – es soll genau andersherum sein!
Im Anhang soll statt „Listing A.1“ besser „Programm A.1“ stehen.


Und speziell zum Algorithmus:

Ich habe eigentlich einen sehr langen Algo, der mehr als eine Seite braucht. Wie kann man einen Seitenumbruch erlauben?
Die Nummerierung im Algo sollte auch besser automatisch sein, aber mit
\begin{enumerate}[1. Schritt]hatte ich Probleme, da dann mit fast jedem Zeilenumbruch automatisch ein neuer Schritt kommt, auch wenn item nicht gesetzt ist.


Ich habe schon viele Dokus gelesen, bin aber langsam am Ende meiner Fähigkeiten angelegt. Wäre sehr dankbar, wenn ihr noch ein paar Tipps hättet.

Gruß

Frank

lockstep
14-07-2010, 20:15
Hallo und willkommen im Forum! :)

Bei vielen deiner Fragen kann ich spontan nicht helfen - bei einigen schon.

Literaturverzeichnis in Deutsch: Lade zusätzlich das Paket bibgerm und ändere den Bibliographiestil von alpha auf geralpha. (Dadurch ändern sich manche Formatierungen, aber das Wesentliche - deutsche Bezeichnungen - wird erreicht.)

"Programm A.1" im Anhang: Füge Folgendes in die Präambel ein:



\renewcommand*{\lstlistingname}{Programm}


lockstep

lockstep
14-07-2010, 21:16
Ich möchte also die Theoreme Satz, Definition, Bemerkung, Lemma etc. benutzen. Die Nummerierung dieser soll kapitelweise zusammen mit Gleichungen und Algorithmen fortlaufen, also „Definition 1.1, Bemerkung 1.2, Satz 1.3, [Gleichung] (1.4), Satz 1.5, Algorithmus 1.6“.


Theoreme verschiedener Art gemeinsam zu nummerieren wird öfter gewünscht. Die gemeinsame Nummerierung aller Theoreme mit Gleichungen erscheint mir tendenziell verwirrend. Das zusätzliche Einbeziehen von Algorithmen ist sehr verwirrend, da diese Gleitobjekte die Nummerierung im Text durcheinanderbringen.



was ich nicht möchte, ist alle Theoreme neu zu definieren. [...]
Das Problem ist nämlich, dass ich dann die ganze Formatierung auch neu machen müsste – Lemmas, Sätze und Korollars stehen z. B. anders als etwa Definitionen in Kursivschrift, andere Klassen von Theoremen sind wieder ganz anders. Bei Gleichungen weiß ich gar nicht, wie ich das hinkriege.

Manche Arbeit muss man eben erledigen. Als Einstiegshilfe hier ein wenig Code, der die in deinem Beispiel verwendeten Theoremsorten an den Gleichungszähler koppelt und unter Beachtung der Originaldefinition von Kursiv- auf Normalschrift umschaltet.



\usepackage[standard,amsmath,thref,thmmarks]{ntheorem}
\renewtheorem{Satz}[equation]{Satz}
\theorembodyfont{\upshape}
\renewtheorem{Bemerkung}[equation]{Bemerkung}
\renewtheorem{Definition}[equation]{Definition}


(Die Option amsmath ist gemäß S. 14 der ntheorem-Doku beim Laden von amsmath erforderlich.)

Und hier der Code zum Einbeziehen von Algorithmen:



\makeatletter
\renewcommand{\c@algorithm}{\c@equation}
\renewcommand*{\thealgorithm}{\thechapter.\arabic{ algorithm}}
\makeatother


lockstep

frank
15-07-2010, 12:15
lockstep,

vielen Dank für deine bisherigen Antworten, das hat mir sehr geholfen! Die Probleme bibtex (deine Lösung habe ich schon mal probiert, habe da aber wohl was vergessen), qed-Symbol und „Listing → Programm“ sind gelöst.


Die gemeinsame Nummerierung aller Theoreme mit Gleichungen erscheint mir tendenziell verwirrend. Das zusätzliche Einbeziehen von Algorithmen ist sehr verwirrend, da diese Gleitobjekte die Nummerierung im Text durcheinanderbringen.

Das mit den Gleichungen vereinfacht die Orientierung – vor allem dann, wenn eine Zeit lang keine Theoreme kommen, was bei mir der Fall ist. Ist aber Ansichtssache.

Wenn ein Algorithmus wie ein Bild eingefügt wird (also Positionierung nicht klar festlegbar und automatisch bestimmt), würde hier so eine Nummerierung wohl tatsächlich keinen Sinn machen. Da bin ich noch am Überlegen, wie ich meine Algorithmen letztlich im Text einfüge, vielleicht doch alle zum Schluss. Aber so oder so bleibt das Problem, dass es eigentlich keine Gleitobjekte sein dürften und ein Seitenumbruch mitten im Algorithmus erlaubt sein muss. Meiner ist nämlich 1½ Seiten lang und ich möchte ihn auch nicht (etwa per Auslagerungen logischer Blöcke) kürzen.

Kann man den Trick, den du bei der Algo-Nummerierung angewendet hast, irgendwie auf die Theoreme übertragen, um sich die Neudefinition zu sparen?

Das auffälligste Problem, das jetzt noch bleibt, ist das mit autoref und thref, vielleicht weiß der eine oder andere ja Rat …

Frank

lockstep
15-07-2010, 21:00
Kann man den Trick, den du bei der Algo-Nummerierung angewendet hast, irgendwie auf die Theoreme übertragen, um sich die Neudefinition zu sparen?

Dumm von mir. Offenbar ja. :D



\makeatletter
\renewcommand{\c@Definition}{\c@equation}
\renewcommand*{\theDefinition}{\thechapter.\arabic {Definition}}
\renewcommand{\c@Bemerkung}{\c@equation}
\renewcommand*{\theBemerkung}{\thechapter.\arabic{ Bemerkung}}
\renewcommand{\c@Satz}{\c@equation}
\renewcommand*{\theSatz}{\thechapter.\arabic{Satz} }
\makeatother


lockstep

EDIT: Ich habe allerdings nicht überprüft, ob dieser Hack hyperref-verträglich ist.

lockstep
15-07-2010, 23:02
Das auffälligste Problem, das jetzt noch bleibt, ist das mit autoref und thref, vielleicht weiß der eine oder andere ja Rat …

Nach ein bisschen Herumprobieren kann ich dir tatsächlich eine Lösung liefern, die allerdings auch ein wenig Arbeit für dich bedeutet.

Das Paket cleveref hat eine mit \autoref vergleichbare Funktion - der Befehl \cref erzeugt Referenzen wie "Bemerkung 1", wobei der Referenztyp automatisch erkannt wird. cleveref arbeitet mit ntheorem zusammen. Nachteil: cleveref kennt zwar die deutschen Bezeichnungen diverser Theoremtypen, erwartet jedoch, dass der eigentliche Umgebungsname auf Englisch angegeben wird (z.B. \begin{remark} für eine Bemerkung). Du musst also entweder mittels \renewtheorem die englischen Umgebungsnamen um deutsche Bezeichnungen ergänzen (d.h. doch umdefinieren ;)) oder cleveref bei deutschen Umgebungsnamen beibringen, welche Bezeichnung (für Singular und Plural) es beifügen soll. Näheres siehe Beispiel.



\documentclass{article}

\usepackage[latin9]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}

\usepackage[standard]{ntheorem}
\theorembodyfont{\upshape}
\renewtheorem{remark}{Bemerkung}

\usepackage{hyperref}

\usepackage[ngerman]{cleveref}
\crefname{Satz}{Satz}{Sätze}

\begin{document}

\begin{remark}\label{rem:bla}
Eine Bemerkung.
\end{remark}

Siehe dazu \cref{rem:bla}.

\begin{Satz}\label{sat:ord}
Sei $O$ eine Ordnung.
\end{Satz}

Siehe dazu \cref{sat:ord}.

\end{document}


Siehe S. 104 der cleveref-Doku für die von cleveref standardmäßig erkannten (Theorem-)Typen.

lockstep

frank
17-07-2010, 17:05
Lockstep, du bist ein Gott!

Nein, es gibt zwischen cref und hyperref keine erkennbaren Probleme. An dieser Stelle möchte ich anmerken, dass die Benutzung des Paketes ntheorem mit der Option hyperref die beiden Pakete ntheorem und hyperref laut Dokumentation verträglich machen soll. Wie dem auch sei, das hat spontan bei mir nicht geklappt und ich kann sowieso das Paket cleveref nur jedem empfehlen, es bietet viele tolle Dinge.

Ich möchte nun die Lösung fast aller meiner Probleme darlegen:

Statt des Pakets enumerate empfiehlt sich enumitem. Dann kann man korrekt referenzieren, wenn man also ein Item mit der Nummer (iii) hat (römisch 3), wird es mit \cref auch als (iii) und nicht nur iii widergegeben. Dies löst auch das b₂)-Problem: Bei mehreren Hierarchien kann man mit enumi den Counter der höheren Ebene ansprechen.
Das mit den Nummerierungen der Theoreme und Gleichungen hat so geklappt.
cref macht’s auch super. Ich habe die Lösung gewählt, bei der ich die Theoreme nicht neudefinieren muss.
Definiert man Theoreme nicht neu, so hat man an deren Enden tatsächlich immer diese qed-Zeichen. Entfernen mit \renewcommand{\SatzSymbol}{} u. dgl.
Die Nummerierung im Algorithmus habe ich mit eigenen Countern realisiert.
„Satz 1.2, (ii)“ lässt sich einfach nicht mit einem Befehl realisieren. Es sind halt zwei geworden und das ist ok so.
Das Ausgeben des Titels eines Theorems („Stickelbergerscher Diskriminantensatz“) lass ich beiseite, ich brauche es nicht.


Abgesehen von den sehr simplen Problemen bibtex und „Listing → Programm“ ist in folgendem Quelltext noch einmal alles schön dargestellt:


\documentclass[ngerman]{scrbook}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}

\usepackage[ngerman]{babel}
\usepackage{hyperref}
\hypersetup{colorlinks=false}
\usepackage{amsmath}
\usepackage{enumitem}

\usepackage[standard,amsmath,thref,thmmarks]{ntheorem}

\usepackage{algorithmic}
\usepackage[Algorithmus]{algorithm}

\makeatletter
\renewcommand{\c@Definition}{\c@equation}
\numberwithin{Definition}{chapter}
\renewcommand{\c@Satz}{\c@equation}
\numberwithin{Satz}{chapter}
\renewcommand{\c@algorithm}{\c@equation}
\numberwithin{algorithm}{chapter}
\makeatother

\usepackage{cleveref}
\crefname{Satz}{Satz}{Sätze}
\crefname{Definition}{Definition}{Definitionen}

\renewcommand{\SatzSymbol}{}
\renewcommand{\DefinitionSymbol}{}

\newcounter{algocounter}[algorithm]
\newcommand{\algostep}{\refstepcounter{algocounter }\item[Schritt \thealgocounter]}
\newcounter{algosubcounter}[algocounter]
\newcommand{\algosubstep}{\refstepcounter{algosubc ounter}\item[Schritt \thealgocounter.\thealgosubcounter]}

\begin{document}

\chapter{Grundlagen}
\section{Polynom- und Körperdiskriminanten}
\label{sec:disk}
\begin{Definition}
Die Diskrimiante von $f$ ist definiert als
\end{Definition}

\begin{Satz}\label{satz:ord}
Sei $O$ eine Ordnung.
\begin{enumerate}[label=(\roman*)]
\item Die Diskriminante ist $d(O)$.
\item $D(f)$ ist ein quadratisches Vielfaches\label{item:quad_viel}.
\end{enumerate}
\end{Satz}

\begin{Beweis}
Sei
\begin{align}
D = df^2 \label{eq:equat}
\end{align}
\end{Beweis}

Dies ist „\cref{sec:disk}“, siehe Gleichung \eqref{eq:equat}.

\begin{Satz}[Stickelbergerscher Diskriminantensatz]\label{satz:stickelberger}
Die Diskriminante $D$ eines algebraischen Zahlkörpers ist kongruent zu $0, 1 \mod 4$.
\end{Satz}

Die Fälle lauten wegen \cref{satz:ord}, \ref{item:quad_viel}:
\begin{enumerate}[label=\alph*)]
\item $f = p$ \label{case:a}
\item $f = q$ \label{case:b} und in diesem Falle darüber hinaus
\begin{enumerate}[label=\alph{enumi}$_{\arabic*}$)]
\item $d = 0$ \label{case:b1}
\item $d = 1$ \label{case:b2}
\end{enumerate}
\end{enumerate}

Im Falle \ref{case:b} muss einer der Fälle \ref{case:b1} oder \ref{case:b2} gegeben sein.


\begin{algorithm}
\caption{Anzahl nicht-isomorpher kubischer Zahlkörper}
\begin{algorithmic}
\REQUIRE $D \in Z$
\ENSURE Anzahl
\begin{description}
\algostep Prüfe \cref{satz:stickelberger}\\
\IF{$D = 2, 3$}
\RETURN $0$
\ENDIF
\algostep Prüfe Hassebedingung\\
\STATE $d, f$
\begin{description}
\algosubstep Bestimmung der $\rho_i$
\STATE $\rho_i = 3$
\algosubstep Bestimmung der $e_k$
\IF{$d > 0$}
\STATE $e_k$ Grundeinheit von $O$
\ENDIF
\end{description}
\end{description}
\end{algorithmic}
\end{algorithm}

\end{document}

Nochmals vielen Dank für deine Hilfe, lockstep.

Was nun noch bleibt, ist, dass ich eine Algorithmusumgebung haben möchte, die einen Seitenumbruch erlaubt. Da dies thematisch nicht mehr in diesen Thread (siehe Überschrift) passt, verweise ich dafür auf den eigens neueröffneten Thread http://www.mrunix.de/forums/showthread.php?p=316857 und erkläre diesen für „geschlossen“ bzw. „gelöst“.

Frank

Freak5
03-09-2010, 14:07
Alles was mit
\usepackage{algorithmic}
\usepackage[Algorithmus]{algorithm}
zusammenhing hat bei mir nur Fehler geworfen (no space for new counter oder so).
Aber der Rest hat sehr geholfen.

Dass jetzt statt einzelnen Nummern wie 1, 2, 3 dort 2 nummern stehen, macht LaTeX automatisch, wenn man es auf die Chapter basiert, es ist also kein extra Befehl dafür verwendet.

Und wie hast du die Kusivschrift unterdrückt? Ich brauch nämlich noch eine Lemma und Beispiel Umgebung. Wenn das andere schon normal aussieht, sollte gerade das dann nicht kursiv hervorgehoben sein.

Edit: Bei Lemma erbt man scheinbar das, was vorher schon gesetzt wurde. Man überschreibt es mit diesen Befehlen
\theoremstyle{plain}
\theorembodyfont{\upshape}
\renewtheorem{Lemma}{Lemma}
\renewcommand{\c@Lemma}{\c@equation}

Ganz nette Ansätze gibt es auch hier http://matheplanet.com/default3.html?call=viewtopic.php?topic=103838&ref=http%3A%2F%2Fwww.google.de%2Fsearch%3Fq%3Dlate x%2Btheorem%2Bnummerierung%26rlz%3D
Jetzt bin ich wieder drin in LaTeX, denk ich.