改变分数的形状

改变分数的形状

可以将分数中的条更改为其他符号吗?即。

\frac{x}{y}

但我不想使用直线,而是选择分隔符\overbrace。我知道我可以使用以下方法完全摆脱分隔符\genfrac

\genfrac{}{}{0pt}{}{x}{y}

我最接近的答案是:

\genfrac{}{}{0pt}{}{x}{\overbrace{y}}

虽然这会扩展y大表达式的表达式,但不会扩展分隔符x的表达式。有什么想法吗?

编辑:由于 hat 无法编译,因此更改为\overbracefrom 。问题仍然相同。\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

相关内容