首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >\newcommand / \newenvironment -可选参数

\newcommand / \newenvironment -可选参数
EN

Stack Overflow用户
提问于 2010-05-26 06:11:47
回答 4查看 21.1K关注 0票数 20

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

为创建命令\foo[optional_1]...[optional_n]{parameter}

  1. 如何创建命令\foo{parameter}[optional]或名为的环境

我试过了

代码语言:javascript
复制
\newcommand{\foo}[3][][]{#1#2#3}    - failed
\newcommand{\foo}[3][2][][]{#1#2#3} - failed

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-05-27 14:02:48

使用xparse包( LaTeX3开发工作的一部分):

代码语言:javascript
复制
\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中与with \newcommand中略有不同。您可以检测是否给出了一个:

代码语言:javascript
复制
\NewDocumentCommand\foo{mo}{%
  \IfNoValueTF{#2}
   {Code without #2}
   {Code with #2}%
}

您将看到,这是通过使用小写字母'o‘来实现的,而大写字母'O’则需要一个默认值(我已经通过包含一个空组将其设为空)。

票数 15
EN

Stack Overflow用户

发布于 2010-05-26 08:53:02

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

\newcommand{\foo}2{强制:#2;可选:#1}

如果你调用它为\foo{given},它将生成Mandatory: given, optional: def;如果你调用它为\foo[optional]{given},它将生成Mandatory: given, optional: optional。这可能就是你应该这样做的--这会让你的LaTeX代码看起来更好。使用可选参数创建新环境的过程与

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

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

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

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

代码语言:javascript
复制
\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},一切都应该正常工作。

票数 18
EN

Stack Overflow用户

发布于 2010-07-21 20:24:34

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

以通常的方式进行设置,

代码语言:javascript
复制
\usepackage{xargs}

然后如果你定义

代码语言:javascript
复制
\newcommandx*\coord[3][1=1, 3=n]{(#2_{#1},\ldots,#2_{#3})}

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

代码语言:javascript
复制
$\coord{x}$

收益率(sans下标)

(x1,.。。,xn)

代码语言:javascript
复制
$\coord[0]{y}$

收益率(同样,sans下标,y替换必选参数)

(y0,...,yn)

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2908908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档