オプションの引数を取るコマンドにラッパーを定義するにはどうすればよいでしょうか?

オプションの引数を取るコマンドにラッパーを定義するにはどうすればよいでしょうか?

オプションの引数 ( など\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}

関連情報