Wie definiert man richtig einen Wrapper für einen Befehl, der ein optionales Argument (wie z. B. \chapter
) annimmt? Ich meine einen Wrapper, keinen Klon, sodass wir Code in den Wrapper einfügen können, ohne den Befehl zu verändern, für den er ein Wrapper ist.
So mache ich es. Gibt es eine bessere Möglichkeit, das zu tun? (Den Konditionalsatz verdanke ich egregHier.)
\documentclass{book}
\newcommand\mychapter[2][] {\if\relax\detokenize{#1}\relax
\chapter{#2}
\else
\chapter[#1]{#2}
\fi}
\begin{document}
\tableofcontents
\mychapter[Short title]{Long title}
\end{document}
let\mychapter\chapter
wird es klonen, es wird also \mychapter
kein Wrapper für sein \chapter
.
Antwort1
Ja, es gibt einen besseren Weg:
\usepackage{xparse}
\NewDocumentCommand{\mychapter}{som}{%
%%% things to do before \chapter
\IfBooleanTF{#1}
{\chapter*{#3}}
{\IfNoValueTF{#2}{\chapter{#3}}{\chapter[#2]{#3}}%
%%% things to do after \chapter
}
Dies unterstützt alle drei Aufrufe:
\mychapter*{Title}
\mychapter{Title}
\mychapter[Short title]{Long title}
Antwort2
DertraditionellEine Möglichkeit, xparse
die flexiblere Lösungen ermöglicht, besteht darin, \@ifnextchar[
zu prüfen, ob [
das optionale Argument vorhanden ist und inject
anderer Code in den Wrapper eingefügt wird.
Die mit einem Sternchen versehene Version ist ebenfalls enthalten und kann []
auch ein „Jetzt“ haben – es liegt am OP, zu entscheiden, was []
dann damit geschehen soll ;-)
\documentclass{book}
\newcommand\mychapter[2][]{\if\relax\detokenize{#1}%
\chapter{#2}
\else
\chapter[#1]{#2}
\fi}
\makeatletter
\newcommand{\myotherchapter@@opt}[2][]{%
\chapter[#1]{#2}%
}
\newcommand{\myotherchapter@@noopt}[1]{%
\chapter{#1}%
}
\newcommand{\myotherchapter@@starredopt}[2][]{%
% Decide yourself what to do with #1 ;-)
\chapter*{#2}
}
\newcommand{\myotherchapter@@starrednoopt}[1]{%
\myotherchapter@@starredopt[#1]{#1}%
}
\newcommand{\myotherchapterstarred}{%
\@ifnextchar[{\myotherchapter@@starredopt}{\myotherchapter@@starrednoopt}%
}
\newcommand{\myotherchapterunstarred}{%
\@ifnextchar[{\myotherchapter@@opt}{\myotherchapter@@noopt}%
}
\newcommand{\myotherchapter}{%
\@ifstar{\myotherchapterstarred}{\myotherchapterunstarred}%
}
\makeatother
\begin{document}
\tableofcontents
\mychapter[Short title]{Long title}
\myotherchapter{First}
\myotherchapter[Short Title]{Long title}
\myotherchapter*[Starred Short Title]{Starred Long title}
\myotherchapter*{Starred Long title}
\end{document}