经常会有这样的问题:“为什么平方根这么难看?为什么会有身高差异?”
$\sqrt{x} \, \sqrt{y} \, \sqrt{X}$
然后答案听起来都像:“使用\phantom
,\mathstrut
或\smash[b]
。” 并不令人满意,因为所有建议都是手动调整的。
现在我们已经使用 LuaTeX 十多年了。为什么没有使用 lua 回调的解决方案?
一个好\sqrt
兆头应该...
- 具有最小高度(例如:插入
\phantom{0}
)。 - 当只有字母的下行部分或下标()时,不要加深
\smash[b]
。当然,当有较大的分数或另一个较大的构造时,底部不应被压碎。 - 忽略
\underbrace
s。
如果我对 LuaTeX 有更多了解,我会尝试创建 MWE。在 LuaTeX 手册中,我们可以找到radical
节点等等。也许有人有想法。
编辑(作为对 projetmbc 评论的回答):
我的第一个建议是使 和 的平方根高度相同\sqrt x
。\sqrt X
\sqrt 2
第二个将导致$\sqrt g$
、\sqrt x
和 的高度相等\sqrt{x_1}
。
第三个将阻止下支撑的平方根符号增长:$\sqrt{\underbrace{something}_{something}}$
我无法想象没有 LuaTeX 的解决方案。
答案1
我不相信强制(大多数)\sqrt
表达式具有相同高度和深度的无理数是一种改进。但是,一如既往,如果你真的明白自己在做什么,那么使用一刀切的方法可能没问题。
以下基于 LuaLaTeX 的解决方案具有(a)一个名为的实用 LaTeX 宏\lsqrt
和(b)两个 Lua 函数:lsqrt
完成几乎所有的实际工作,并且checkroot
(由 调用lsqrt
)包含一系列条件;如果满足其中一个(或多个)条件,\lsqrt
则不会执行任何特殊操作,即,它的行为与基本\sqrt
宏相同。
生成的平方根符号水平线的默认高度\lsqrt
设置为k^2
刚好适合。请注意,这比 OP 要求的要高一点;但是,由于高度差仅为0.6pt
(至少对于以10pt
作为主文档字体大小的 Computer Modern 而言),我认为选择这个稍大的高度是合理的。当然,如果您更喜欢适合k
但不适合的高度k^2
,只需将 的两个实例都更改为\\vphantom{k^2}
。\\vphantom{k}
(附言:\\
双反斜杠符号出现是因为对于 Lua 来说,\
也有特殊含义;但是, Lua 和 TeX 的特殊含义\
完全不同。要输出Lua 中的单个反斜杠字符,必须输入 \\
。
% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{amsmath}
\usepackage{luacode} % for 'luacode*' env. and '\luastringN' macro
%% Lua-side code: 2 Lua functions: checkoptargroot, lsqrt
\begin{luacode*}
function checkroot ( s )
if s:find ( "\\[dt]?frac" ) -- \frac term
or s:find ( "\\int" ) -- integral symbol
or s:find ( "\\sum" ) -- summation symbol
or s:find ( "%^%s?%b{}" ) -- exponent term encased in matching curly braces
then
return true
else
return false
end
end
function lsqrt ( b , s ) -- this function does most of the work
if b=="" then -- no optional argument was provided to "\lsqrt"
if checkroot ( s ) then
tex.sprint ( "\\sqrt{".. s .."}" ) -- nothing special to do
else
tex.sprint ( "\\sqrt{\\smash{".. s ..
"}\\vphantom{k^2}}\\vphantom{"..s.."}" )
end
else -- need to handle non-empty optional argument
if checkroot ( s ) then
tex.sprint ( "\\sqrt["..b.."]{".. s .."}" ) -- nothing special to do
else
tex.sprint ( "\\sqrt["..b.."]{\\smash{".. s ..
"}\\vphantom{k^2}}\\vphantom{"..s.."}" )
end
end
end
\end{luacode*}
%% LaTeX-side code: utility macro to access the 'lsqrt' function
\newcommand\lsqrt[2][]{\directlua{lsqrt(\luastringN{#1},\luastringN{#2})}}
\begin{document}
$\sqrt{y}$ $\sqrt{x}$ $\sqrt{t}$ $\sqrt{k}$ $\sqrt{b_q^2}$ vs.\
$\lsqrt{y}$ $\lsqrt{x}$ $\lsqrt{t}$ $\lsqrt{k}$ $\lsqrt{b_q^2}$
\medskip
$\sqrt[3]{y}$ $\sqrt[4]{x}$ $\sqrt[5]{t}$ $\sqrt[6]{k}$ $\sqrt[7]{b_q^2}$ vs.\
$\lsqrt[3]{y}$ $\lsqrt[4]{x}$ $\lsqrt[5]{t}$ $\lsqrt[6]{k}$ $\lsqrt[7]{b_q^2}$
\medskip
$\sqrt{\frac{1}{2}}$ $\lsqrt{\frac{1}{2}}$,
$\sqrt[3]{\dfrac{1}{5}}$ $\lsqrt[3]{\dfrac{1}{5}}$,
$\sqrt{a_q^{-x^2/2}}$ $\lsqrt{a_q^{-x^2/2}}$
\end{document}
答案2
我认为你不会找到一个适合你所有情况的版本,而且正如评论中提到的,我认为这是宏包的问题。既然你已经得到了一个令人满意的 LaTeX 答案,我提供了一个 ConTeXt 答案,希望对某些人有所帮助。
在 ConTeXt 中,您可以进行设置并定义自己的mathradical
s 实例。默认情况下,\sqrt
有一个具有高度但没有深度的支柱,但可以更改。此外,正如我们将看到的,可以设置内容的高度和深度。让我们展示一些示例
\usemodule[visual] % for \fakewords only
\starttext
\fakewords{25}{30}
\startformula
\sqrt{y}+\sqrt{x} + \sqrt{b_q^2} + \sqrt{\frac{1}{5}} + \root[n=3]{x+y}
\breakhere
\sqrt[depth=1sp]{y} + \sqrt[strut=no]{x} + \sqrt[depth=1sp]{b_q^2} + \sqrt[depth=6pt]{\frac{1}{5}} + \sqrt[depth=1sp][3]{x+y}
\stopformula
\fakewords{25}{30}
\definemathradical
[mysqrt]
[depth=1sp]
\startformula
\mysqrt{y} + \mysqrt{x} + \mysqrt{b_q^2} + \mysqrt{\frac{1}{5}} + \mysqrt[depth=6pt]{\frac{1}{5}} + \mysqrt[3]{x+y}
\stopformula
\fakewords{25}{30}
\startformula
\sqrt{\int_a^c 2x\dd x}
=
\sqrt{\underbrace{c^2-a^2}_{=b^2}}
=
\sqrt[depth=4pt]{\underbrace{c^2-a^2}_{=b^2}}
=
\mysqrt{\underbrace{c^2-a^2}_{=b^2}}
\stopformula
\fakewords{25}{30}
\stoptext
使用以下方法编译此文件context
可得到以下结果:
一些评论:
- 第一个显示的公式的第一行显示默认
\sqrt{}
- 第一个显示的公式中的第二行显示了一些变体,我们可以通过在
\sqrt
宏中插入选项来获得它们。 \mysqrt
对于显示的第三个公式,我们在 的帮助下引入了我们自己的数学根式实例\definemathradical
。要明确设置深度,我们需要将其设置为某个非零值(这是旧构造,零值将返回原始版本)。我们将其设置为非常小的值, 。请注意,在分数 1/5 中,稍微修改深度(我们可以将其作为可选参数添加到)1sp
后看起来会更好。\mysqrt
- 在最后显示的公式中,我们还展示了一些带有下括号的公式。这里你可以看到三个版本,你可以自己选择你喜欢的那个。
好奇:与 Hans 讨论后,我们一致认为使用sqrt
in 这个名称\sqrt[3]{x}
有点奇怪,因此从现在起,ConTeXt 中的基本数学根号将改为\root
Instead of \sqrt
(但将 with\sqrt
作为其副本,以免破坏兼容性)。还将支持输入类似\root[n=3]{x}
Instead of 的字符\root[3]{x}
。