Wie definiert man einen Wrapper für einen Befehl, der ein optionales Argument annimmt?

Wie definiert man einen Wrapper für einen Befehl, der ein optionales Argument annimmt?

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\chapterwird es klonen, es wird also \mychapterkein 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, xparsedie flexiblere Lösungen ermöglicht, besteht darin, \@ifnextchar[zu prüfen, ob [das optionale Argument vorhanden ist und injectanderer 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}

verwandte Informationen