使用带有闭平方根符号的 \leftroot{}、\uproot{}

使用带有闭平方根符号的 \leftroot{}、\uproot{}

正如所提到的这是好看的 p 次根的答案amsmath包提供\leftroot{}\uproot{}允许您将根的位置移动到左边, 和向上以小增量进行。使用这个,我能够在和包\sqrt的帮助下重新定义如下:xparseletltxmacro

\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有一个额外的 }

问题:

  1. 如何创建一个\sqrt允许三个可选参数的封闭符号:根索引、\leftroot值和\uproot值?
  2. 奖励:宏如何\DHLhksqrt工作

参考:

代码:

\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

粗根

相关内容