带有可选参数和 ifthenelse 的 Newcommand

带有可选参数和 ifthenelse 的 Newcommand

我想comp使用“ifthenelse”定义一个带有两个参数的新命令,其中第二个(也是最后一个)参数是可选的。我试过:

\newcommand{\comp}[2]{%
  \ifthenelse{\isempty{#2}}%
    {{#1}^{c}}% if #2 is empty
    {#2 \backslash #1}% if #2 is not empty
}

\comp{Y}{X}给予的Y\X不是X\Y想要的,\comp{Y}给出的不是想要的Y\结果。Y^c

答案1

可选参数通常首先设置,并用括号[]而不是大括号指定{}

在您的代码中,如果您输入$\comp{Y}=Z$,第二个参数将被视为=,这是因为 TeX 如何确定命令的参数是什么。事实上,使用

\newcommand{\comp}[2]{...}

必需的论点有两个。

在我看来,可选参数应该是第一个,所以你读

\comp[X]{Y}        \comp{Y}

作为“X”或“的补语“ 分别。

如何定义?

\usepackage{xifthen}

\newcommand{\comp}[2][]{\ifthenelse{\isempty{#1}}{#2^c}{#1\setminus#2}}

或者

\usepackage{xparse}

\NewDocumentCommand{\comp}{om}{\IfNoValue{#1}{#2^c}{#1\setminus#2}}

答案2

下面是一个替代版本,用于检查第一个参数后面的代码是否以左括号开头{。如果是,则将其视为第二个参数,否则假定只给出了一个参数。但是,由于这会使代码的可读性和可维护性降低,因此我并不推荐使用它。

该实现\@ifnextchar在抓取第一个参数后使用来测试以下字符,然后切换到两个实现中的任一个\comp@single\comp@double

\documentclass{article}

\makeatletter

\newcommand\comp[1]{%
    \@ifnextchar\bgroup{\comp@double{#1}}{\comp@single{#1}}%
}
\newcommand\comp@single[1]{%
    {{#1}^{c}}%
}
\newcommand\comp@double[2]{%
    {#2 \backslash #1}%
}

\makeatother

\begin{document}

$\comp{Y}{X}$\par
$\comp{Y}$

\end{document}

输出

在此处输入图片描述

答案3

没有包装的答案ifthen

\documentclass[10pt,a4paper]{article}
\newcommand{\comp}[2][]{%
\def\FirstArg{#1}
  \ifx\FirstArg\empty
    \ensuremath{{#2}^{c}}% if #1 is empty
    \else
    \ensuremath{#2 \backslash #1}% if #2 is not empty
  \fi
}
\begin{document}

$X\backslash Y$=\comp[Y]{X}

${Y}^{C}$=\comp{Y}
\end{document}

答案是ifthen

\documentclass[10pt,a4paper]{article}
\usepackage{ifthen}
\newcommand{\comp}[2][]{%
  \ifthenelse{\equal{#1}{}}
    {\ensuremath{{#2}^{c}}}% if #1 is empty
    {\ensuremath{#2 \backslash #1}}% if #2 is not empty
}
\begin{document}

$X\backslash Y$=\comp[Y]{X}

${Y}^{C}$=\comp{Y}
\end{document}

解释:

命令具有定义数量的参数。如果参数是必需的(比如说 4 个),则必须按如下方式定义它:

\newcommand{\mycommand}[4]{<Do things>}

如果它有一个可选参数{就像你的情况一样}它必须是第一个并且(如果有 3 个强制参数和一个可选参数)你必须像这样定义它:

\newcommand{\mycommand}[4][<First Argument Default Value>]{<Do things>}

其余的就是您情况下的用法(如果您有任何不清楚的地方,请随时询问)。

相关内容