我已经发出命令
\newcommand{\mysec}[2]{%
\textbf{#1} \\ #2
}
我把它和 一起使用\mysec{A}{B}
。
但有时我也想要第三个参数。我可以为需要 3 个参数的情况创建一个全新的命令。但我想是否可以在原始命令中使用可选参数来处理它?
所以我必须检查第三个参数是否设置了,以及如果设置了如何打印。
答案1
可选参数在[]
not{}
和 if using 中\newcommand
始终位于第一位。
所以
\newcommand{\mysec}[3][]{%
\textbf{#2} \\ #3 #1%
}
允许
\mysec{aaa}{bbb}
或者
\mysec[ccc]{aaa}{bbb}
答案2
我建议使用xparse
并\RenewDocumentCommand
提供更简单的方法来定义带有可选参数的宏
参数规范表示如果需要,somo
使用带星号的 ( #1
)、可选的 ( #2
)、必需的 ( #3
) 和最后的可选参数 ( )。#4
重新定义分段命令时应谨慎,因为它们提供了星号变体,例如用作\tableofcontents
“标题”
而不需要\@ifnextchar[
用它来询问是否使用了\IfValueTF{#2}{true}{#4}
可选参数。#2
\documentclass{article}
\usepackage{xcolor}
\usepackage{xparse}
\let\origsection\section
\RenewDocumentCommand{\section}{somo}{%
\IfBooleanTF{#1}{%
\origsection*{#3}%
\IfValueTF{#4}{%
\textcolor{red}{You used the starred version and the 4th optional argument: }\textcolor{violet}{#4}%
}{%
% \textcolor{blue}{You used the starred version but omitted the 4th one}%
}
}{%
\IfValueTF{#2}{%
\origsection[#2]{#3}
\IfValueTF{#4}{%
\textcolor{red}{You used the optional 2nd and 4th. arguments: }\textcolor{violet}{#4}%
}{%
\textcolor{blue}{You used the optional 2nd argument but omitted the optional 4th one}%
}
}{%
\origsection{#3}
\IfValueTF{#4}{%
\textcolor{red}{You used the optional 4th. argument: }\textcolor{violet}{#4}%
}{%
\textcolor{blue}{You omitted the optional argument}
}
}%
}%
}
\begin{document}
\tableofcontents
\section*{Starred section}[With an optional argument]
\section{A section}
\section[Another section]{Another section with useless long title}
\section[Another section]{Another section with useless long title}[And again with an optional argument]
\section{A section}[With optional arg]
\end{document}
答案3
如果您确实希望最后一个是可选的,那么请使用 TeX 级别作为新命令:
\documentclass{article}
\makeatletter
\def\mysec#1#2{\@ifnextchar[{\mysec@i{#1}{#2}}{\mysec@i{#1}{#2}[]}}%
\def\mysec@i#1#2[#3]{%
\textbf{#1} \\ #2
\ifx\relax#3\relax \else \\ #3 \fi}% or whatever you want to do with #3
\makeatother
\begin{document}
\mysec{foo}{bar}
\mysec{foo}{bar}[baz]
\end{document}