我想在 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
语法...
更多信息:
- http://docs.mathjax.org/en/latest/tex.html#tex-and-latex-extensions
- https://github.com/mathjax/MathJax-third-party-extensions
由于似乎没有我可以识别的 MathJax 解决方案,即使在手动编辑 HTML 文件时,我也没有仔细研究如何获取额外的标签<script>
。