使用 LuaTeX 来生成好看的平方根吗?

使用 LuaTeX 来生成好看的平方根吗?

经常会有这样的问题:“为什么平方根这么难看?为什么会有身高差异?”

$\sqrt{x} \, \sqrt{y} \, \sqrt{X}$

然后答案听起来都像:“使用\phantom\mathstrut\smash[b]。” 并不令人满意,因为所有建议都是手动调整的。

现在我们已经使用 LuaTeX 十多年了。为什么没有使用 lua 回调的解决方案?

一个好\sqrt兆头应该...

  • 具有最小高度(例如:插入\phantom{0})。
  • 当只有字母的下行部分或下标()时,不要加深\smash[b]。当然,当有较大的分数或另一个较大的构造时,底部不应被压碎。
  • 忽略\underbraces。

如果我对 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 中,您可以进行设置并定义自己的mathradicals 实例。默认情况下,\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 讨论后,我们一致认为使用sqrtin 这个名称\sqrt[3]{x}有点奇怪,因此从现在起,ConTeXt 中的基本数学根号将改为\rootInstead of \sqrt(但将 with\sqrt作为其副本,以免破坏兼容性)。还将支持输入类似\root[n=3]{x}Instead of 的字符\root[3]{x}

相关内容