我想创建一个运算符,其作用类似于减号(包括空格),但字符位于res
顶部(在\textrm
模式下)。减号的长度应调整为看起来像在res
字符下划线,并且它需要在下标中工作。目前我正在使用
\newcommand{\residue}[2]{#1\overset{\text{res}}{\relbar\mathrel{\mkern-3mu}\relbar\rule{0pt}{2pt}}#2}
这意味着我使用的运算符是
\relbar\mathrel{\mkern-3mu}\relbar\rule{0pt}{2pt}
但是它在两个破折号之间留了一些空间(尤其是在下标中),并且在内联或显示模式下,字母左侧的线太多res
。
有什么更好的方法来产生这个符号?
答案1
下面的示例定义了\res
一个带有可选参数的宏,其文本不同于res
:
文字大小为上标(
\scriptsize
或\scriptscriptsize
)的大小。不建议使用较小的尺寸,以免需要放大镜。文本和减号之间的垂直距离大约为文本和下划线之间的距离
\underline
。通过添加一些重叠的减号可以创建更长的减号。
\documentclass{article}
\usepackage{amsmath}
% test for different fonts
%\usepackage{MnSymbol}
%\usepackage{mathabx}
%\usepackage{txfonts}
\makeatletter
\newcommand*{\res}[1][res]{%
\mathbin{%
\mathpalette\@res{\mathrm{#1}}%
}%
}
\newmuskip\res@sidebearing
\setlength{\res@sidebearing}{1.5mu}% e.g. 1.5mu/CM, 1mu/MnSymbol
\newcommand*{\@res}[2]{%
% #1: math style
% #2: text
\sbox0{$%
\m@th
\res@style#1%
#2%
$}%
\sbox2{$\m@th#1\mkern-\res@sidebearing-\mkern-\res@sidebearing$}%
\setbox4=\copy2 %
\ifdim\wd4<\wd0 %
\@whiledim\wd4<\wd0\do{%
\dimen@=\dimexpr\wd4+.8\wd2\relax
\ifdim\dimen@<\wd0 %
\sbox4{\unhcopy4\hss\kern-.2\wd2\unhcopy2}%
\else
\setbox4=\hbox to \wd0{%
\unhcopy4\hss\kern-.2\wd2\unhcopy2%
}%
\fi
}%
\fi
\sbox6{$#1\vcenter{}$}%
% \sbox8{$#1\mathop{}\limits^{}$}% alternative
\sbox8{$\res@style#1\underline{}$}% ht8 + dp8 = 5 theta; sep = 3 theta
\mkern1.5mu %
\rlap{\copy4}%
\hbox to \wd4{%
\hfill
% \raisebox{\dimexpr\dp0+\ht6+.5\ht8\relax}{\copy0}% alternative
\raisebox{\dimexpr\dp0+\ht6+.7\dimexpr\ht8+\dp8\relax\relax}{\copy0}%
\hfill
}%
\mkern1.5mu %
}
\newcommand*{\res@style}[1]{%
\ifx#1\displaystyle
\scriptstyle
\else
\ifx#1\textstyle
\scriptstyle
\else
\scriptscriptstyle
\fi
\fi
}
\makeatother
\begin{document}
% Test: "res" and long word "garbage" with descender
\begin{gather*}
\displaystyle A \res B \res[garbage] C \res[r] D \\
\textstyle A \res B \res[garbage] C \res[r] D \\
\scriptstyle A \res B \res[garbage] C \res[r] D \\
\scriptscriptstyle A \res B \res[garbage] C \res[r] D
\end{gather*}
\end{document}
减号的难点和性质:
线条粗细未知。因此
\underline
或的线条粗细\frac
可能不同。\underline
在许多字体中,线条末端都是圆的。和的线条\frac
不是圆的,因为它们是规则的或矩形。侧轴承(两端的水平空间)未知。实现定义了一个数学跳过寄存器
\res@sidebearing
以进行微调。至少知道垂直位置,这应该是数学轴。
评论:
框 0 包含上标大小的测试。
盒子 2 包含减号减侧轴承。
框 4 由尽可能多的框 2 构成,以获得足够长的一行来容纳文本。
框 6 的高度是数学轴。
框 8:
\underline{...}
类似于:\vtop{ \hbox{...} \kern 3θ \hrule height θ \kern θ }
框 8 为空
\underline{}
,可用于计算分离空间 3θ0.6\dimexpr\ht8+\dp8\relax
:。还需要添加减法规则的一半高度,并用 θ/2(数学轴上方的部分)近似。
\m@th
是\mathsurround=0pt
避免额外水平间距的缩写,如果\mathsurround
设置了的话。\mathpalette
有助于设置当前数学风格的公式。
答案2
也许下面的方法适合你;我把符号从 稍微\residue{A}{B}
改为A \residue B
:
\documentclass{article}
\usepackage{amsmath,graphicx}
\begin{document}
\noindent
\begin{tabular}{@{}*{3}{p{.3333\linewidth}@{}}}
\texttt{Original} & \texttt{Choice 1} & \texttt{Choice 2} \\
\newcommand{\residue}[2]{#1\overset{\text{res}}{\relbar\mathrel{\mkern-3mu}\relbar\rule{0pt}{2pt}}#2}
$\residue{A}{B}$ \par
$C^{\residue{A}{B}}$ \par
$C^{D^{\residue{A}{B}}}$
&
\makeatletter
\newcommand{\residue@}[1]{#1\overset{\text{\raisebox{.15em}{res}}}{\smash{-\mkern-5mu-}}}
\newcommand{\residue}{\mathbin{\mathpalette\residue@\relax}}
\makeatother
$A \residue B$ \par
$C^{A \residue B}$ \par
$C^{D^{A \residue B}}$
&
\newcommand{\residue}{\mathbin{\mathchoice
{\overset{\text{\raisebox{.15em}{res}}}{\smash{-\mkern-5mu-}}}% \displaystyle
{\overset{\text{\raisebox{.15em}{res}}}{\smash{-\mkern-5mu-}}}% \textstyle
{\overset{\text{\raisebox{.15em}{res}}}{\smash{-\mkern-5mu-}}}% \scriptstyle
{\overset{\text{\raisebox{.1em}{\scalebox{.8}{res}}}}{\smash{-\mkern-5mu-}}}% \scriptscriptstyle
}}
$A \residue B$ \par
$C^{A \residue B}$ \par
$C^{D^{A \residue B}}$
\end{tabular}
\end{document}
选择 1用于
\mathpalette
提供数学样式之间的切换(参见的奥秘\mathpalette
)。选择 2直接使用
\mathchoice
,以便更好地res
在\scriptscriptstyle
级别上进行扩展,因为没有\scriptscriptscriptstyle
(作为\overset
参数\scriptscriptstyle
- 在超级/子子脚本中从技术上来说需要它)。