今天曾经提过一个根式嵌套的问题,刚才删除了,现重新提问。代码如下
\documentclass{ctexart}
\usepackage{scalerel}
\def\depthgrowth{0.6pt}
\def\heightgrowth{1.8pt}
\newsavebox\zbox
\newcommand\zsqrt[1]{%
\ignoremathstyle
\savebox\zbox{$#1\rule{0pt}{.45\baselineskip}$}%
\stretchrel*{\sqrt{\phantom{#1}\kern0.5pt}}%
{\rule[-\dimexpr\dp\zbox+\depthgrowth]{0pt}{%
\dimexpr\ht\zbox+\dp\zbox+\depthgrowth+\heightgrowth}}%
\kern-\wd\zbox#1%
}
\begin{document}
比较漂亮的连根式$\zsqrt{2+\zsqrt{2+\zsqrt{2+\zsqrt{2}}}}$
能否改进代码,解决两个问题,一是根指数$\zsqrt[3]{x}$;二是上下标$\log_{\zsqrt{a}}x$
\end{document}
更新:
缩放盒子到指定倍数,
% 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}
$
感谢大佬,能否利用mathchoice来选择样式,编辑速度慢点没关系。
@u7483 已更新。
@u10307 谢谢大佬,我待会试试
请大佬诊断下面的代码:
@u7483 这是因为
\zsqrt[#1]{#2}
setbox 时忽略 style,把 #2 视为\textstyle
。@u10307 那有解决方法吗?
那有解决的方法吗?
哪有解决的方法吗?
@u10307 那有解决的方法吗?
@u10307 如何解决呢?