自定义LaTeX生成过程
有几种方法可以自定义latex()命令生成的LaTeX代码。在notebook与Sage命令行里有一个名为latex的预定义对象,你可以输入latex.,然后按Tab键查看它的方法(注意句号)。
一个很好的例子是latex.matrix_delimiters方法。它可用于更改矩阵周围的符号(大括号,方括号,大括号或是竖线)。不必强制使用特定的样式,你可以随意混合和匹配。请注意,LaTeX的反斜线需要一个额外的反斜线,以便它们可以在Python字符串中正确地转义。
sage: A = matrix(ZZ, 2, 2, range(4))sage: latex(A)\left(\begin{array}{rr}0 & 1 \\2 & 3\end{array}\right)sage: latex.matrix_delimiters(left='[', right=']')sage: latex(A)\left[\begin{array}{rr}0 & 1 \\2 & 3\end{array}\right]sage: latex.matrix_delimiters(left='\\{', right='\\}')sage: latex(A)\left\{\begin{array}{rr}0 & 1 \\2 & 3\end{array}\right\}
latex.vector_delimiter也有相似的效果。
常见的环和域(整数,有理数,实数等)的排版方式可以通过latex.blackboard_bold方法进行控制。这些集合默认情况下以粗体排版,但有时也可以以双重方式(有时在书面工作中完成)来编写。这是通过重新定义Sage内置的\Bold{}宏来完成的。
sage: latex(QQ)\Bold{Q}sage: from sage.misc.html import MathJaxsage: mj=MathJax()sage: mj(QQ)<html><script type="math/tex; mode=display">\newcommand{\Bold}[1]{\mathbf{#1}}\Bold{Q}</script></html>sage: latex.blackboard_bold(True)sage: mj(QQ)<html><script type="math/tex; mode=display">\newcommand{\Bold}[1]{\mathbb{#1}}\Bold{Q}</script></html>sage: latex.blackboard_bold(False)
可以利用TeX的可扩展性来添加新的宏和软件包。首先,可以添加单个宏,以便在MathJax解释notebook中的TeX片段时使用它们。
sage: latex.extra_macros()''sage: latex.add_macro("\\newcommand{\\foo}{bar}")sage: latex.extra_macros()'\\newcommand{\\foo}{bar}'sage: var('x y')(x, y)sage: latex(x+y)x + ysage: from sage.misc.html import MathJaxsage: mj=MathJax()sage: mj(x+y)<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字符串中使用双反斜杠。
sage: latex.extra_macros('')sage: latex.extra_preamble('')sage: from sage.misc.html import latex_extra_preamblesage: print(latex_extra_preamble())\newcommand{\ZZ}{\Bold{Z}}...\newcommand{\Bold}[1]{\mathbf{#1}}sage: latex.add_macro("\\newcommand{\\foo}{bar}")sage: print(latex_extra_preamble())\newcommand{\ZZ}{\Bold{Z}}...\newcommand{\Bold}[1]{\mathbf{#1}}\newcommand{\foo}{bar}
同样,对于更大或更复杂的LaTeX表达式,可以将包(或其他任何内容)添加到LaTeX文件的preamble区中。可以使用latex.add_to_preamble命令将任何内容合并到preamble区中,并且专用命令latex.add_package_to_preamble_if_available将首先检查某个包是否确实可用,然后再尝试将其添加到preamble区中。
在这里,我们将几何图形包添加到preamble区中,并使用它来设置TeX将使用的页面上区域的大小(设置边距)。同样地,注意Python字符串中需要双反斜杠。
sage: from sage.misc.html import latex_extra_preamblesage: latex.extra_macros('')sage: latex.extra_preamble('')sage: latex.add_to_preamble('\\usepackage{geometry}')sage: latex.add_to_preamble('\\geometry{letterpaper,total={8in,10in}}')sage: latex.extra_preamble()'\\usepackage{geometry}\\geometry{letterpaper,total={8in,10in}}'sage: print(latex_extra_preamble())\usepackage{geometry}\geometry{letterpaper,total={8in,10in}}\newcommand{\ZZ}{\Bold{Z}}...\newcommand{\Bold}[1]{\mathbf{#1}}
如下所示,可以添加特定的程序包并检查其是否存在。作为示例,我们仅演示尝试将可能不存在的包添加到preamble区中。
sage: latex.extra_preamble('')sage: latex.extra_preamble()''sage: latex.add_to_preamble('\\usepackage{foo-bar-unchecked}')sage: latex.extra_preamble()'\\usepackage{foo-bar-unchecked}'sage: latex.add_package_to_preamble_if_available('foo-bar-checked')sage: latex.extra_preamble()'\\usepackage{foo-bar-unchecked}'
