Fortlaufende Nummerierung mit enumitem über theorems hinaus

Schriftbild, Absätze und Auflistungen einstellen


icybolt
Forum-Newbie
Forum-Newbie
Beiträge: 2
Registriert: Mo 29. Mär 2010, 13:53
Wohnort: Bayern
Kontaktdaten:

Fortlaufende Nummerierung mit enumitem über theorems hinaus

Beitrag von icybolt »

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

Benutzeravatar
KOMA
TeX-Entwickler
TeX-Entwickler
Beiträge: 2958
Registriert: Fr 4. Jul 2008, 17:28
Kontaktdaten:

Beitrag von KOMA »

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

icybolt
Forum-Newbie
Forum-Newbie
Beiträge: 2
Registriert: Mo 29. Mär 2010, 13:53
Wohnort: Bayern
Kontaktdaten:

Beitrag von icybolt »

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

Benutzeravatar
KOMA
TeX-Entwickler
TeX-Entwickler
Beiträge: 2958
Registriert: Fr 4. Jul 2008, 17:28
Kontaktdaten:

Beitrag von KOMA »

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.

Antworten