带有和不带有可选参数的不同命令定义呈现不正确

带有和不带有可选参数的不同命令定义呈现不正确

我使用了给出的答案这个问题(尤其,这个答案由 egreg 编写,代码如下:

\documentclass{article}

\makeatletter
\def\ifemptyarg#1{%
  \if\relax\detokenize{#1}\relax % H. Oberdiek
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi}
\makeatother

\newcommand{\InfinityCircle}[1][]{%
    \ifemptyarg{#1}
        {S^1_\infty}%
        {S^1_\infty\left(#1\right)}%
}

\begin{document}
\begin{enumerate}
    \item Correct: $\InfinityCircle$
    \item Incorrect: $\InfinityCircle{\lambda}$
    \item What (2) should be: $\InfinityCircle(\lambda)$
\end{enumerate}
\end{document}

然而,正如输出中提到的,该命令不是相当正确,因为它似乎忽略了其定义中的括号:

在此处输入图片描述

遗憾的是,我对后端了解不够,不知道为什么会发生这种情况或如何修复它。有人能帮我得到想要的输出和/或展示一种更适合我想要完成的任务的替代方法吗?笔记:真的如果可能的话,希望有一种方法可以避免加载任何包。

答案1

好吧,命令检查是否为空参数,在这种情况下,空参数是可选参数,应该以 而\InfinityCircle[\lambda]不是 的形式给出\InfinityCircle{\lambda}

如果给出了可选项,则的命令定义\newcommand{\foo}[1][]将只给出一个非空参数。但是仍然是空的。[...][]

在我看来,在 之后应该有一些负空间,\infty或者直接使用(...)来代替\left(...\right)

\documentclass{article}

\makeatletter
\def\ifemptyarg#1{%
  \if\relax\detokenize{#1}\relax % H. Oberdiek
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi}
\makeatother

\newcommand{\InfinityCircle}[1][]{%
  \ifemptyarg{#1}
        {S^1_\infty}%
        {S^1_\infty\left(#1\right)}%
}

\begin{document}
\begin{enumerate}
    \item Correct: $\InfinityCircle$
    \item Incorrect: $\InfinityCircle[\lambda]$
    \item What (2) should be: $\InfinityCircle(\lambda)$
\end{enumerate}
\end{document}

在此处输入图片描述

更新没有可选参数的版本

\documentclass{article}


\makeatletter
\def\ifemptyarg#1{%
  \if\relax\detokenize{#1}\relax % H. Oberdiek
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi}
\makeatother

\newcommand{\InfinityCircle}[1][]{%
  \ifemptyarg{#1}{S^1_{\infty}}%
        {S^1_{\infty}\left(#1\right)}%
}

\newcommand{\OtherInfinityCircle}[1]{%
  \ifemptyarg{#1}{S^1_{\infty}}%
        {S^1_{\infty}\left(#1\right)}%
}


\begin{document}
\begin{enumerate}
    \item Correct: $\InfinityCircle$
    \item Correct: $\InfinityCircle[\lambda]$
    \item Also correct: $\OtherInfinityCircle{}$
    \item Also correct: $\OtherInfinityCircle{\lambda}$
\end{enumerate}
\end{document}

更新 - 带有可选{}分隔符的错误命令/编码样式 - 参数在前面;-)

\documentclass{article}

\usepackage{xparse}

\NewDocumentCommand{\InfinityCircle}{g}{%
  \IfValueTF{#1}{%
    S^1_{\infty}\left(#1\right)%
  }{%
    S^1_{\infty}%
  }%
}


\begin{document}
\begin{enumerate}
    \item Correct: $\InfinityCircle$
    \item Correct: $\InfinityCircle{\lambda}$
\end{enumerate}
\end{document}

相关内容