可以将分数中的条更改为其他符号吗?即。
\frac{x}{y}
但我不想使用直线,而是选择分隔符\overbrace
。我知道我可以使用以下方法完全摆脱分隔符\genfrac
\genfrac{}{}{0pt}{}{x}{y}
我最接近的答案是:
\genfrac{}{}{0pt}{}{x}{\overbrace{y}}
虽然这会扩展y
大表达式的表达式,但不会扩展分隔符x
的表达式。有什么想法吗?
编辑:由于 hat 无法编译,因此更改为\overbrace
from 。问题仍然相同。\hat
答案1
我不确定你做了什么来\hat
扩展它——对我来说它不起作用——但下面的方法可以工作。我对间距不太满意。请注意,我使用了\overbrace
而不是,\hat
因为它实际上会扩展。
\newcommand*\hatfrac[2]{
\genfrac{}{}{0pt}{}{#1}{\mathpalette\makehathelper{{#1}{#2}}}
}
\def\makehathelper#1#2{\makehat#1#2}
\def\makehat#1#2#3{
\begingroup
\setbox0\hbox{$\mathsurround0pt #1#2$}
\setbox2\hbox{$\mathsurround0pt #1#3$}
\ifdim\wd0<\wd2
\overbrace{\box2}
\else
\overbrace{\hbox to\wd0{\hfil\box2\hfil}}
\fi
\endgroup
}
在这两种情况下,括号似乎都没有对齐。如果你将 vinculum(分数线)设置为大于 0pt,当然,你会得到一条线,但括号会对齐。尝试
\[
\hatfrac{abcdefghijkl}{x}
\hatfrac{x}{abcdefghijkl}
\hatfrac{x}{y}
\]
看看我的意思。
更新
我保留了旧的解决方案,因为我怀疑经过一些修改,有人可以让它工作。这是我目前的解决方案。
\newcommand*\hatfrac[2]{
\mathchoice{\makehat\textstyle{#1}{#2}}
{\makehat\scriptstyle{#1}{#2}}
{\makehat\scriptscriptstyle{#1}{#2}}
{\makehat\scriptscriptstyle{#1}{#2}}
}
\def\makehat#1#2#3{
\mathinner{
\hskip\nulldelimiterspace
\setbox0\hbox{\strut$\mathsurround0pt#1#2$}
\setbox2\hbox{\strut\cramped[#1]{#3}}
\dimen0 \wd\ifdim\wd0<\wd2 2\else0\fi
\setbox4\hbox{$\mathsurround0pt\overbrace{\hbox to\dimen0{\hfil}}$}
\dimen0 \wd4
\dimen2 \ht2
\advance\dimen2 \dp2
\advance\dimen2 \ht4
\setbox6\vbox{\hbox to\dimen0{\hfil\unhbox0\hfil}
\nointerlineskip
\box4
\nointerlineskip
\hbox to\dimen0{\hfil\unhbox2\hfil}}
\lower.5\dimen2\box6
\hskip\nulldelimiterspace
}
}
它有一个问题,我希望这个问题足够小,你可以使用它。第一个问题是分子和分母\strut
排版时有空格。应该发生的是分子(或分母)应该向上(或向下)移动一定量,具体取决于字体及其高度+深度。原则上,这是可行的,但我需要花更多时间阅读 TeXbook 的附录 G。
编辑:还有一个关于数学风格拥挤的问题,这个问题已经得到解决,这要归功于这个答案。您需要宏mathtools
包\cramped
。实际上,分子也存在类似的问题。分母应该总是拥挤,因此使用\cramped
我们可以解决它。只有当整个分数拥挤时,分子才应该拥挤。我不知道如何测试当前样式是否拥挤。
答案2
我现在很想看 TikZ。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing}
\newcommand{\intfunnyfrac}[1]{%
\tikz[baseline]
\draw
node[anchor=mid] (frac) {\(#1\)}
[draw,decorate,decoration=brace]
(frac.west) -- (frac.east)
;%
}
\newcommand{\funnyfrac}[2]{%
\mathchoice{%
\intfunnyfrac{\displaystyle{ #1 \atop #2}}%
}{%
\intfunnyfrac{\textstyle{ #1 \atop #2}}%
}{%
\intfunnyfrac{\scriptstyle {#1 \atop #2}}%
}{%
\intfunnyfrac{\scriptscriptstyle {#1 \atop #2}}%
}%
}
\begin{document}
\[
X \frac{A}{B} \funnyfrac{A}{B} \frac{A}{B} Y
\]
\[
X \funnyfrac{A B C D}{B} \funnyfrac{A}{A B C D} \funnyfrac{A}{B} Y
\]
\end{document}
它可以对间距进行一些调整,并且用凹凸不平的线条代替水平线,然后分子和分母可以有更多的分离,但它更多的是作为“概念证明”,而不是一些你可以剪切和粘贴的代码。
答案3
另一种可能性是从头开始构建“分数”,从盒子开始。对我来说,类似这样的方法似乎有效:
\newcommand*\hatfrac[2]{
\mathchoice{\makehat\displaystyle{#1}{#2}}
{\makehat\textstyle{#1}{#2}}
{\makehat\scriptstyle{#1}{#2}}
{\makehat\scriptscriptstyle{#1}{#2}}
}
\def\makehat#1#2#3{
\begingroup
\setbox0\hbox{$\mathsurround0pt #1#2$}
\setbox2\hbox{$\mathsurround0pt #1#3$}
\dimen0 = \ht0
\advance\dimen0 by \dp0
\dimen2 = \ht2
\advance\dimen2 by \dp2
\ifdim\dimen0<\dimen2
\setbox4\vbox to\dimen2{\vfil\copy0\vskip0pt}
\setbox6\vbox to\dimen2{\copy2\vskip0pt}
\else
\setbox4\vbox to\dimen0{\copy0\vskip0pt}
\setbox6\vbox to\dimen0{\copy2\vfil\vskip0pt}
\fi
\ifdim\wd0<\wd2
\dimen4=\wd2
\else
\dimen4=\wd0
\fi
\setbox8\hbox{\strut$\overbrace{\hbox to\dimen4{\hfil}}$}
\dimen4=\wd8
\;\vcenter{\hbox{\vbox{\hbox to\dimen4{\hfil\box4\hfil}%
\box8\hbox to\dimen4{\hfil\box6\hfil}}}}\;
\endgroup
}
答案4
这是 TH 解决方案的略微修改版本,它不使用\genfrac
。相反,我使用 TeX 原语\atop
。
\def\genbraced#1#2#3#4%accent style num den
{\begingroup
\setbox0\hbox{$\mathsurround0pt #2#3$}%
\setbox2\hbox{$\mathsurround0pt #2#4$}%
\dimen0\wd0
\ifdim\dimen0<\wd2 \dimen0\wd2 \fi
{\box0 \atop #1{\hbox to \dimen0{\hss\box2\hss}}}
\endgroup}
\def\braced{\genbraced\overbrace\displaystyle}
%\showboxes %Really useful for visual debugging
\starttext
\startformula
\braced{abcdefghijkl}{x}
\braced{x}{abcdefghijkl}
\braced{x}{y}
\stopformula
\stoptext