Fortlaufende Nummerierung mit enumitem über theorems hinaus

Antwort erstellen


Diese Frage dient dazu, das automatisierte Versenden von Formularen durch Spam-Bots zu verhindern.
Smilies
:D :) :( :o :shock: :? 8) :lol: :-x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:

BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smilies sind eingeschaltet

Die letzten Beiträge des Themas

Ich habe die Datenschutzerklärung gelesen und bin damit einverstanden.

   

Wenn du eine Datei oder mehrere Dateien anhängen möchtest, gib die Details unten ein.

Ansicht erweitern Die letzten Beiträge des Themas: Fortlaufende Nummerierung mit enumitem über theorems hinaus

von KOMA » Mo 29. Mär 2010, 16:57

Da hierbei nicht nur eine interne Anweisung von enumitem verwendet, sondern komplett umdefiniert wird, sollte man direkt nach \makeatletter noch ein
\CheckCommand*{\enit@endenumerate}{%
  \enit@after
  \endlist
  \enit@toks\expandafter{\enit@savekeys}%
  \xdef\enit@afterlist{%
    \def\expandafter\noexpand
      \csname enit@savekeys@\@currenvir\endcsname{\the\enit@toks}%
    \def\expandafter\noexpand
      \csname enit@resume@\@currenvir\endcsname{%
      \csname c@\@listctr\endcsname
      \the\csname c@\@listctr\endcsname}}%
  \aftergroup\enit@afterlist}
ergänzen. Sollte diese Anweisung in enumitem dann irgendwann einmal geändert werden, bekommt man wenigstens eine Warnung der Art:
LaTeX Warning: Command \enit@endenumerate  has changed.
               Check if current package is valid.
Ich finde es immer wieder erschreckend, wie oft interne Anweisungen ohne jede Absicherung umdefiniert werden. Solche Umdefinierungen werden dann regelmäßig von Hand zu Hand weitergegeben. Immer wieder tauchen bei mir im Support solche Umdefinierungen auf, die längst nicht mehr auf aktuellem Code beruhen und teilweise erhebliche Probleme verursachen.

von icybolt » Mo 29. Mär 2010, 16:25

Habe bereits eine Lösung für das Problem gefunden und auch wenn sie nicht von mir stammt, möchte ich sie hier kurz Posten:
\makeatletter
\def\enit@endenumerate{%
  \enit@after
  \endlist
  \enit@toks\expandafter{\enit@savekeys}%
  \xdef\enit@afterlist{%
    \def\expandafter\noexpand
      \csname enit@savekeys@\@currenvir\endcsname{\the\enit@toks}%
    \global\def\expandafter\noexpand
      \csname enit@resume@\@currenvir\endcsname{%
      \csname c@\@listctr\endcsname
      \the\csname c@\@listctr\endcsname}}%
  \aftergroup\enit@afterlist}
\makeatother
Danke trotzdem für die schnelle Antwort.
Frank

von KOMA » Mo 29. Mär 2010, 16:05

Das Problem ist, dass nicht das Paket den Zähler zurücksetzt, sondern die Anweisung, die vom Paket für die Fortsetzung definiert wird, das Ende der Bsp-Umgebung nicht überlegt. Ein Umgebungsende ist nun einmal auch immer ein Gruppen-Ende. Gruppen-Enden überleben aber nur globale Makros.

Die einzige schnelle Lösung, die mir für dieses Problem einfällt, wäre
\makeatletter
\g@addto@macro\endbsp{%
  \global\let\enit@resume@enumarabic\enit@resume@enumarabic
}
\makeatother
nach der Definition von bsp. Allerdings darf man dann keinesfalls bsp innerhalb von enumarabic verwenden. Weitere Nebenwirkungen sind nicht ausgeschlossen!

Vielleicht ein wenig besser wäre (ungetestet):
\makeatletter
\g@addto@macro\endbsp{%
  \global\let\global@enit@resume@enumarabic\enit@resume@enumarabic
  \aftergroup\let\aftergroup\enit@resume@enumarabic\aftergroup\global@enit@resume@enumarabic
}
\makeatother

Fortlaufende Nummerierung mit enumitem über theorems hinaus

von icybolt » Mo 29. Mär 2010, 14:00

Hallo,

vielleicht kann mir hier der eine oder andere weiterhelfen. Ich stehe vor folgendem Problem: Das Packet enumitem verfügt ja über die Möglichkeit, mittels dem "resume" Befehl an vorhergehende Nummerierungen anzuschließen. Das funktioniert mit meinen selbsgebauten Aufzählungsumgebungen auch wunderbar, solange ich mich innerhalb eines "Theorems" befinde. Darüber hinaus scheint es sich die Nummerierung nicht zu merken. Hier mein Minimalbeispiel:

%Mein Minimalbeispiel:
\documentclass[10pt]{scrbook}
%
%Mathematische Symbolik, etc.
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{amsthm}
%
%Meine Aufzählungsumgebungen
\usepackage{enumitem}
\newlist{enumarabic}{enumerate}{2}
\setlist[enumarabic,1]{label=\arabic*.)}
\setlist[enumarabic,2]{label=\arabic*.)}
%
%Meine Theorems
\theoremstyle{plain}
\newtheorem{lem}{Lemma}
\theoremstyle{definition}
\newtheorem*{bsp}{Beispiel}
%
\begin{document}
%
\begin{bsp} Hier schreibe ich einige Beispiele
\begin{enumarabic}
	\item Hier funktioniert noch alles wunderbar.
	\item Hier funktioniert noch alles wunderbar.
\end{enumarabic}
In meinem Beispiel schreibe ich hier ein wenig Text hinein.
\begin{enumarabic}[resume]
	\item Hier funktioniert noch alles wunderbar. Ich schließe an die vorhergehende Nummerierung an.
\end{enumarabic}
\end{bsp}
%
Mein Beispiel ist zu Ende. Es folgt ein Lemma:
\begin{lem} Mein schönes Lemma.
\end{lem}
%
Anschließend kommen noch ein paar Beispiele:
\begin{bsp}~
\begin{enumarabic}[resume]
	\item Hier sollte die Nummerierung aus dem obigen Beispiel-Block übernommen werden. Trotz des resume-Befehls fängt die Nummerierung hier von neuem an. Schade.
\end{enumarabic}
\end{bsp}
%
\end{document}

Kann man dem Paket "enumitem" irgendwie sagen, dass es innerhalb von "theorems" nicht den counter zurücksetzen soll?

Vielen Dank für eure Hilfe,
Frank

Nach oben