对于具有 >1 个参数的宏,其中第二个参数等有默认值但第一个参数没有默认值,正确的语法是什么?

对于具有 >1 个参数的宏,其中第二个参数等有默认值但第一个参数没有默认值,正确的语法是什么?

我正在处理的文档有一个带有 1 个参数的宏:

\newcommand{\emailTo}[1]{The email address that #1 is sent to.}

我必须添加另一个具有默认值的参数email address才能保持向后兼容。我试过:

\newcommand{\emailTo}2][][email address]{The #2 that #1 is sent to.}

但我收到了这个错误:

You can't use `macro parameter character #' in horizontal mode. ...\emailToNew}[2][qeee][email address] {The #

\documentclass[10pt,a4paper]{article}
\usepackage[utf8]{inputenc}

\newcommand{\emailTo}[1] {The email address that #1 is sent to.}

\newcommand{\emailToNew}[2][][email address] {The #2 that #1 is sent to.}

\begin{document}
    \emailTo{notification}
    
    \emailToNew{notification}%{email address}
\end{document}

有没有办法保持向后兼容,而不必更改使用 1 个参数的现有宏的数百个实例?

......

答案1

我不确定这是你要找的:

\documentclass[10pt,a4paper]{article}

\NewDocumentCommand{\emailTo}{mO{email address}}{%
  The #2 that #1 is sent to.
}

\begin{document}

\emailTo{somebody}

\emailTo{somebody}[parcel]

\end{document}

在此处输入图片描述

第一个参数是必需的,第二个参数是可选的,具有默认值email address

答案2

使用旧式的\newcommand,这可能是一种方法。

\documentclass[10pt,a4paper]{article}

\newcommand{\emailTo}[1]{\def\tmp{#1}\emailToAux}
\newcommand\emailToAux[1][email address]{%
  The #1 that \tmp{} is sent to.
}

\begin{document}

\emailTo{somebody}

\emailTo{somebody}[parcel]

\end{document}

在此处输入图片描述

答案3

所以你写道:

\newcommand{\emailTo}2][][email address]{The #2 that #1 is sent to.}

这非常接近您想要的结果,但您设法将括号移到了别处。您想将 放在2第一组括号内(其中还隐藏着一个随机的右括号)。

除了\newcommand,可选参数必须是第一的论点而不是第二个论点,所以你实际上想要写的是:

\newcommand{\emailTo}[2][email address]{The #1 that #2 is sent to.}

然后你会写

\emailTo[postal address]{the notice}

尽管如此,\newcommand它至少有点被弃用了,你应该更喜欢使用\NewDocumentCommand它。¹这为创建带有可选参数(以及其他东西)的命令提供了更大的灵活性²。在这种情况下,你可以写(你的选择)

\NewDocumentCommand{\emailTo}{O{email address} m}{The #1 that #2 is sent to.}

对于必需参数之前的可选参数或

\NewDocumentCommand{\emailTo}{m O{email address}}{The #2 that #1 is sent to.}

对于最后的可选参数。


  1. \newcommand在我的 LaTeX 书的边栏中提到了 et al.,但是关于创建新命令的主要讨论仅仅集中在\NewDocumentCommand

  2. 可以说,简单\NewDocumentCommand{\myverb}{v}{\texttt{#1}}其实是优越的到本机\verb命令。³

  3. 因为为什么?因为\myverb{\something}如果你的参数中没有不平衡的括号,它允许你这样写,并且如果你这样写,它会给出一个更容易理解的错误消息,例如,\section{\myverb+\foo+}等等。⁴

  4. 尽管\verb\foo\做了可以预见但令人惊讶的事情,但却\myverb\foo\给出了不正确的错误信息。⁵

  5. 大卫·卡莱尔 (David Carlisle),值得您深入研究的东西。⁶

  6. 我很确定是 DEK 决定不允许在脚注中添加脚注的真正原因(我只在滑铁卢剧本,一种在 VM/CMS 系统上运行的古老的文本格式化系统,在我开始使用 TeX 之前,我用它来在页面底部获取脚注。

相关内容