定制根

定制根

目前我对 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

相关内容