Ich habe enumerate und itemize-Listen. Manchmal möchte ich für jeden Aufruf von \item einen vordefinierten Code ausführen lassen. Das kann Farbe oder Schrift betreffen, oder einen eigenen mitlaufenden Zähler bei itemize erhöhen. Also ich möchte eigenen Code global definieren und "einhaken"

  • direkt vor jedem \item
  • direkt nach \item, also am Beginn des folgenden Stichpunkts

Zum Beispiel bei der Anwendung, dass ich bei längeren Listen stets ein \needspace einfüge, um einzeln stehende Zeilen zu vermeiden:

Open in writeLaTeX
\documentclass{scrartcl}
\usepackage[ngerman]{babel}
\usepackage{blindtext}
\usepackage{forloop}
\newcounter{items}
\usepackage{needspace}
\begin{document}
\begin{enumerate}
  \forloop{items}{1}{\value{items} < 10}
    {\needspace{2\baselineskip}\item \blindtext}
\end{enumerate}
\end{document}

Ohne \needspace sähe das Seitenende nämlich so aus:

Seitenumbruch in enumerate

Zum Testen habe ich das in einer forloop-Schleife geschrieben. In einem realen Text mit zig items müsste ich es ja zigmal schreiben. Wie kann ich das einmal für alle items vorgeben?

gefragt 24 Feb '14, 19:41

Student's gravatar image

Student
5807779104
Akzeptiert-Rate: 82%


Vorab der Hinweis von @Clemens: \item wird auch an versteckten Stellen aufgerufen, zum Beispiel der {center} und der {quote} Umgebung ... Änderungen an \item können deshalb unerwartete und unerwünschte Folgen haben.

Du könntest das Paket etoolbox verwenden und dann \preto\item{<code>} nutzen. Dann wird <code> immer unmittelbar vor \item ausgeführt. Um die Wirkung dieser Änderung zu beschränken, kann man sie mit dem Paket enumitem nur für die {enumerate} Umgebung vornehmen oder sich eine neue Umgebung definieren. Innerhalb dieser gilt aber weiter obige Warnung.

Open in writeLaTeX
\documentclass{scrartcl}
\usepackage[ngerman]{babel}
\usepackage{blindtext}
\usepackage{forloop}
\newcounter{items}
\usepackage{needspace}

\usepackage{etoolbox}
\usepackage{enumitem}
\setlist[enumerate]{before=\preto\item{\needspace{2\baselineskip}}}

\begin{document}
\begin{enumerate}
  \forloop{items}{1}{\value{items} < 10}
    {\item \blindtext}
\end{enumerate}
\end{document}
Permanenter link

beantwortet 25 Feb '14, 20:33

esdd's gravatar image

esdd
17.8k284257
Akzeptiert-Rate: 62%

bearbeitet 26 Feb '14, 01:30

1

Ich weiß nicht, ob ich das empfehlen würde: \item wird nämlich auch an versteckten Plätzen aufgerufen, z.B. der {center}- und der {quote}-Umgebung... das muss man zumindest wissen, bevor man das macht. Sollte das auf {enumerate} beschränkt bleiben, wäre es wohl besser, eine neue Umgebung dafür zu definieren. (Meine Vermutung ist ja, dass enumitem für die meisten Anpassungen, die man sich so wünschen kann, passende Optionen bereitstellt.)

(25 Feb '14, 20:52) cgnieder

@esdd und @Clemens Danke! Auch für die Warnung. Dann versuche ich, das lokal zu halten. Wenn sich was als empfehlenswerter zeigen sollte, hab ich auf jeden Fall was gelernt!

(25 Feb '14, 21:12) Student

Parameter wie \clubpenalty und \widowpenalty verhindern die einzeln stehenden Zeilen global und nicht nur bei Listen.

Streiche in deinem Code »needspace« und das dazu gehörige \needspace{2\baselineskip}, setze sowohl \clubpenalty=\maxdimen als auch \widowpenalty=\maxdimen in den Vorspann.

Open in writeLaTeX
\documentclass{scrartcl}
\usepackage[ngerman]{babel}
\usepackage{blindtext}
\usepackage{forloop}
\newcounter{items}
\clubpenalty=\maxdimen
\widowpenalty=\maxdimen
\begin{document}
\begin{enumerate}
  \forloop{items}{1}{\value{items} < 10}
    {\item \blindtext}
\end{enumerate}
\end{document}
Permanenter link

beantwortet 25 Feb '14, 21:25

Thorsten's gravatar image

Thorsten
1.6k325
Akzeptiert-Rate: 58%

bearbeitet 26 Feb '14, 01:43

esdd's gravatar image

esdd
17.8k284257

Siehe auch das Paket nowidow.

(28 Feb '14, 20:10) Speravir
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×21
×21
×17
×16

gestellte Frage: 24 Feb '14, 19:41

Frage wurde gesehen: 15,438 Mal

zuletzt geändert: 28 Feb '14, 20:10