我经常遇到需要在域中的两个集合上定义函数的情况。我想创建一个命令\newcommand{\func}[4]{...}
,使行内括号,显示了函数如何映射两组点。
到目前为止,我已经做到了这一点
通过命令$\binom{\tiny(x,s,t)\mapsto(x,s(1-t))}{\tiny(y,t)\mapsto y~~~~~~~~~}
。如你所见,我遇到了问题结盟两者\mapsto
以及尺寸两个外侧括号。
有人能帮我写这样的命令吗?我尝试用内联表,但它太大了。最好(但不是必须)两个外括号都响应\left
and\right
或\big
。
评论:这是我当前的解决方案(通过没有对齐的 \binom)的样子:
任何产生更大括号的解决方案都是不可接受的。唯一缺少的是对齐。
答案1
理想情况下,应该有一个aligned
间距较小的版本。不过我还没听说有这样的实现。
\mathllap
这是一个使用和psmallmatrix*
的非自动解决方案mathtools
:
\documentclass{article}
\usepackage{mathtools}
\begin{document}
abc
$\begin{psmallmatrix*}[l]
(x,s,t) \mapsto (x,s(1-t)) \\
\phantom{(x,s,t)}\mathllap{(y,t)} \mapsto y
\end{psmallmatrix*}$
abc
\end{document}
答案2
这是一个基于 Tobi 答案的选项。现在,该命令根据第一个(可选参数)提供三种不同的大小:没有可选参数时,它可以用于内联表达式;使用Big
或bigg
作为可选参数,您可以增加大小并在显示的表达式中使用该命令。
\documentclass[12pt,a4paper]{scrartcl}
\usepackage{ifthen}
\usepackage{amsmath,mathtools}
% default values
\newcommand\OpenS{\bigl(}
\newcommand\CloseS{\bigr)}
\newcommand\Vspace{-0.85em}
\newcommand\Msize{\scriptstyle}
\newcommand{\func}[5][]{%
\ensuremath{%
\ifthenelse{\equal{#1}{Big}}
{\renewcommand\OpenS{\Bigl(}%
\renewcommand\CloseS{\Bigr)}%
\renewcommand\Vspace{-0.55em}%
\renewcommand\Msize{\textstyle}}%
{\ifthenelse{\equal{#1}{bigg}}%
{\renewcommand\OpenS{\biggl(}%
\renewcommand\CloseS{\biggr)}%
\renewcommand\Vspace{-0.2em}%
\renewcommand\Msize{\displaystyle}}%
{}}
\OpenS%
\begin{aligned}\Msize
{\Msize#2} &\mapsto {\Msize#3}\\[\Vspace]
{\Msize#4} &\mapsto {\Msize#5}
\end{aligned}
\CloseS%
}%
}
\begin{document}
text text text text t text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text $k(g)=\func{(x,s,t)}{(x,s(t-1))}{(y,t)}{y}$ text text text text text text text text text text text text text text text text text text text text text text text text text text text
\[
k(g)=\func[Big]{(x,s,t)}{(x,s(t-1))}{(y,t)}{y}
\]
text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text
\[
k(g)=\func[bigg]{(x,s,t)}{\big(x,s(t-1)\big)}{(y,t)}{y}
\]
text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text text
\end{document}
结果:
答案3
这是 Gonzalo 答案的精简版本
\makeatletter
\newcommand{\ho@func}[8]{
%#1 = opening delimiter
%#2 = closing delimiter
%#3 = vertical space
%#4 = size of symbols
%#5 = top left
%#6 = top right
%#7 = bottom left
%#8 = bottom right
#1\vcenter{\halign{\hfil$##\mapsto{}$&$##$\hfil\cr
#4#5#6\cr\noalign{\vskip#3}#4#7#8\cr}}#2}
\@namedef{ho@}{\ho@func{\bigl(}{\bigr)}{-1ex}{\scriptstyle}}
\@namedef{ho@Big}{\ho@func{\Bigl(}{\Bigr)}{-.2ex}{\textstyle}}
\@namedef{ho@bigg}{\ho@func{\biggl(}{\biggr)}{0ex}{\textstyle}}
\newcommand{\func}[1][]{\@nameuse{ho@#1}}
\makeatother
可选参数决定使用\func
哪一个命令;该命令扩展为,后跟它所需的八个参数中的四个,接下来的四个在输入流中,它们作为的参数显示给用户。\ho@...
\ho@...
\ho@func
\func
我和菲尔一样,永远不会用以下方式定义这样的东西\ensuremath
:将数学公式放在它们所属的位置有助于限制语法错误。
注意:已编辑以直接使用\halign
。示例文本可以与 Gonzalo 的答案相同,不需要额外的包。
答案4
这是使用 Xy-pic 的版本:
\documentclass[12pt]{article}
\usepackage[all,cmtip]{xy}
\newcommand{\func}[4]{
\begingroup
\let\objectstyle=\scriptstyle
\ensuremath{
\left(
\vcenter{
\xymatrix@R=0ex@C=1em{
{#1} \ar@{|->}[r]& {#2}\\
{#3} \ar@{|->}[r]& {#4}
}
}
\right)
}
\endgroup
}
\begin{document}
Here we are in math mode: $\func{(x,y)}{x+y}{(s,t)}{s^{2}-t}$
Here we are not in math mode: \func{(x,s,t)}{(x,s(1-t))}{(y,t)}{y}
\end{document}
(我从来没想过使用\ensuremath
,但我在@Tobi 的回答中看到了它。)