我正在尝试自己的命令和环境,现在我面临这些问题:
\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
有人知道一些提示吗?非常感谢。
您不能简单地创建
\foo{parameter}[optional]
命令;但是,您可以使用 创建
\foo[optional]{parameter}
命令
\newcommand{\foo}[2][default]{Mandatory: #2; optional: #1}
如果你称它为
\foo{given}
,它会产生Mandatory: given, optional: default
;如果你称它为\foo[bonus]{given}
,它将产生Mandatory: given, optional: bonus
。这可能就是您应该这样做的方式——这与您的 LaTeX 代码的其余部分一起看起来会更好。创建具有可选参数的新环境的方法与类似
\newenvironment{env}[2][def]{(#1,#2)\begingroup}{\endgroup}
其中
#1
又是可选参数;这又被写为\begin{env}[opt]{req}...\end{env}
。如果您真的想要其他形式的命令,请参阅我答案的末尾。
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]
或仅使用
\reversed{mandatory}
,一切都会正常。\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 略有不同 ew命令。您可以检测是否已给出:
\NewDocumentCommand\foo{mo}{%
\IfNoValueTF{#2}
{Code without #2}
{Code with #2}%
}
您会发现这是通过使用小写“o”来实现的,而大写“O”则需要一个默认值(我通过包含一个空组将其设置为空)。
按照通常的方式设置,
\usepackage{xargs}
然后如果你定义
\newcommandx*\coord[3][1=1, 3=n]{(#2_{#1},\ldots,#2_{#3})}
(这意味着如果未指定,则使用“1”作为第一个参数,并使用“n”作为第三个参数)。然后
$\coord{x}$
产量(无下标)
(x1,...,xn)
和
$\coord[0]{y}$
yields(同样,无下标,y 替换强制参数)
(y0,...,yn)
% ----------------------------------
%! TEX program = XeLaTeX
% !TeX encoding = UTF-8
% Author: Troy_Daniel
% Email: [email protected]
% ----------------------------------
\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}
结果如下所示,可选参数的不同定义: