我正在尝试自己的命令和环境,现在我正面临着这些问题:
\foo{parameter}[optional]
的命令\begin{bar}{parameter}[optional]
或环境?\foo[optional_1]...[optional_n]{parameter}
我试过
\newcommand{\foo}[3][][]{#1#2#3} - failed
\newcommand{\foo}[3][2][][]{#1#2#3} - failed
有谁知道一些提示?非常感谢。
答案 0 :(得分:16)
您无法简单地创建\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}
。如果确实想要另一种形式的命令,请参阅我的答案的结尾。
TeX常见问题解答提供了使用more than one optional argument编写命令的答案。有两种方法可以做到这一点。基本思想是定义一个带有可选参数的命令,然后运行另一个命令,该命令本身带有一个可选参数,等等。 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]
或\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}
结果显示如下,可选参数的不同定义: