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