3
1

In meinem zweiseitigen Dokument (scrbook) sollen Teile-Überschriften immer auf rechten Seiten ausgegeben werden. Für die darauf folgenden Kapitel soll dagegen open=any gelten. Erreichen kann ich das mit

Open in Online-Editor
% siehe http://www.komascript.de/comment/4904#comment-4904
\usepackage{xpatch}
\xpretocmd{\part}{\KOMAoptions{open=right}}{}{}
\xpretocmd{\addpart}{\KOMAoptions{open=right}}{}{}
\renewcommand*\partheademptypage{\KOMAoptions{open=any}}

Wenn ich aber versuche die Umstellung auf open=any durch

Open in Online-Editor
\xapptocmd{\part}{\KOMAoptions{open=any}}{}{}
\xapptocmd{\addpart}{\KOMAoptions{open=any}}{}{}

statt über die Umdefinition von \partheademtypage vorzunehmen, bekomme ich nicht das gewünschte Ergebnisses, aber dafür einige Fehlermeldungen. Mich interessiert jetzt, warum \xapptocmd{\part}{\KOMAoptions{open=any}}{}{} im Gegensatz zu \xpretocmd{\part}{\KOMAoptions{open=right}}{}{} nicht funktioniert.

Code:

Open in Online-Editor
\documentclass[10pt]{scrbook}
% siehe http://www.komascript.de/comment/4904#comment-4904
\usepackage{xpatch}
\xpretocmd{\part}{\KOMAoptions{open=right}}{}{}
\xpretocmd{\addpart}{\KOMAoptions{open=right}}{}{}
%\renewcommand*\partheademptypage{\KOMAoptions{open=any}}% funktioniert
%
\xapptocmd{\part}{\KOMAoptions{open=any}}{}{}% funktioniert nicht
\xapptocmd{\addpart}{\KOMAoptions{open=any}}{}{}% funktioniert nicht
%

\usepackage{lipsum}
\begin{document}
\frontmatter
\title{test}
\author{test}
\maketitle
\tableofcontents

\mainmatter
\part{Teil 1}
\addchap{Kapitel 1}
\lipsum[1]
\chapter{Kapitel 2}
\lipsum[1]
\addpart{Teil 2}
\addchap{Nicht nummeriertes Kapitel}
\lipsum[1-5]
\end{document}

gefragt 20 Mär '15, 16:22

welle's gravatar image

welle
106222631
Akzeptiert-Rate: 0%

bearbeitet 20 Mär '15, 17:31

saputello's gravatar image

saputello
11.1k154365


Bei Befehlen mit Argument funktioniert das Anhängen von Code an den Befehl nur, wenn der Befehl sein Argument selbst liest. Wird das Argument hingegen von einem Unterbefehl gelesen, so wird der angehängte Code stattdessen ganz oder teilweise zum Argument. Beispiel:

Open in Online-Editor
\documentclass{article}
\usepackage{xpatch}
\newcommand*{\textformatierung}{\textbf}
\xapptocmd{\textformatierung}{+++}{}{}
\begin{document}
\textformatierung{Der Text soll fett werden.}
\end{document}

Erzeugt kein fettes »Der Text soll fett werden.« gefolgt von drei Pluszeichen, sondern nur ein fettes »+« gefolgt von zwei nicht fetten »+«, gefolgt von einem nicht fetten »Der Text soll fett werden.«. Sieht man sich die aus dem \xapptocmd resultierende Definition mit Hilfe von \show\textformatierung an, wird auch klar, woran das liegt:

> \textformatierung=macro: ->\textbf +++.

Demnach ist \textformatierung jetzt wie

Open in Online-Editor
\newcommand*{\textformatierung}{\textbf+++}

definiert, was auch genau der Spezifikation von \xpatchcmd entspricht. Damit ist »{Der Text soll fett werden.}« nicht einmal mehr ein Argument von \textbf (oder \textformatierung), sondern einfach nur eine Gruppe mit dem Text als Inhalt.

Bei \part ist es sogar noch etwas komplizierter. Diese Anweisung muss noch vor dem Lesen des ersten Arguments testen, ob ein Stern folgt, was prinzipiell so geschieht:

Open in Online-Editor
\newcommand*{\part}{\@ifstar {\@spart}{\@part}}

Hängt man hier mit \xpatchcmd Code an, dann prüft \@ifstar nicht mehr, ob nach \part ein Stern folgt, sondern ob das erste Token dieses angehängten Codes ein Stern ist, bevor es die weiteren Token des angehängten Codes teilweise als Argument von \@spart oder \@part verwendet.

Da man ohne Kenntnisse der Definition eines Befehls nie wissen kann, ob er seine Argumente selbst auswertet oder nicht, muss man mit diesem Problem grundsätzlich rechnen. Bei Befehlen, die eine Sternform besitzen, gibt es das Problem grundsätzlich.

Bei \xpretocmd kann ein solches Problem dagegen nie auftreten.

Dasselbe Problem betrifft übrigens auch \apptocmd von etoolbox und ähnliche Befehle.

Permanenter link

beantwortet 20 Mär '15, 16:51

saputello's gravatar image

saputello
11.1k154365
Akzeptiert-Rate: 51%

bearbeitet 13 Sep '16, 18:18

@saputello Danke für die tolle Erklärung :-)

(20 Mär '15, 17:24) welle
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:

×130
×52

gestellte Frage: 20 Mär '15, 16:22

Frage wurde gesehen: 8,250 Mal

zuletzt geändert: 13 Sep '16, 18:18