オプションの引数 ( など\chapter
) を取るコマンドのラッパーを定義する適切な方法は何ですか? クローンではなくラッパーのことです。これにより、ラッパーであるコマンドに干渉することなく、ラッパーにコードを挿入できるようになります。
これが私のやり方です。もっと良い方法はありますか?(条件節はegregに負っています)ここ。
\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
それをクローンするので、\mychapter
へのラッパーにはなりません\chapter
。
答え1
はい、もっと良い方法があります:
\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
}
これは、次の 3 つの呼び出しすべてをサポートします。
\mychapter*{Title}
\mychapter{Title}
\mychapter[Short title]{Long title}
答え2
の伝統的より柔軟なソリューションを許可する前に、オプションの引数をチェックし、他のコードをラッパーに組み込むという方法xparse
もあります。\@ifnextchar[
[
inject
スター付きバージョンも含まれており、現在も使用できます。その後、これをどうする[]
かは OP が決めます;-)[]
\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}