newcommand 中的可选参数

newcommand 中的可选参数

我已经发出命令

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

相关内容