目前我对 LaTex 提供的根符号相当不满意。我对它的不满如下:
- 它占用了很多空间
- 天花板太高
- n 次方根看起来很糟糕,特别是当 n 比单个符号稍微复杂一点的时候
- 根结束位置的指示不够清晰(尤其是当你有像 $\sqrt(...)i$ 这样的东西时)
对于最后一点,已经存在一些解决方案,例如封闭式激进分子,但这也在被开方数后面增加了相当多的不必要的空格。
下面是我所期望的粗略绘画编辑。遗憾的是,我对如何自定义核心 Tex 内容的了解非常有限。任何有关如何做到这一点的帮助都将不胜感激,即使只是参考一些关于如何完成这类事情的教程。
所以基本上我希望基本的 sqrt 看起来像最右边的图像。当给出根索引的可选参数时,应该有一个小的“高原”,它整齐地坐在上面。
答案1
在 ConTeXt 中,可以使用 Metapost 绘制根。在下面的代码中,我基本上定义了一个新的根选择称为hyperloop
,它将平方根的主体和根放在适当的位置,然后绘制线条。输出与您手工绘制的并不完全匹配,但很接近。当然,您可以math_radical_hyperloop
根据需要调整 的定义以更改形状。
首先,绘制根的metapost代码:
\startMPextensions
vardef math_radical_hyperplane(expr w,h,d,o,r) =
(-h/3-max(r-o,o),h/3-o) --
(-h/3-o,h/3-o) --
(-o,-d-o) --
(o,h+o) --
(w+o,h+o) --
(w+o,h-h/8+o)
enddef ;
\stopMPextensions
接下来我们定义一个绘制根的uniqueMP图形:
\startMPextensions
vardef math_radical_hyperplane(expr w,h,d,o,r) =
(-h/3-max(r-o,o),h/3-o) --
(-h/3-o,h/3-o) --
(-o,-d-o) --
(o,h+o) --
(w+o,h+o) --
(w+o,h-h/8+o)
enddef ;
\stopMPextensions
最后我们定义一个数学激进的替代方案:
\newbox\radicalbox
\unprotected\setvalue{\??mathradicalalternative hyperplane}#1%
{\begingroup
\setbox\nextbox\mathstylehbox{#1}%
\setbox\radicalbox\mathstylehbox{\scriptscriptstyle\currentmathradicaldegree\hss}%
%
\scratchoffset \mathradicalparameter\c!mpoffset
\scratchtopoffset \dimexpr\scratchoffset+\dp\nextbox\relax
\scratchbottomoffset\dimexpr\ht\nextbox/3\relax
\scratchleftoffset \wd\radicalbox
% we use the \overlay variables as these are passes anyway and
% it's more efficient than using parameters
\d_overlay_width \wd\nextbox
\d_overlay_height \ht\nextbox
\d_overlay_depth \dp\nextbox
\d_overlay_offset \scratchoffset
\d_overlay_linewidth\linewidth
\edef\overlaylinecolor{\mathradicalparameter\c!color}%
%
\edef\p_mp{\mathradicalparameter\c!mp}%
%
\setbox\scratchbox\hpack\bgroup
\uniqueMPgraphic
{\p_mp}%
{radical=\scratchleftoffset}%
\egroup
\scratchdimen \wd\scratchbox
\hpack to \scratchdimen{\hss\box\nextbox\hskip\scratchoffset}%
\hskip-\scratchdimen
\lower\dimexpr\scratchtopoffset\box\scratchbox%
\ifx\currentmathradicaldegree\empty \else
\wd\radicalbox\scratchdimen
\hskip-\scratchdimen
\raise\dimexpr\scratchbottomoffset\box\radicalbox
\fi
\endgroup}
可以按如下方式使用:
\definemathradical[sqrt][alternative=hyperplane, mp=math:radical:hyperplane,
color=red]
\starttext
$
\sqrt{X}
\sqrt[3]{X}
\sqrt[2^n]{X}
$
\stoptext
这使
完整代码如下:
\startMPextensions
vardef math_radical_hyperplane(expr w,h,d,o,r) =
(-h/3-max(r-o,o),h/3-o) --
(-h/3-o,h/3-o) --
(-o,-d-o) --
(o,h+o) --
(w+o,h+o) --
(w+o,h-h/8+o)
enddef ;
\stopMPextensions
\setupmpvariables[math:radical:hyperplane][radical=0pt]
\startuniquempgraphic{math:radical:hyperplane}{radical}
draw
math_radical_hyperplane(overlaywidth,overlayheight,overlaydepth,overlayoffset,\mpvar{radical})
withpen pencircle xscaled (2overlaylinewidth) yscaled (3overlaylinewidth/4) rotated 30
% dashed evenly
withcolor overlaylinecolor ;
\stopuniquempgraphic
\newbox\radicalbox
\unprotected\setvalue{\??mathradicalalternative hyperplane}#1%
{\begingroup
\setbox\nextbox\mathstylehbox{#1}%
\setbox\radicalbox\mathstylehbox{\scriptscriptstyle\currentmathradicaldegree\hss}%
%
\scratchoffset \mathradicalparameter\c!mpoffset
\scratchtopoffset \dimexpr\scratchoffset+\dp\nextbox\relax
\scratchbottomoffset\dimexpr\ht\nextbox/3\relax
\scratchleftoffset \wd\radicalbox
% we use the \overlay variables as these are passes anyway and
% it's more efficient than using parameters
\d_overlay_width \wd\nextbox
\d_overlay_height \ht\nextbox
\d_overlay_depth \dp\nextbox
\d_overlay_offset \scratchoffset
\d_overlay_linewidth\linewidth
\edef\overlaylinecolor{\mathradicalparameter\c!color}%
%
\edef\p_mp{\mathradicalparameter\c!mp}%
%
\setbox\scratchbox\hpack\bgroup
\uniqueMPgraphic
{\p_mp}%
{radical=\scratchleftoffset}%
\egroup
\scratchdimen \wd\scratchbox
\hpack to \scratchdimen{\hss\box\nextbox\hskip\scratchoffset}%
\hskip-\scratchdimen
\lower\dimexpr\scratchtopoffset\box\scratchbox%
\ifx\currentmathradicaldegree\empty \else
\wd\radicalbox\scratchdimen
\hskip-\scratchdimen
\raise\dimexpr\scratchbottomoffset\box\radicalbox
\fi
\endgroup}
\definemathradical[sqrt][alternative=hyperplane, mp=math:radical:hyperplane,
color=red]
\starttext
\startTEXpage[offset=3mm]
$
\sqrt{X}
\sqrt[3]{X}
\sqrt[2^n]{X}
$
\stopTEXpage
\stoptext