\ newcommand / \ newenvironment - 可选参数

时间:2010-05-25 22:11:47

标签: latex newenvironment renewcommand

我正在尝试自己的命令和环境,现在我正面临着这些问题:

  1. 如何创建名为\foo{parameter}[optional]的命令\begin{bar}{parameter}[optional]或环境?
  2. 如何创建命令\foo[optional_1]...[optional_n]{parameter}
  3. 我试过

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

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

4 个答案:

答案 0 :(得分:16)

  1. 您无法简单地创建\foo{parameter}[optional]命令;但是,您可以使用

    创建\foo[optional]{parameter}命令
    \newcommand{\foo}[2][def]{Mandatory: #2; optional: #1}
    

    如果您将其称为\foo{given},则会生成Mandatory: given, optional: def;如果您将其称为\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 包封装了这个。


  3. 如果确实想要\reversed{mandatory}[optional]这样的命令,你可以这样做。首先,定义一个获取必需参数的命令,将其存储在宏中,然后将其转发到另一个命令。第二个命令采用可选参数,并使用定义的命令和可选参数。把这一切放在一起,我们得到了

    \makeatletter
    \newcommand{\reversed}[1]{\def\reversed@required{#1}\reversed@opt}
    \newcommand{\reversed@opt}[1][def]{Required: \reversed@required; optional: #1}
    \makeatother
    

    然后,您可以使用\reversed{mandatory}[optional]\reversed{mandatory},一切都应该有用。

答案 1 :(得分:13)

使用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'则需要一个默认值(我通过包含一个空组来使其为空)。

答案 2 :(得分:5)

还要考虑xargs包。以下是其文档中的示例。

以通常的方式设置,

\usepackage{xargs}

然后如果你定义

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

(这意味着对于第一个参数使用“1”,如果未指定,则使用“n”表示第三个参数)。然后

$\coord{x}$

收益率(无下标)

(x1,...,xn)

$\coord[0]{y}$

收益率(再次,sans下标,y替换强制参数)

(y0,...,yn)

答案 3 :(得分:0)

我知道已经有了全面的答案,但是在某些情况下,我想针对不同的情况给出不同的定义。仍然有一个非常基本但简单的解决方案。如果有其他需要,我会写下来。

% ----------------------------------
%! TEX program = XeLaTeX
% !TeX encoding = UTF-8
% Author:       Troy_Daniel 
% Email:        Troy_Daniel@163.com
% ----------------------------------
\documentclass{article}
\usepackage{xcolor}

\newcommand{\Caption}[3]{%
    \textcolor[rgb]{0.36, 0.72, 0.80}{\Large #1}
    {\def\tmp{#3}
    \ifx\tmp\empty                                  % the third parameter is not provieded
        \textcolor[rgb]{0.96, 0.66, 0.35}{\small#2}
    \else                                           % non-empty third parameter
        \textcolor[rgb]{0.96, 0.66, 0.35}{\small[#3]#2}
    \fi}}
\begin{document}

\Caption{First}{Second}{}

\Caption{First}{Second}{Third}

\end{document}

结果显示如下,可选参数的不同定义: Different definitions for optional parameter(s)