我正在尝试开发一个命令来排版斜分数。我知道nicefrac
和xfrac
包,都试过了,但都不喜欢。目前,在文本模式下,我使用了\nicefrac
一些升高和降低,因为我的目标是让分子的顶线与斜线的顶部对齐,让分母的基线与斜线的底部对齐。我想出了这个:
\documentclass[a4paper]{report}
\usepackage{amsmath,amsfonts,amssymb}
\newcommand{\Z}{\mathbb{Z}}
\usepackage{xparse}
\global\newcount\qwerty
\newcommand{\e}[1][2]{\ifnum#1>0
\qwerty=0
\loop\!\advance\qwerty by 1\ifnum\qwerty<#1\repeat
\else
\qwerty=0
\loop\,\advance\qwerty by 1\ifnum\qwerty<-#1\repeat
\fi}
\NewDocumentCommand{\xof}{mmO{7.8}O{-9.3}O{1}O{1}}
{\raisebox{#3pt}{$#1\e[#5]$}\bigg/\raisebox{#4pt}{$\e[#6]#2$}}
\usepackage{graphicx}
\newcommand{\scb}{\scalebox}
\usepackage{xfrac,nicefrac}
\begin{document}
\[\xof{\Z}{n\Z}\]
\[\xof{A}{I}[7.8][-9.3][1][2]\]
\[\xof{\scb{0.7}[0.7]{\(\xof{A}{I}\)\hspace{1pt}}}{\scb{0.7}[0.7]{\hspace{0.5pt}\(\xof{J}{I}\)}}[10][-7.5]\cong\xof{A}{\hspace{-1.2pt}J}.\]
\end{document}
在我看来,所有这些看起来都很好。参数 1 和 2 是分子和分母,参数 3 和 4 分别是分子的升高量和分母的降低量,均以 表示,pt
另外两个是数字,它们会变成尽可能多的\!
s(即 2->!!)以调整分子、分母和斜线之间的字距。问题是每次都必须手动调整这些参数,这相当烦人。那么有没有办法自动完成上面描述的对齐?
PS 我知道你会告诉我不应该有一串\!
s。我已经被告知了其中一个\,
s。只是有时有离散间距很方便。无论如何,我想我会放弃这一点,转而使用要传递给 的参数\hspace
。
更新:
我不知道\thinskip
,但我肯定会重新定义命令并增加它的用途,因为它将连续的空间范围和我的眼睛对 的数量的习惯结合在一起\!
。至于其他评论,这里的重点不是分数,而是商集,我认为这是完全不同的东西,并且以完全不同的方式书写。因此,我的目标肯定是不是以节省垂直空间。这可能对内联分数有用,但为此我有一个完全不同的命令,可以进行调整\nicefrac
。好吧,它在这里:
\newcommand{\of}[2]{\nicefrac{^{#1}}{_{#2}}}
\newcommand{\mf}[2]{^{#1}\scb{0.5}[1]{/}_{#2}}
不过,这两种方法\of
对我来说都更好,也更常用。所以\xof
只显示公式。不需要节省空间。我同意这样放大后它们看起来不太好看,但这可能是因为\bigg
太高了。另一方面,\Big
当我尝试它时,我觉得它太短了。也许我可以尝试将\left/
和\right.
与中间的东西结合起来,\vphantom
也许。这有待调查。我已经尝试过和\nicefrac
,但在我看来都很糟糕。所以当我说过,并重申,我试过的时候,不要告诉我我“不知道”。用分数表示商集对我来说看起来很糟糕,否则我就不会在这里了。至于所谓相关的答案,xfrac
\sfrac
xfrac
这看起来像是在文本模式下执行我在这里所做的事情的一种方式,我正在研究的这些命令是用于数学模式的,并且这有一个答案只对齐分子,另一个答案也不对齐,所以绝对不是我想要的。
答案1
这里我\xof[]{}{}
使用来定义\stackinset
。有一个可选参数(默认为 1ex)用于定义分子/分母从 的外边缘水平推入的距离\bigg/
。当分子/分母高于 时使用它\baselineskip
。
MWE 中的前 2 个方框示例是为了确认我已正确计算了我的膝盖宽度。接下来的 3 个示例来自 OP。
\documentclass{article}
\usepackage{mathtools,amssymb,stackengine}
\newcommand{\Z}{\mathbb{Z}}
\newcommand{\scb}{\scalebox}
\newcommand\xof[3][1ex]{\ensurestackMath{%
\setbox0=\hbox{$#2$}%
\setbox2=\hbox{$#3$}%
\kern\wd0\kern-\dimexpr#1\relax%
\stackinset{r}{#1}{b}{0pt}{\mathrlap{#3}}{%
\stackinset{l}{#1}{t}{0pt}{\mathllap{#2}}{\bigg/}%
}%
\kern-\dimexpr#1\relax\kern\wd2%
}}
\fboxsep=.1pt
\begin{document}
\[
\fbox{$\xof{\Z}{n\Z}$}
\]
\[
\fbox{$\xof{xxxxxx\Z}{yyy\Z}$}
\]
\[\xof{\Z}{n\Z}\]
\[\xof{A}{I}\]
\[\xof[0.2ex]{\scb{0.7}{\(\xof{A}{I}\)\hspace{1pt}}}{\scb{0.7}{\hspace{0.5pt}\(\xof{J}{I}\)}}\cong\xof{A}{J}.\]
\end{document}
这是一个替代版本,其中如果调用参数,则分子和分母分别被向上和向下推,#1
并且与的值成比例#1
。
\documentclass{article}
\usepackage{mathtools,amssymb,stackengine}
\newcommand{\Z}{\mathbb{Z}}
\newcommand{\scb}{\scalebox}
\newcommand\xof[3][1ex]{\ensurestackMath{%
\setbox0=\hbox{$#2$}%
\setbox2=\hbox{$#3$}%
\kern\wd0\kern-\dimexpr#1\relax%
\stackinset{r}{#1}{b}{\dimexpr#1-1ex}{\mathrlap{#3}}{%
\stackinset{l}{#1}{t}{\dimexpr#1-1ex}{\mathllap{#2}}{\bigg/}%
}%
\kern-\dimexpr#1\relax\kern\wd2%
}}
\fboxsep=.1pt
\begin{document}
\[\xof{\Z}{n\Z}\]
\[\xof{A}{I}\]
\[\xof[0.2ex]{\scb{0.7}{\(\xof{A}{I}\)\hspace{1pt}}}{\scb{0.7}{\hspace{0.5pt}\(\xof{J}{I}\)}}\cong\xof{A}{J}.\]
\end{document}