更新:
缩放盒子到指定倍数,
% usepackage{amsmath,scalerel}
\makeatletter
\DeclareRobustCommand\zsqrt[2][]{%
\setbox\zbox=\hbox{\ignoremathstyle
\savebox\zbox{$#2\rule{0pt}{.45\baselineskip}$}%
\@ifempty{#1}
{\stretchrel*{\sqrt{\phantom{#2}\kern0.5pt}}%
{\rule[-\dimexpr\dp\zbox+\depthgrowth]{0pt}{%
\dimexpr\ht\zbox+\dp\zbox+\depthgrowth+\heightgrowth}}}
{\stretchrel*{\sqrt[#1]{\phantom{#2}\kern0.5pt}}%
{\rule[-\dimexpr\dp\zbox+\depthgrowth]{0pt}{%
\dimexpr\ht\zbox+\dp\zbox+\depthgrowth+\heightgrowth}}}%
\kern-\wd\zbox \box\zbox}%
\mathchoice{\copy\zbox}{\copy\zbox}
{\scalebox{.7}{\copy\zbox}}{\scalebox{.5}{\box\zbox}}
}
\makeatother
即使使用 pdflatex 编译也会很慢:
$
\zsqrt[\uproot{3}5]{2+\zsqrt[4]{2+\zsqrt[3]{2+\zsqrt[2]{2}}}}
\log_{\zsqrt{2}} x
\log_{\zsqrt[\uproot{3}5]{2+\zsqrt[4]{2+\zsqrt[3]{2+\zsqrt[2]{2}}}}} x
\log_{\sqrt2}
\zsqrt[3]{2}
$
第一个,上下标的问题,代码中使用了 \ignoremathstyle
即表示忽略上下标的样式(TeX 通过 \displaystyle
(D)、\textstyle
(T)、\scriptstyle
(S)、\scriptscriptstyle
(SS) 来控制上下标的样式),在多次嵌套使用时,这一般是必须的,因为如果考虑这些 style,TeX 会生成在不同 style 下的盒子,如果嵌套使用,TeX 将生成 4 的指数个盒子,编译会非常慢,这是写在 TeX 源码中的,无法在宏层面更改,只能避免(避免方式就是忽略 style,统一使用 T)。
如果要在上下标中使用,可以使用 \scalebox
缩放固定比例,TeX 中默认的数学字体比例为 T:S:SS = 10:7:5。
根指数的情况也是如此,如果使用根指数,则指数也会生成额外的盒子,但是也不难实现。
% usepackage...
\makeatletter
\DeclareRobustCommand\zsqrt[2][]{%
\ignoremathstyle
\savebox\zbox{$#2\rule{0pt}{.45\baselineskip}$}%
\@ifempty{#1}
{\stretchrel*{\sqrt{\phantom{#2}\kern0.5pt}}%
{\rule[-\dimexpr\dp\zbox+\depthgrowth]{0pt}{%
\dimexpr\ht\zbox+\dp\zbox+\depthgrowth+\heightgrowth}}}
{\stretchrel*{\sqrt[#1]{\phantom{#2}\kern0.5pt}}%
{\rule[-\dimexpr\dp\zbox+\depthgrowth]{0pt}{%
\dimexpr\ht\zbox+\dp\zbox+\depthgrowth+\heightgrowth}}}
\kern-\wd\zbox#2%
}
\makeatother
$
\zsqrt{2+\zsqrt{2+\zsqrt{2+\zsqrt{2}}}}
\log_{\scalebox{.7}{$\zsqrt{2}$}} x
\log_{\sqrt2}
\zsqrt[3]{2}
$
问 根式嵌套及其改进代码