限制为子集的常见数学符号A其定义域为函数F来自一组X成一組是如下图第一部分输出所示,用竖线表示。这是 Enrico Gregorio (“egreg”) 的方法https://tex.stackexchange.com/a/22255/13492。
我想将垂直线改为\upharpoonright
。使用 Heiko Oberdiek 的方法https://tex.stackexchange.com/a/67233/13492,我得到了下面第二部分输出所示的结果。
\upharpoonright
但是,在这种方法中,\upharpoonright
的顶部太低,底部也太低。如何修复这个问题,以便垂直位置与垂直条所使用的位置基本相同?
\documentclass{article}
\usepackage{amsfonts,amssymb}
\usepackage[left=1.25in,right=1.25in]{geometry}
\usepackage{scalerel}
% Method of Enrico Gregorio ("egreg")
% https://tex.stackexchange.com/a/22255/13492:
\newcommand\restrict[2]{% make the whole thing an ordinary symbol
\left.\kern-\nulldelimiterspace % automatically resize the bar with \right
#1% the function
\littletaller % pretend it's a little taller at normal size
\right|_{#2}%
}
\newcommand{\littletaller}{\mathchoice{\vphantom{\big|}}{}{}{}}
% Method of Heiko Oberdiek
% https://tex.stackexchange.com/a/67233/13492
\makeatletter
\newcommand*{\scaleddelims}[3]{%
\ensuremath{%
\mathpalette{\@scaleddelims{#1}{#2}}{#3}%
}%
}
\newcommand*{\@scaleddelims}[4]{%
% #1: left delimiter
% #2: right delimiter
% #3: \displaystyle, \textstyle, ...
% #4: inner formula
\begingroup
#3%
\sbox0{$\m@th#3\vphantom{A}#4$}%
\setbox2\vbox{\hbox{$\m@th#3#1$}\kern\z@}%
\setbox4\vbox{\hbox{$\m@th#3#2$}\kern\z@}%
\setbox6\hbox{$#3\vcenter{}$}%
\ifx\downharpoonleft#1\relax
\let\DelimLeft=L%
\else\ifx\upharpoonleft#1%
\let\DelimLeft=L%
\else\ifx\downharpoonright#1%
\let\DelimLeft=R%
\else\ifx\upharpoonright#1%
\let\DelimLeft=R%
\fi\fi\fi\fi
\ifx\downharpoonleft#2\relax
\let\DelimRight=L%
\else\ifx\upharpoonleft#2\relax
\let\DelimRight=L%
\else\ifx\downharpoonright#2\relax
\let\DelimRight=R%
\else\ifx\upharpoonright#2\relax
\let\DelimRight=R%
\fi\fi\fi\fi
\ifx\DelimLeft L%
\wd2=.6\wd2
\fi
\ifx\DelimRight L%
\wd4=.6\wd4
\fi
\ifx\DelimLeft R%
\sbox2{\kern-.4\wd2\box2}%
\fi
\ifx\DelimRight R%
\sbox4{\kern-.4\wd4\box4}%
\fi
\dimen0=\ht0 %
\advance\dimen0 by -\ht6 %
\dimen2=\dp0 %
\advance\dimen2 by \ht6 %
\ifdim\dimen2>\dimen0 %
\dimen0=\dimen2 %
\else
\dimen0=\dimen0 %
\fi
\dimen2=\ht6 %
\advance\dimen2 by -\dimen0 %
\dimen0=2\dimen0 %
\def\DelimCorr{%
\mskip.5\thinmuskip
\nonscript\mskip.5\thinmuskip
}%
\mathopen{%
\ifx\DelimLeft R\DelimCorr\fi
\raisebox{\dimen2}{\resizebox{!}{\dimen0}{\box2}}%
\ifx\DelimLeft L\DelimCorr\fi
}%
\begingroup
#3#4%
\endgroup
\mathclose{%
\ifx\DelimRight R\DelimCorr\fi
\raisebox{\dimen2}{\resizebox{!}{\dimen0}{\box4}}%
\ifx\DelimRight L\DelimCorr\fi
}%
\endgroup
}\makeatother
%
\newcommand{\rest}[2]{#1\scaleddelims{\kern-0.5\nulldelimiterspace\upharpoonright}{\vphantom{.}}{_{#2}}}
\begin{document}
\verb!\restrict! (with \verb!|!):
Map $\restrict{f}{E} \colon E \to Y, \quad \restrict{g}{E} \colon E \to Y, \quad
\restrict{\Phi}{E} \colon E \to Y, \quad \restrict{f}{A, B} \colon A \to B, \quad \restrict{f}{(A, B)} \colon A \to B$
\bigskip
\verb!\rest! (with \verb!\upharpoonright!):
Map $\rest{f}{E} \colon E \to Y, \quad \rest{g}{E} \colon E \to Y, \quad
\rest{\Phi}{E} \colon E \to Y, \quad \rest{f}{A, B} \colon A \to B, \quad \rest{f}{(A, B)} \colon A \to B$
\end{document}
我知道该amssymb
包\restriction
实际上定义为\mathrel{\upharpoonright}
(比较https://tex.stackexchange.com/a/565926/13492)。但是,水平间距太大,而且无论如何高度似乎都无法适当改变。
答案1
以下是基于套印的不同解决方案:基本上,我们打印一个高的\right|
,测量它,然后打印一个\upharpoonright
向上移动的,以便它与的顶部完全对齐\right|
。
在下面的代码中,我还包含了\restrict
您从 egreg 的解决方案中复制的代码,以说明相对大小。
因为这是基于套印的,所以如果您使用其他字体,结果可能需要更多微调。(例如,kpfonts
的宽度\right|
比的宽度更粗\upharpoonright
,因此结果看起来不太好。)
\documentclass{article}
\usepackage{amssymb}
\usepackage{mathtools}
\makeatletter
\newcommand\@rest[3]{%
% #1 : function
% #2 : \displaystyle etc
% #3 : subscript / domain
\begingroup
#2 %
\sbox0{$\m@th#2\left.\kern-\nulldelimiterspace\vphantom{#1}\littletaller\right|$}%
\sbox2{$\m@th#2\upharpoonright$}%
\dimen0=\ht0 %
\advance\dimen0 by -\ht2 %
\begingroup
#2#1%
\endgroup
\mathclose{%
\kern\nulldelimiterspace\mathclap{\usebox0}\mathclap{\raisebox{\dimen0}{\usebox2}}\kern\nulldelimiterspace}_{#3}
\endgroup
}
\newcommand\rest[2]{%
\mathpalette{\@rest{#1}}{#2}%
}
\newcommand\restrict[2]{% make the whole thing an ordinary symbol
\left.\kern-\nulldelimiterspace % automatically resize the bar with \right
#1% the function
\littletaller % pretend it's a little taller at normal size
\right|_{#2}%
}
\newcommand{\littletaller}{\mathchoice{\vphantom{\big|}}{}{}{}}
\makeatother
\begin{document}
$\rest{f}{E}$ $\restrict{f}{E}$ $\rest{g}{(A,B)}$ $\restrict{g}{(A,B)}$
$\rest{\frac{\partial f}{\partial x}}{x = 1}$ $\restrict{\frac{\partial f}{\partial x}}{x = 1}$ $\displaystyle \rest{\frac{\partial f}{\partial x}}{x = 1}$
$\displaystyle \restrict{\frac{\partial f}{\partial x}}{x = 1}$
\end{document}
答案2
你的目标是制作一个可以随“函数”大小缩放的“限制”运算符吗?你的目标是实现egreg 的解决方案但使用\upharpoonright
,这将需要使用Heiko 的穷人\left...\right
因为鱼叉符号是不可调整大小的?
如果我的理解是正确的(即你对上述问题的回答都是“是”),那么你的定义\rest
就是错误的。应该是
\newcommand{\rest}[2]{\mathclose{\scaleddelims{\vphantom{.}}{\upharpoonright}{\kern-\nulldelimiterspace#1\vphantom{\big|}}}_{#2}}
您最初的尝试没有奏效的原因是因为它没有正确遵循以下内容\scaledelims
:三个参数的顺序如下:
#1
开放分隔符#2
结束分隔符#3
分隔符之间的公式。
egreg 的解决方案是放置一个空的左分隔符(\left.
)和一条垂直线作为右分隔符\right|
,并将函数放在中间,这样限制运算符就可以随着内部函数而缩放,但需要注意的是内部函数必须至少\big|
很高。
要使用 Heiko 实现相同的逻辑,\scaledelims
您应该使用空分隔符作为开头 ( \vphantom
),使用鱼叉作为右侧分隔符,并将函数作为第三个参数。但是,您的尝试仅将下标作为第三个参数,这意味着缩放是根据下标计算的,这几乎导致了您的所有问题。
我添加的用来封闭整个表达式的额外内容\mathclose
是使鱼叉后的下标适当垂直移动。
当然,如果您不使用\scaleddelims
宏,则整个代码可以显著压缩。
例如,只要删除与开始分隔符和检测正在使用哪个鱼叉的逻辑有关的所有内容,就可以将代码简化为
\makeatletter
\newcommand*{\rest}[2]{%
\ensuremath{%
\mathpalette{\@resttwo{#1}}{#2}%
}%
}
\newcommand*{\@resttwo}[3]{%
% #2: \displaystyle etc
% #1: function
% #3: domain
\begingroup
#2%
\sbox0{$\m@th#2\vphantom{\big|}#1$}%
\setbox4\vbox{\hbox{$\m@th#2\upharpoonright$}\kern\z@}%
\setbox6\hbox{$#2\vcenter{}$}%
\sbox4{\kern-.4\wd4\box4}%
\dimen0=\ht0 %
\advance\dimen0 by -\ht6 %
\dimen2=\dp0 %
\advance\dimen2 by \ht6 %
\ifdim\dimen2>\dimen0 %
\dimen0=\dimen2 %
\else
\dimen0=\dimen0 %
\fi
\dimen2=\ht6 %
\advance\dimen2 by -\dimen0 %
\dimen0=2\dimen0 %
\def\DelimCorr{%
\mskip.5\thinmuskip
\nonscript\mskip.5\thinmuskip
}%
\begingroup
#2#1%
\endgroup
\mathclose{%
\DelimCorr
\raisebox{\dimen2}{\resizebox{!}{\dimen0}{\box4}}%
}_{#3}%
\endgroup
}
\makeatother