我想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>}
其余的就是您情况下的用法(如果您有任何不清楚的地方,请随时询问)。