正如所提到的这是好看的 p 次根的答案该amsmath
包提供\leftroot{}
并\uproot{}
允许您将根的位置移动到左边, 和向上以小增量进行。使用这个,我能够在和包\sqrt
的帮助下重新定义如下:xparse
letltxmacro
\LetLtxMacro{\OldSqrt}{\sqrt}
\RenewDocumentCommand{\sqrt}{O{} O{-2} O{2} m}{\OldSqrt[\leftroot{#2}\uproot{#3}#1]{#4}}%
现在,重新定义\sqrt
接受两个额外的可选参数,如果需要调整,可以应用这两个参数,如下图所示\sqrt
这是对 \def ( )中的可选参数的回答。
一个相关的问题定义了如何产生“闭”(平方)根符号。因此,我尝试扩展egreg 的解决方案如上所述,允许两个附加参数来指定用于\leftroot{}
和的数字\uproot{}
。
当我开始时,我以为这会很简单,但事实并非如此。失败的尝试如下。前两个结果是:
包 amsmath 错误: 的使用无效
\leftroot
。
第三个(这表明我不太了解\DHLhksqrt
宏的工作原理)的结果是:
的参数
\DHLhksqrt
有一个额外的 }
问题:
- 如何创建一个
\sqrt
允许三个可选参数的封闭符号:根索引、\leftroot
值和\uproot
值? - 奖励:宏如何
\DHLhksqrt
工作
参考:
- 好看的 p 次根
- “闭”(平方)根符号
- \def 中的可选参数(
\sqrt
)
代码:
\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}
\usepackage{letltxmacro}
\LetLtxMacro{\OldSqrt}{\sqrt}
% Adapted from https://tex.stackexchange.com/questions/29834/closed-square-root-symbol
\newcommand{\ClosedSqrt}[1][\hphantom{3}]{\def\DHLindex{#1}\mathpalette\DHLhksqrt}%
\def\DHLhksqrt#1#2{%
\setbox0=\hbox{$#1\OldSqrt[\DHLindex]{#2\,}$}\dimen0=\ht0\relax%
\advance\dimen0-0.2\ht0\relax%
\setbox2=\hbox{\vrule height\ht0 depth -\dimen0}%
{\box0\lower0.4pt\box2}%
}
%% Attempt 1: Package amsmath Error: Invalid use of `\leftroot`.
\RenewDocumentCommand{\sqrt}{O{\hphantom{3}} O{-2} O{2} m}{\ClosedSqrt[\leftroot{#2}\uproot{#3}#1]{#4}}%
%%% Attempt 2: Package amsmath Error: Invalid use of `\leftroot`.
%\RenewDocumentCommand{\sqrt}{O{\hphantom{3}} O{-2} O{2} m}{\def\DHLindex{\leftroot{#2}\uproot{#3}#1}\mathpalette\DHLhksqrt}%
%\def\DHLhksqrt#1#2{%
% \setbox0=\hbox{$#1\OldSqrt[\DHLindex]{#2\,}$}\dimen0=\ht0\relax%
% \advance\dimen0-0.2\ht0\relax%
% \setbox2=\hbox{\vrule height\ht0 depth -\dimen0}%
% {\box0\lower0.4pt\box2}%
%}%
%%% Attempt 3: Argument of `\DHLhksqrt` has an extra }
%\RenewDocumentCommand{\sqrt}{O{\hphantom{3}} O{-2} O{2} m}{\def\DHLindex{#1}\mathpalette\DHLhksqrt}%
%\def\DHLhksqrt#1#2#3#4{%
% \setbox0=\hbox{$#1\OldSqrt[\leftroot{#2}\uproot{#3}\DHLindex]{#4\,}$}\dimen0=\ht0\relax%
% \advance\dimen0-0.2\ht0\relax%
% \setbox2=\hbox{\vrule height\ht0 depth -\dimen0}%
% {\box0\lower0.4pt\box2}%
%}%
\begin{document}\noindent
\[2 \sqrt{k} \]
\[\sqrt[\beta]{k} \quad\sqrt[\beta][-3][3]{k} \]
\[\sqrt[\beta]{\frac{k}{h}} \quad\sqrt[\beta][-2][6]{\frac{k}{h}}\]
\end{document}
答案1
这类似于在宏中捆绑几个键值参数(例如\includegraphics
)的问题:在执行 (的 amsmath 版本)时\sqrt
,也就是\OldSqrt
, 的内容[]
被解析为\leftroot
&c。当时只\DHLindex
发现 ,后来\leftroot
就没用了。
改变
\setbox0=\hbox{$#1\OldSqrt[\DHLindex]{#2\,}$}\dimen0=\ht0\relax%
到
\setbox0=\hbox{$#1\expandafter\OldSqrt\expandafter[\DHLindex]{#2\,}$}\dimen0=\ht0\relax%
使其\leftroot
可见并且第一次尝试就成功。
不知道它是否能满足你的要求。
这也应该适用于第二次尝试。没有看第三次尝试。
编辑:您到底想了解\DHLhksqrt
宏的哪些方面?据我所知,它需要两个参数,从中构建一个根表达式,然后对其进行测量并尝试(成功与否尚有争议)用附加垂直规则进行修饰。
编辑2:为了让它看起来更好一点,至少\DHLhksqrt
需要考虑根索引的移动多于根符号,否则附加规则的位置太高。
编辑3:好的,这是我对位移问题的修正。根被格式化了两次,因此可能存在性能问题。
\def\DHLhksqrt#1#2{%
\setbox0=\hbox{$#1\OldSqrt{#2\,}$}\dimen0=\ht0\relax%
\advance\dimen0-0.2\ht0\relax%
\setbox2=\hbox{\vrule height\ht0 depth -\dimen0}%
{\hbox{$#1\expandafter\OldSqrt\expandafter[\DHLindex]{#2\,}$}\lower0.4pt\box2}%
}
编辑4:不幸的是,在粗体数学模式下,根符号上方有更多空白。看看
\fboxsep0pt
\fbox{$f(x) = \OldSqrt{e^{2x}}$}
\fbox{\boldmath$ f(x) = \OldSqrt{e^{2x}}$}
因此,在制定“关闭规则”时必须考虑到这一点:
\makeatletter
\newcommand*\bold@name{bold}
\def\DHLhksqrt#1#2{%
\setbox0=\hbox{$#1\OldSqrt{#2\,}$}\dimen0=\ht0\relax%
\advance\dimen0-0.2\ht0\relax%
\setbox2=\hbox{\vrule height\ht0 depth -\dimen0}%
{%
\hbox{$#1\expandafter\OldSqrt\expandafter[\DHLindex]{#2\,}$}%
\lower\ifx\math@version\[email protected]\else0.4pt\fi\box2%
}%
}
\makeatother