在 Sphinx 中用括号写条件方程

在 Sphinx 中用括号写条件方程

我想在 Sphinx 中编写带有单侧花括号的条件语句,如下所示:

在此处输入图片描述

在 Latex 中,我能做的最好的事情如下:

\[
x = \begin{cases}
        \begin{split}
            d&,               &     I_x &\leq I_p - t \\
            s&, \; \; I_p - t &\leq I_x &\leq I_p + t \\
            b&, \; \; I_p + t &\leq I_x
        \end{split}
    \end{cases}
\] 

但它在条件中间提供了一些空白处(标记为红色),如下所示:

在此处输入图片描述

但即便如此,在 Sphinx 中也无法实现。最终会导致大错误。

那么如何在 Latex 和 Sphinx 中实现它?

答案1

对于 LaTeX 我会使用array

\documentclass{article}
\usepackage{amsmath,array}
\begin{document}
\[
x =
\left\{
\begin{array}{
  @{}% no padding
  l@{\quad}% some padding
  r@{}% no padding
  >{{}}r@{}% no padding
  >{{}}l@{}% no padding
}
  d,&         &     I_x &\leq I_p - t \\
  s,& I_p - t &\leq I_x &\leq I_p + t \\
  b,& I_p + t &\leq I_x
\end{array}
\right.
\]
\end{document}

如果不等式的中心项不具有相同的宽度,则需要更多的对齐点来使它们居中。

在此处输入图片描述

我们不希望在array通常插入的列之间自动填充任何内容,因此我在列之间(以及数组的开头和结尾)放置了@{}禁用插入的行。例外:在第一列和第二列之间,我们需要一些空间。

这个神秘的>{{}}部分很容易解释:当 TeX 处理第二行的第二列和第三列时,它本质上会这样做

$I_p-t$$\leq I_x$

因为它将每个单元格视为单独的公式。这不会提供正确的间距,因此我们{}在第三列的单元格开头插入,最终结果是

$I_p-t$${}\leq I_x$

排版完全一样

$I_p-t\leq I_x$

并获得了期望的结果。

答案2

对于 Sphinx,您可以直接使用@egreg 的解决方案,

.. math::
   :nowrap:

   \[
   x =
   \left\{
   \begin{array}{
     @{}% no padding
     l@{\quad}% some padding
     r@{}% no padding
     >{{}}r@{}% no padding
     >{{}}l@{}% no padding
   }
     d,&         &     I_x &\leq I_p - t \\
     s,& I_p - t &\leq I_x &\leq I_p + t \\
     b,& I_p + t &\leq I_x
   \end{array}
   \right.
   \]

并确保你的conf.py加载扩展sphinx.ext.imgmath(或.mathjax:数学指令需要一个或另一个,但 LaTeX 文件将简单地继承上述代码,并且 PDF 输出将与手写 LaTeX 源一样工作)。

HTML 与imgmath

您需要添加imgmath_latex_preamble = r'\usepackage{array}'到您的conf.py(当然还有加载sphinx.ext.imgmath扩展)。

在此处输入图片描述

对于svg而不是png,添加imgmath_image_format = 'svg'conf.py

HTML 与MathJax

我不知道该怎么做。似乎没有array.js对 MathJax 的贡献扩展。有siunitx.js。作为 LaTeX 包,它需要array,但这并不意味着siunitx.js实现array语法...

更多信息:

由于似乎没有我可以识别的 MathJax 解决方案,即使在手动编辑 HTML 文件时,我也没有仔细研究如何获取额外的标签<script>

相关内容