这是关于这个宏定义的第二个问题: 定义一个具有三个可选参数的宏,形式为 \newmacro{a}{b}[c]{d}[e][f] 和 \newmacro{a}{b}[c]{d}*[f]
总结一下:我定义了一个宏,\funcdef
用于在数学模式中编写函数声明。这个宏有三个强制参数和三个可选参数,其中一个是函数采用的符号。vg
\funcdef{f}{a}[A]{B}
表示f
是我正在声明的函数的名称。 a
是样本变量,和A
分别B
是定义域和陪域。它呈现为
但是如果我想定义一个多变量域,我会这样使用它:
\funcdef{f}{(a,b)}[A\times B]{C}[f(a,b)]
所以我得到了正确的形式
我必须使用可选参数来避免不良情况
\funcdef{f}{a,b}[A\times B]{C}
\funcdef{f}{(a,b)}[A\times B]{C}
这个可选参数的最初想法是为标准函数符号提供一种替代符号,比较例如:
\funcdef{\times}{(a,b)}[A\times A]{A}[a\times b]
\funcdef{\times}{(a,b)}[A\times A]{A}
问题:
在多变量域上使用标准函数符号时,我想添加或删除括号,以便代码
\funcdef{f}{a,b}[A\times B]{C}
或者
\funcdef{f}{(a,b)}[A\times B]{C}
我会得到如下结果
对于这些示例的最小功能代码:
\documentclass{article}
\makeatletter
\newcommand\funcdef[2]{\def\func@name{#1}\def\func@var{#2}\begin{array}{r@{\ }c@{\,}c@{\,}l}#1:\func@dom}
\newcommand\func@dom[2][\@empty]{&\ifx#1\@empty#2\else#1\fi&\to\\&\func@var&\mapsto&\func@use}
\newcommand\func@use{\@ifstar\func@use@\func@usei}
\newcommand\func@use@{\func@name(\func@var)\func@def}
\newcommand\func@usei[1][\@empty]{\ifx#1\@empty\func@name(\func@var)\else#1\fi\func@def}
\newcommand\func@def[1][\@empty]{\ifx#1\@empty\relax\else\mathrel{:=}#1\fi\end{array}}
\makeatother
\begin{document}
$$\funcdef{f}{a}[A]{B}$$
$$\funcdef{f}{(a,b)}[A\times B]{C}[f(a,b)]$$
$$\funcdef{f}{a,b}[A\times B]{C}$$
$$\funcdef{f}{(a,b)}[A\times B]{C}$$
$$\funcdef{\times}{(a,b)}[A\times A]{A}[a\times b]$$
$$\funcdef{\times}{(a,b)}[A\times A]{A}$$
\end{document}
答案1
只需修改键值接口的定义并添加几个检查。请注意,如果变量列表包含逗号,则必须输入
variables={a,b},
用于设置值。
\documentclass{article}
\usepackage{amsmath,keyval}
\makeatletter
\newcommand{\funcdef@key}[1]{%
\define@key{funcdef}{#1}{\@namedef{cet@#1}{##1}}%
\expandafter\let\csname cet@#1\endcsname\@empty
}
\funcdef@key{name}
\funcdef@key{domain}
\funcdef@key{codomain}
\funcdef@key{variable}
\funcdef@key{variables}
\funcdef@key{notation}
\funcdef@key{definition}
\newcommand{\funcdef@check}[1]{%
\expandafter\ifx\csname cet@#1\endcsname\@empty
\@latex@error{Missing `#1'}{Provide `#1'}%
\fi
}
\newcommand{\funcdef}[1]{%
\begingroup
\setkeys{funcdef}{#1}%
\ifx\cet@codomain\@empty\let\cet@codomain\cet@domain\fi
\funcdef@check{name}%
\funcdef@check{domain}%
\ifx\cet@variables\@empty
\funcdef@check{variable}%
\fi
\begin{array}{l@{}r@{}l@{}l}
\cet@name\colon{} &
\cet@domain &
{}\to \cet@codomain \\ &
\ifx\cet@variable\@empty
(\cet@variables)
\else
\cet@variable
\fi &
{}\mapsto
\ifx\cet@notation\@empty
\cet@name(
\ifx\cet@variable\@empty
\cet@variables
\else
\cet@variable
\fi
)
\else
\cet@notation
\fi
\ifx\cet@definition\@empty
\expandafter\@gobble
\else
\expandafter\@firstofone
\fi
{& {}\mathrel{:}=\cet@definition}
\\
\end{array}
\endgroup
}
\makeatother
\begin{document}
\noindent
Simple function:
\[
\funcdef{name=f,variable=x,domain=\mathbf{R}}
\]
Simple function with declaration:
\[
\funcdef{
name=f,
variable=x,
domain=\mathbf{R},
notation=x^2
}
\]
Function with alternative writing:
\[
\funcdef{
name=\exp,
variable=x,
domain=\mathbf{R},
notation=e^x
}
\]
Function with alternative writing and declaration:
\[
\funcdef{
name=\exp,
variable=x,
domain=\mathbf{R},
notation=e^x,
definition=\lim\limits_{n\to\infty}\left(1+\frac xn\right)^n
}
\]
Function with different domain and codomain:
\[
\funcdef{
name=\operatorname{sqrt},
variable=n,
domain=\mathbf{N},
codomain=\mathbf{R}
}
\]
Function with different domain and codomain, and alternative
writing:
\[
\funcdef{
name=\operatorname{sqrt},
variable=n,
domain=\mathbf{N},
codomain=\mathbf{R},
definition=\sqrt{n}
}
\]
Function with different domain and codomain, alternative writing
and declaration:
\[
\funcdef{
name=\operatorname{sqrt},
variable=n,
domain=\mathbf{N},
codomain=\mathbf{R},
notation=\sqrt{n},
definition=\exp\bigl(\frac{1}{2}\ln n\bigr)
}
\]
Function of two variables:
\[
\funcdef{
name=f,
variables={a,b},
domain=A\times B,
codomain=C,
}
\]
\end{document}
我只展示最后一个。