2010-05-25 92 views
17

我用我自己的命令和环境试验,现在我面对的这些问题: newcommand/ newenvironment - 可选参数

  1. 如何创建命令\foo{parameter}[optional]或环境调用\begin{bar}{parameter}[optional]
  2. 如何创建命令\foo[optional_1]...[optional_n]{parameter}

我已经试过

\newcommand{\foo}[3][][]{#1#2#3} - failed 
\newcommand{\foo}[3][2][][]{#1#2#3} - failed 

有谁知道一些暗示?非常感谢。

回答

12

使用xparse包(的LaTeX3发展努力的一部分):

\usepackage{xparse} 
\NewDocumentCommand\foo{O{}O{}m}{% 
    % Code with optional #1 and #2 with empty defaults 
} 
\NewDocumentCommand\foo{mO{}}{% 
    % Code with optional #2 with empty default 
} 
\NewDocumentEnvironment{foo}{O{}}{% 
% Start code with optional #1 
}{% 
% End code with optional #1 
} 

可选参数是xparse与\ newcommand有点不同。您可以检测一个人是否给出与否:

\NewDocumentCommand\foo{mo}{% 
    \IfNoValueTF{#2} 
    {Code without #2} 
    {Code with #2}% 
} 

你会看到,这个作品用小写的“o”,而大写字母“O”则需要一个默认值(我已经通过包含一个空组来使其变空)。

+1

我很抱歉迟到的回复,我没有时间去尝试。 非常感谢我用多个参数来解决我的问题 – Crowley 2010-06-03 11:10:19

+0

我从来没有见过这个软件包 - 这真的很酷! – 2010-06-03 17:35:37

15
  1. 您不能简单地创建\foo{parameter}[optional]命令;你可以,但是,创建

    \newcommand{\foo}[2][def]{Mandatory: #2; optional: #1} 
    

    如果你把它作为\foo{given},它会产生一个Mandatory: given, optional: def命令\foo[optional]{parameter};如果您将其称为\foo[optional]{given},则会生成Mandatory: given, optional: optional。这可能是你应该如何做的—,它会看起来比其他LaTeX代码更好。创建具有可选参数的新环境与

    \newenvironment{env}[2][def]{(#1,#2)\begingroup}{\endgroup} 
    

    其中#再次是可选的参数同样完成的;这再次写为\begin{env}[opt]{req}...\end{env}。如果你真的想要另一种形式的命令,请参阅我的答案的结尾。

  2. TeX常见问题有关于使用more than one optional argument编写命令的答案。如何做到这一点有两种选择。其基本思想是定义一个接受可选参数的命令,然后运行另一个本身带有可选参数的命令等。 twoopt包封装了这个。


如果你真的\reversed{mandatory}[optional]的命令,你可以像这样。首先,你需要定义一个需要参数的命令,将其存储在宏中,然后将其转发到另一个命令上。第二个命令采用可选参数,并使用已定义的命令和可选参数。把这个都在一起,我们得到

\makeatletter 
\newcommand{\reversed}[1]{\def\[email protected]{#1}\[email protected]} 
\newcommand{\[email protected]}[1][def]{Required: \[email protected]; optional: #1} 
\makeatother 

然后可以使用\reversed{mandatory}[optional]或只是\reversed{mandatory},一切都应该工作。

+2

+1不错的总结。一个特别的问题是如果宏使用不正确,可选的参数被省略:“\ reversed [optarg]”。错误消息的代码可读性差:值得测试的是\ reversed @ opt等于“[”,并将其标记为致命错误(如果是)。 – 2010-05-26 08:31:42

+1

谢谢。我不确定我想要检查的是什么'[' - 你确实会表现出意外,但它确实有一个完美定义好的行为(打印'必需:[;可选:def',然后排版'OPTARG]')。我会给出的*实际*建议是“不要使用这种技术” - 虽然技术上可行,但这可能是一个坏主意。 – 2010-05-26 09:08:49

+0

非常感谢您花费在这个问题上的时间。 – Crowley 2010-06-03 11:09:49

4

请考虑xargs包。以下是其文档中的一个示例。

设置它在通常的方式,

\usepackage{xargs} 

,然后如果你定义

\newcommandx*\coord[3][1=1, 3=n]{(#2_{#1},\ldots,#2_{#3})} 

(这意味着使用“1”为第一个参数,如果没有指定,和第三个使用“n”)。然后

$\coord{x}$ 

产率(SANS标)

(X1,...,XN)

$\coord[0]{y}$ 

产率(再次,SANS标)

( x0,...,xn)