21

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

  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

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

4

4 回答 4

18
  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}
    

    where#又是可选参数;这又写成\begin{env}[opt]{req}...\end{env}。如果您真的想要其他形式的命令,请参阅我的答案的结尾。

  2. TeX FAQ 有一个关于编写带有多个可选参数的命令的答案。如何做到这一点有两种选择。基本思想是定义一个带有可选参数的命令,然后运行另一个本身带有可选参数的命令,等等;twoopt包对此进行了封装。


如果你真的想要一个类似的命令\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]or just \reversed{mandatory},一切都应该工作。

于 2010-05-26T00:53:01.643 回答
15

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

于 2010-05-27T06:02:47.540 回答
6

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

照常设置,

\usepackage{xargs}

然后如果你定义

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

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

$\coord{x}$

产量(无下标)

(x1, . . . , xn)

$\coord[0]{y}$

产生(同样,无下标,并且 y 替换强制参数)

(y0, ..., yn)

于 2010-07-21T12:24:33.900 回答
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}

结果如下所示,可选参数的不同定义: 可选参数的不同定义

于 2019-12-25T12:30:01.110 回答