找回密码
 快速注册
搜索
查看: 8129|回复: 10

关于n次根号的一个细节及改进尝试

[复制链接]

730

主题

1万

回帖

9万

积分

积分
93593
QQ

显示全部楼层

kuing 发表于 2015-7-21 16:34 |阅读模式
amsmath关于n次根号的次数放置的代码是

\def\r@@t#1#2{\setboxz@h{\$\m@th#1\sqrtsign{#2}\$}%
\dimen@\ht\z@\advance\dimen@-\dp\z@
\setbox\@ne\hbox{\$\m@th#1\mskip\uproot@ mu\$}%
\advance\dimen@ by1.667\wd\@ne
\mkern-\leftroot@ mu\mkern5mu\raise.6\dimen@\copy\rootbox
\mkern-10mu\mkern\leftroot@ mu\boxz@}

在读了这段代码之后,发现一个细节处理得不太好,那就是:整个n次根号的偏移量将完全取决于次数盒子的宽度。
这就造成了 \sqrt{2} 、 \sqrt[]{2} 、 \sqrt[3]{2} 、 \sqrt[m]{2} 这些根式的偏移都不一样。
举个栗子:\$|\sqrt2|\$、\$|\sqrt[n]2|\$ 分别得到(注:别在本论坛测试,因为 MathJax 的处理是不一样的,必须在真 LaTeX 中测试)
QQ截图20150721202211.gif
想看更细致些,我们再用以下代码来观察一下。
\$\boxed{\sqrt1}\$

\$\boxed{\sqrt[]1}\$

\$\boxed{\sqrt[.]1}\$

\$\boxed{\sqrt[3]1}\$

\$\boxed{\sqrt[\alpha]1}\$

\$\boxed{\sqrt[m]1}\$

\$\boxed{\sqrt[33]1}\$

\$\boxed{\sqrt[333]1}\$

\$\boxed{\sqrt[3333]1}\$

结果为:
QQ截图20150721161609.gif

原代码的做法可能是为了照顾太长的次数,因为如果根号位置固定,次数太长就与前面的东西重叠了,但是次数短的时候不需要这样,于是就有了改进空间。
我们应该要做到,当次数不宽时,让根号的位置与普通二次根式的完全相同,当次数超过一定宽度的时候,才产生适当的偏移。
分界线应该取多少?由上面的代码可以看出应该是10mu,初步思考后得出如下代码

\newdimen\rootboxwd
\newbox\rootmaxwdbox

\def\r@@t#1#2{\setboxz@h{\$\m@th#1\sqrtsign{#2}\$}%
\dimen@\ht\z@\advance\dimen@-\dp\z@
\setbox\@ne\hbox{\$\m@th#1\mskip\uproot@ mu\$}%
\advance\dimen@ by1.667\wd\@ne
\mkern-\leftroot@ mu
\rootboxwd\wd\rootbox
\setbox\rootmaxwdbox\hbox{\$\m@th#1\mskip10mu\$}
\ifdim\rootboxwd<\wd\rootmaxwdbox
\mkern10mu\kern-\rootboxwd
\fi
\raise.6\dimen@\copy\rootbox
\mkern-10mu\mkern\leftroot@ mu\boxz@}

这样前面测试代码的结果变成:
QQ截图20150721163159.gif

测试文件: $type nsqrttest2.tex (776 Bytes, 下载次数: 936)

730

主题

1万

回帖

9万

积分

积分
93593
QQ

显示全部楼层

 楼主| kuing 发表于 2015-7-21 17:13
这个细节其实以前就已经注意到了,总觉得n次根式跟左边的东西似乎离得有点远,只是当时也没太在意也无能为力,所以就没管了

730

主题

1万

回帖

9万

积分

积分
93593
QQ

显示全部楼层

 楼主| kuing 发表于 2015-7-21 19:45
我们还可以将 kuing.cjhb.site/forum.php?mod=viewthread&tid=3581 里的代码和这里的结合起来,不过那贴改得不是太满意,暂时搁置。

730

主题

1万

回帖

9万

积分

积分
93593
QQ

显示全部楼层

 楼主| kuing 发表于 2016-8-21 16:33
逛CTeX论坛看到这个帖 bbs.ctex.org/forum.php?mod=viewthread&tid=152826,顺便也发发改变根号次数大小的方法。

也是在使用 amsmath 宏包的前提下,加上:

\def\plainroot@#1\of#2{\setbox\rootbox\hbox{%
\$\m@th\scriptstyle{#1}\$}%
\mathchoice{\r@@t\displaystyle{#2}}{\r@@t\textstyle{#2}}
{\r@@t\scriptstyle{#2}}{\r@@t\scriptscriptstyle{#2}}\egroup}

(这段代码就是在 amsmath.sty 里面抄的,将 \m@th\scriptscriptstyle{#1} 改成 \m@th\scriptstyle{#1},也就是大了一号)

测试文档: $type testsq.tex (428 Bytes, 下载次数: 915)

效果对比:
QQ截图20160821163745.png

830

主题

4862

回帖

3万

积分

积分
36159

显示全部楼层

isee 发表于 2016-8-21 19:30
逛CTeX论坛看到这个帖 ,顺便也发发改变根号次数大小的方法。

也是在使用 amsmath 宏包的前提下,加上:

...
kuing 发表于 2016-8-21 16:33


成功将字放大

413

主题

1558

回帖

1万

积分

积分
11498

显示全部楼层

abababa 发表于 2020-2-25 18:50
回复 4# kuing

其实这个字号大小到是没考虑过,就是那个
\[\sqrt{\sum_{i=1}^{n}}\]
这种,总觉得那个开方号太直立了,不像前面那些有点斜度。

730

主题

1万

回帖

9万

积分

积分
93593
QQ

显示全部楼层

 楼主| kuing 发表于 2020-2-25 21:05
回复 6# abababa

这个可以换字体解决,比如用 yhmath(但是它同时也改变了其他东西,虽然可以单独抠出来用,但比较麻烦,详细见 kuing.cjhb.site/forum.php?mod=viewthread&tid=2301

730

主题

1万

回帖

9万

积分

积分
93593
QQ

显示全部楼层

 楼主| kuing 发表于 2020-2-25 21:48
回复 6# abababa

其实我曾经用 tikz 设计出一个根号,高度无上限,都不会直立,并且次数偏上,还能加个 `\neg`,像这样:
QQ截图20200225221034.png
可惜后来发现似乎会对编译速度有点影响,特别是多层根号时,这一点暂时未能解决,所以暂时还不敢拿出来……

3149

主题

8386

回帖

6万

积分

$\style{scale:11;fill:#eff}꩜$

积分
65391
QQ

显示全部楼层

hbghlyj 发表于 2024-2-24 19:09


我在Wikibook讀到了加`\neg`重新定義根号的一種方式
  1. % New definition of square root:
  2. % it renames \sqrt as \oldsqrt
  3. \let\oldsqrt\sqrt
  4. % it defines the new \sqrt in terms of the old one
  5. \def\sqrt{\mathpalette\DHLhksqrt}
  6. \def\DHLhksqrt#1#2{%
  7. \setbox0=\hbox{$#1\oldsqrt{#2\,}$}\dimen0=\ht0
  8. \advance\dimen0-0.2\ht0
  9. \setbox2=\hbox{\vrule height\ht0 depth -\dimen0}%
  10. {\box0\lower0.4pt\box2}}
复制代码

我的理解是,它將 \sqrt 的高度保存到\dimen0,加入短竪線box2,它的一端的高度等於\sqrt的高度\dimen0,另一端的高度等於\sqrt的高度的$1-0.2=0.8$倍。
0.4pt應該是 \sqrt 的高度减去 \sqrt 的實際高度?

上述方法如果n次根號\sqrt[n]{a}將會出錯。

後面給出了加`\neg`重新定義n次根號的一種方式
  1. \usepackage{letltxmacro}
  2. \makeatletter
  3. \let\oldr@@t\r@@t
  4. \def\r@@t#1#2{%
  5. \setbox0=\hbox{$\oldr@@t#1{#2\,}$}\dimen0=\ht0
  6. \advance\dimen0-0.2\ht0
  7. \setbox2=\hbox{\vrule height\ht0 depth -\dimen0}%
  8. {\box0\lower0.4pt\box2}}
  9. \LetLtxMacro{\oldsqrt}{\sqrt}
  10. \renewcommand*{\sqrt}[2][\ ]{\oldsqrt[#1]{#2} }
  11. \makeatother
  12. $\sqrt[a]{b} \quad \oldsqrt[a]{b}$
复制代码

3149

主题

8386

回帖

6万

积分

$\style{scale:11;fill:#eff}꩜$

积分
65391
QQ

显示全部楼层

hbghlyj 发表于 2024-2-24 19:33
這段代碼裡\mathpalette是什麼作用

3149

主题

8386

回帖

6万

积分

$\style{scale:11;fill:#eff}꩜$

积分
65391
QQ

显示全部楼层

hbghlyj 发表于 2024-2-24 19:37
hbghlyj 发表于 2024-2-24 11:09
0.4pt應該是 \sqrt 的高度减去 \sqrt 的實際高度?


做一個簡單的測試
texlive.net/run?%5Cdocumentclass%7Barticle%7D%0A%5Cbegin%7Bdocum ... %5Cend%7Bdocument%7D
  1. \documentclass{article}
  2. \begin{document}
  3. \setbox0=\hbox{$\sqrt\frac12$}
  4. $\sqrt\frac12$\lower0.4pt\hbox{\vrule height\ht0 depth -0.8\ht0}
  5. \end{document}
复制代码

手机版|悠闲数学娱乐论坛(第3版)

GMT+8, 2025-3-4 12:36

Powered by Discuz!

× 快速回复 返回顶部 返回列表