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, 11:22

welle's gravatar image

welle
10642431
Akzeptiert: 100%

bearbeitet 20 Mär '15, 12:31

saputello's gravatar image

saputello
18.4k22352


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, 11:51

saputello's gravatar image

saputello
18.4k22352

bearbeitet 13 Sep, 12:18

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

(20 Mär '15, 12:24) welle
Deine Antwort auf die Frage (nicht auf andere Antworten)
Knebel-Vorschau

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

Per RSS:

Antworten

Antworten und Kommentare

Aktuelle Buch-Infos

LaTeX Cookbook

LaTeX Beginners Guide

Limitierter Rabatt ebook
50% Coupon code tDRet6Y

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üge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×73
×45

Frage gestellt: 20 Mär '15, 11:22

Frage wurde angeschaut: 2,023 Mal

Zuletzt aktualisiert: 13 Sep, 12:18