선택적 인수를 사용하는 명령에 래퍼를 정의하는 방법은 무엇입니까?

선택적 인수를 사용하는 명령에 래퍼를 정의하는 방법은 무엇입니까?

선택적 인수(예: )를 사용하는 명령에 래퍼를 정의하는 적절한 방법은 무엇입니까 \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
}

이는 세 가지 호출을 모두 지원합니다.

\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}

관련 정보