Zu vielen Befehlen gibt es eine Sonderform, die durch ein * gekennzeichnet ist, wie zum Beispiel \chapter* und \section*. Diverse Pakete definieren auch *-Varianten, wie \caption* und \ref*.

Wir kann ich bewirken, dass das * ignoriert wird? Dies für den Fall, dass so ein *-Befehl implizit aufgerufen wird und ich daher den Aufruf nicht einfach editieren kann.

Beispielsweise führen Literaturverzeichnis, Nomenklatur und andere Verzeichnisse \section* oder \chapter* aus, wie kann ich den * abschalten, so dass es wie der originale Befehl \section* bzw. \chapter* ausgeführt wird, und ich nummerierte Gliederung erhalte? Im Sinne von \let\section*\section, nur geht dies ja nicht.

gefragt 28 Jun '13, 23:44

Helmut's gravatar image

Helmut
489161722
Akzeptiert-Rate: 100%

1

Damit würden dann aber Literaturverzeichnis usw. nummeriert werden, was ziemlich unüblich ist!

(01 Jul '13, 10:06) Herbert

Bevor man daran denkt, die Wirkung des Sterns aufzuheben, sollte man sich in der Anleitung der verwendeten Klassen und Pakete nachschauen, ob es nicht eine Möglichkeit gibt, statt der nicht nummerierten Überschriften, nummerierte zu verwenden. So bieten beispielsweise die KOMA-Script-Klassen Optionen, um Abbildungs- und Tabellenverzeichnis oder das Literaturverzeichnis zu nummerieren. Darüber hinaus gibt wird vielleicht auch eine Möglichkeit geboten, den Befehl zum Setzen der Überschrift umzudefinieren.

Wenn das nicht der Fall ist, bietet sich tatsächlich an, die entsprechende Anweisung kurzzeitig so umzudefinieren, dass die Sternvariante die Normalvariante verwendet. Neben der Methode, die Clemens – eher zur globalen Verwendung – beschrieben hat, kommt dafür auch ein weiterer Trick in Frage:

\documentclass{book}
\usepackage{blindtext}

\newcommand*{\deactivatestaronce}[1]{%
  \expandafter\def\expandafter#1\expandafter*\expandafter{%
    \expandafter\def\expandafter#1\expandafter{#1}#1}%
}

\begin{document}
\tableofcontents
\deactivatestaronce\chapter
\listoffigures
\blinddocument

\end{document}

Der Trick daran ist, dass die entsprechende Anweisung – im Beispiel \chapter – von \deactivatestaronce als Anweisung mit einem nicht vorhandenen begrenzten Argument definiert wird, wobei der Stern die Begrenzung darstellt. Das bedeutet, dass TeX bereits beim Lesen von \chapter den Stern wegwirft. Innerhalb der neuen Definition der Anweisung wird diese dann mit wiederum mit ihrer bisherigen Bedeutung definiert, wofür die vielen \expandafter notwendig sind. Zum Schluss wird dann die wiederhergestellte Anweisung aufgerufen.

Allerdings ist das oft nur die halbe Miete. Bei den Gliederungsbefehlen für Verzeichnisse wird nämlich oftmals noch ein \@mkboth, ein \markboth oder ein \markright ausgeführt, um einen Kolumnentitel zu erzeugen. Diese ist dann ohne Nummer. Im Beispiel bekäme so das Abbildungsverzeichnis ab der zweiten Seite den Kolumnentitel »LIST OF FIGURES« obwohl eigentlich »CHAPTER 1. LIST OF FIGURES« gewünscht wird. Dieses Problem wäre mit einer weiteren Anweisung zu lösen:

\documentclass{book}
\usepackage{blindtext}

\newcommand*{\deactivatestaronce}[1]{%
  \expandafter\def\expandafter#1\expandafter*\expandafter{%
    \expandafter\def\expandafter#1\expandafter{#1}#1}%
}

\begin{document}
\tableofcontents
\deactivatestaronce\chapter
\listoffigures
\chaptermark{\listfigurename}
\blinddocument

\end{document}

Allerdings erzeugt das nicht sowohl auf linken und rechten, sondern wie bei anderen Kapiteln auch nur auf linken Seiten einen Kolumnentitel. Es funktioniert in dieser Form auch nur für die \chapter-Ebene.

Wendet man ­– unsinniger Weise – den Befehl \deactivatestarone\chapter im Beispiel auch für \tableofcontents an, so ergibt sich als weiteres Problem, dass das Argument von \chapter* innerhalb von \tableofcontents bei der Klasse book nicht nur aus der Überschrift besteht. Es wird auch ein Aufruf von \@mkboth in dem Argument selbst getätigt. Das führt im Inhaltsverzeichnis zu einem verfälschten Eintrag, der einen weiteren Eingriff erforderlich macht:

\documentclass{book}
\usepackage{blindtext}

\newcommand*{\deactivatestaronce}[1]{%
  \expandafter\def\expandafter#1\expandafter*\expandafter{%
    \expandafter\def\expandafter#1\expandafter{#1}#1}%
}
\begin{document}
\deactivatestaronce\chapter
\makeatletter\let\@mkboth\@gobbletwo\makeatother
\tableofcontents
\makeatletter\let\@mkboth\markboth\makeatother
\deactivatestaronce\chapter
\listoffigures
\chaptermark{\listfigurename}
Page of \listfigurename.\clearpage% Nur zu Demozwecken
Page of \listfigurename.% Nur zu Demozwecken
\blinddocument

\end{document}

Sollte \@mkboth auch für \chaptermark verwendet werden, so wäre auch hier nach der Rückdefinition von \@mkboth ein \chaptermark{\contentsname} erforderlich.

Wie ich hier gezeigt habe, ist es also keineswegs immer damit getan, die Sternversion eines Befehls durch seine Normalform zu ersetzen. Vielmehr sind teilweise weitere Maßnahmen bezüglich des Befehlsarguments oder bezüglich des Kolumnentitels notwendig. Welche das sind, hängt nicht nur vom jeweiligen Befehl, sondern auch von Klassen und Paketen ab. Daher noch einmal der Hinweis, dass man unbedingt prüfen sollte, ob die jeweilige Klasse oder das jeweilige Paket bereits eine saubere Konfigurationsmöglichkeit für diesen Zweck bietet. Sollte das nicht der Fall sein, ist auch die Verwendung von Zusatzpaketen wie tocbibind in Erwägung zu ziehen. Das genannte Paket fügt beispielsweise für die Standklassen verschiedene Verzeichnisse in das Inhaltsverzeichnis ein.

Permanenter link

beantwortet 04 Jul '13, 13:13

saputello's gravatar image

saputello
11.1k174365
Akzeptiert-Rate: 51%

bearbeitet 08 Jul '13, 12:15

Sieht nach einer cleveren Lösung aus! Ich erhalte beim Testen jedoch einen merkwürdigen Inhaltsverzeichnis-Eintrag "1 ContentsCONTENTSCONTENTS 1".

(06 Jul '13, 15:56) Helmut

@Helmut Das liegt daran, dass beim Inhaltsverzeichnis eine \@mkboth-Anweisung im Argument von \chapter* steht und zeigt sehr schön, dass es nicht in jedem Fall genügt, die Sternform wie die Normalform zu behandeln, weil einfach das Argument, das für die Sternform verwendet wird, teilweise nicht geeignet ist oder auch das, was danach passiert.

(08 Jul '13, 11:38) saputello

Der Stern als Token wird in LaTeX als Teil des Befehlsnamens verstanden. Somit kommt dem Stern also nur eine symbolische Wirkung zu. Es könnte genauso ein + sein.

Der Test \@ifstar is auch genau so im LaTeX Kernel definiert:

\def\@ifstar#1{\@ifnextchar *{\@firstoftwo{#1}}}

Willst du die Eigenschaften eines Tokens ändern, so kannst du dessen \catcode ändern. Willst du beispielsweise, dass LaTeX alle * ignoriert, so kannst du das durch die Zuweisung des catcode 9 erreichen. Im nachstehenden Beispiel werden die Anweisungen \ActivateStar und DeactivateStar definiert, die genau diesen catcode-Wechsel durchführen.

\documentclass[]{article} 
\protected\edef\ActivateStar{%
  \catcode42 = \the\catcode42\relax%42 is the star: \number`\*
}
\protected\edef\DeactivateStar{%
  \catcode42 = 9\relax%catcode 9 token wird ignoriert
}
\begin{document}

\tableofcontents

\DeactivateStar

\section*{foo}

\ActivateStar

\section*{foo}
\end{document}

Durch die oben gezeigte Deklaration werden aber all Token * ignoriert. Somit führt die Eingabe L*T zu LT.


Allerdings noch eine Anmerkung. Wenn ein internes Makro die Sternvariante nutzt, hat es einen guten Grund. Es muss also immer darauf geachtet werden, was man erreichen bzw. ändern möchte.

Permanenter link

beantwortet 29 Jun '13, 13:21

Marco_D's gravatar image

Marco_D
43015
Akzeptiert-Rate: 36%

bearbeitet 29 Jun '13, 15:38

1

Ich würde DIESE Antwort niemandem empfehlen!

Grund: Wer nicht weiß, was catcode ist, was eine catcode-Änderung bewirkt, sollte die Finger davon lassen. @Marco Daniel: Die warnst ja selbst in der Antwort, dass alle *-Token verschluckt werden können, wenn man nicht aufpasst.

Besser ist es, wenn man das LaTeX-interne Makro @ifstar so umdefiniert, dass man einen neuen Schalter "activatestar" o.ä. einführt und wenn dieser aus ist, dann hat man das bisherige Verhalten. Wenn der Schalter an ist, dann wird ein evtl. vorhandener Stern gelesen, aber dennoch die "normale" Variante verwendet.

(30 Jun '13, 21:45) bernd
2

An eine Neu-Definition von \@ifstar hatte ich auch gedacht. Das würde allerdings für Befehle, die mit xparse definiert wurden, nicht funktionieren...

(30 Jun '13, 21:52) cgnieder

@Bernd: Natürlich ist die "Lösung" nicht für jedermann. \catcode, \edef und \protected sind auch nicht die gängigsten Befehle. Allerdings wollte ich eben auch diese Möglichkeit zeigen. Eigentlich müsste ich den letzten Satz meiner Antwort hervorheben, denn er ist die einzig wahre Antwort.

(01 Jul '13, 07:47) Marco_D

Schöne Lösung! Damit habe ich was gelernt und ich kann einen schnellen Workaround machen. Aufpassen muss man bei solchen Hacks natürlich.

(06 Jul '13, 15:58) Helmut

@Helmut: Bei dieser Lösung sind übrigens abhängig von der Klasse und dem Befehl, auf den man sie anwendet, dieselben Nebenwirkungen möglich, wie Du sie für meine Lösung erkannt hast und die ich sie inzwischen dargestellt habe.

(08 Jul '13, 12:10) saputello

Hier eine schnelle Version, die den Stern wirkungslos verschluckt. Allerdings produziert sie eine Doppelstern-Variante, die wie die originale Sternversion funktioniert:

\documentclass{article}

% @ in einen Buchstaben verwandeln
\makeatletter
% Speichere die Originalversion ab:
\let\origsection\section
% definiere \section neu, so dass mit und ohne Stern der Originalbefehl
% aufgerufen wird:
\renewcommand\section{\@ifstar{\origsection}{\origsection}}
% @ wieder in ein anderes Zeichen verwandeln:
\makeatother

\begin{document}

% nummeriert:
\section{Test}

% auch nummeriert:
\section*{Test}

% nicht nummeriert:
\section**{Test}

\end{document}
Permanenter link

beantwortet 29 Jun '13, 00:11

cgnieder's gravatar image

cgnieder
22.1k253463
Akzeptiert-Rate: 60%

Bei dieser Lösung sind übrigens abhängig von der Klasse und dem Befehl, auf den man sie anwendet, dieselben Nebenwirkungen möglich, wie sie Helmut für meine Lösung erkannt und ich sie inzwischen dargestellt habe.

(08 Jul '13, 12:09) saputello
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:

×52
×8

gestellte Frage: 28 Jun '13, 23:44

Frage wurde gesehen: 15,734 Mal

zuletzt geändert: 08 Jul '13, 12:15