自动添加或删除括号的宏

自动添加或删除括号的宏

这是关于这个宏定义的第二个问题: 定义一个具有三个可选参数的宏,形式为 \newmacro{a}{b}[c]{d}[e][f] 和 \newmacro{a}{b}[c]{d}*[f]

总结一下:我定义了一个宏,\funcdef用于在数学模式中编写函数声明。这个宏有三个强制参数和三个可选参数,其中一个是函数采用的符号。vg

\funcdef{f}{a}[A]{B}

表示f是我正在声明的函数的名称。 a是样本变量,和A分别B是定义域和陪域。它呈现为
f:A-->B \ a-->f(a)

但是如果我想定义一个多变量域,我会这样使用它:

\funcdef{f}{(a,b)}[A\times B]{C}[f(a,b)]

所以我得到了正确的形式
f:AxB-->C \ (a,b)-->f(a,b)

我必须使用可选参数来避免不良情况
*错误 f(a,b)

\funcdef{f}{a,b}[A\times B]{C}
\funcdef{f}{(a,b)}[A\times B]{C}

这个可选参数的最初想法是为标准函数符号提供一种替代符号,比较例如:
a乘以b

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

我会得到如下结果
f:AxB-->C \ (a,b)-->f(a,b)


对于这些示例的最小功能代码:

\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&#2\\&\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}

我只展示最后一个。

在此处输入图片描述

相关内容