自定义LaTeX生成过程

有几种方法可以自定义latex()命令生成的LaTeX代码。在notebook与Sage命令行里有一个名为latex的预定义对象,你可以输入latex.,然后按Tab键查看它的方法(注意句号)。

一个很好的例子是latex.matrix_delimiters方法。它可用于更改矩阵周围的符号(大括号,方括号,大括号或是竖线)。不必强制使用特定的样式,你可以随意混合和匹配。请注意,LaTeX的反斜线需要一个额外的反斜线,以便它们可以在Python字符串中正确地转义。

  1. sage: A = matrix(ZZ, 2, 2, range(4))
  2. sage: latex(A)
  3. \left(\begin{array}{rr}
  4. 0 & 1 \\
  5. 2 & 3
  6. \end{array}\right)
  7. sage: latex.matrix_delimiters(left='[', right=']')
  8. sage: latex(A)
  9. \left[\begin{array}{rr}
  10. 0 & 1 \\
  11. 2 & 3
  12. \end{array}\right]
  13. sage: latex.matrix_delimiters(left='\\{', right='\\}')
  14. sage: latex(A)
  15. \left\{\begin{array}{rr}
  16. 0 & 1 \\
  17. 2 & 3
  18. \end{array}\right\}

latex.vector_delimiter也有相似的效果。

常见的环和域(整数,有理数,实数等)的排版方式可以通过latex.blackboard_bold方法进行控制。这些集合默认情况下以粗体排版,但有时也可以以双重方式(有时在书面工作中完成)来编写。这是通过重新定义Sage内置的\Bold{}宏来完成的。

  1. sage: latex(QQ)
  2. \Bold{Q}
  3. sage: from sage.misc.html import MathJax
  4. sage: mj=MathJax()
  5. sage: mj(QQ)
  6. <html><script type="math/tex; mode=display">\newcommand{\Bold}[1]{\mathbf{#1}}\Bold{Q}</script></html>
  7. sage: latex.blackboard_bold(True)
  8. sage: mj(QQ)
  9. <html><script type="math/tex; mode=display">\newcommand{\Bold}[1]{\mathbb{#1}}\Bold{Q}</script></html>
  10. sage: latex.blackboard_bold(False)

可以利用TeX的可扩展性来添加新的宏和软件包。首先,可以添加单个宏,以便在MathJax解释notebook中的TeX片段时使用它们。

  1. sage: latex.extra_macros()
  2. ''
  3. sage: latex.add_macro("\\newcommand{\\foo}{bar}")
  4. sage: latex.extra_macros()
  5. '\\newcommand{\\foo}{bar}'
  6. sage: var('x y')
  7. (x, y)
  8. sage: latex(x+y)
  9. x + y
  10. sage: from sage.misc.html import MathJax
  11. sage: mj=MathJax()
  12. sage: mj(x+y)
  13. <html><script type="math/tex; mode=display">\newcommand{\Bold}[1]{\mathbf{#1}}\→newcommand{\foo}{bar}x + y</script></html>

如果在超出MathJax可以处理的范围内调用系统安装的TeX,也可以使用以这种方式添加额外的宏。latex_extra_preamble用于生成完整的LaTeX文档的preamble区,以下内容说明了如何完成此操作。像往常一样,需要在Python字符串中使用双反斜杠。

  1. sage: latex.extra_macros('')
  2. sage: latex.extra_preamble('')
  3. sage: from sage.misc.html import latex_extra_preamble
  4. sage: print(latex_extra_preamble())
  5. \newcommand{\ZZ}{\Bold{Z}}
  6. ...
  7. \newcommand{\Bold}[1]{\mathbf{#1}}
  8. sage: latex.add_macro("\\newcommand{\\foo}{bar}")
  9. sage: print(latex_extra_preamble())
  10. \newcommand{\ZZ}{\Bold{Z}}
  11. ...
  12. \newcommand{\Bold}[1]{\mathbf{#1}}
  13. \newcommand{\foo}{bar}

同样,对于更大或更复杂的LaTeX表达式,可以将包(或其他任何内容)添加到LaTeX文件的preamble区中。可以使用latex.add_to_preamble命令将任何内容合并到preamble区中,并且专用命令latex.add_package_to_preamble_if_available将首先检查某个包是否确实可用,然后再尝试将其添加到preamble区中。

在这里,我们将几何图形包添加到preamble区中,并使用它来设置TeX将使用的页面上区域的大小(设置边距)。同样地,注意Python字符串中需要双反斜杠。

  1. sage: from sage.misc.html import latex_extra_preamble
  2. sage: latex.extra_macros('')
  3. sage: latex.extra_preamble('')
  4. sage: latex.add_to_preamble('\\usepackage{geometry}')
  5. sage: latex.add_to_preamble('\\geometry{letterpaper,total={8in,10in}}')
  6. sage: latex.extra_preamble()
  7. '\\usepackage{geometry}\\geometry{letterpaper,total={8in,10in}}'
  8. sage: print(latex_extra_preamble())
  9. \usepackage{geometry}\geometry{letterpaper,total={8in,10in}}
  10. \newcommand{\ZZ}{\Bold{Z}}
  11. ...
  12. \newcommand{\Bold}[1]{\mathbf{#1}}

如下所示,可以添加特定的程序包并检查其是否存在。作为示例,我们仅演示尝试将可能不存在的包添加到preamble区中。

  1. sage: latex.extra_preamble('')
  2. sage: latex.extra_preamble()
  3. ''
  4. sage: latex.add_to_preamble('\\usepackage{foo-bar-unchecked}')
  5. sage: latex.extra_preamble()
  6. '\\usepackage{foo-bar-unchecked}'
  7. sage: latex.add_package_to_preamble_if_available('foo-bar-checked')
  8. sage: latex.extra_preamble()
  9. '\\usepackage{foo-bar-unchecked}'