自定义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 MathJax
sage: 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 + y
sage: from sage.misc.html import MathJax
sage: 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_preamble
sage: 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_preamble
sage: 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}'