Sage、 Latex 和协同程序

Sage和德州的 Latex 方言有着强烈的协同关系。本节旨在介绍各种交互,从最基本的开始,再到更不寻常的交互。

基本用途

Sage中的每个“对象”都需要有 Latex 表示。您可以通过执行以下命令来访问此制图表达 latex(foo) 哪里 foo 是《圣贤》中的某个对象。输出是一个字符串,应该能相当准确地表示 foo 在Tex的数学模式中使用时(例如,在一对单一美元符号之间)。下面是一些这样的例子。**

sage: var('z')
z
sage: latex(z^12)
z^{12}
sage: latex(sqrt(z^2 + 1/2))
\sqrt{z^{2} + \frac{1}{2}}
sage: latex('a string')
\text{\texttt{a{ }string}}
sage: latex(QQ)
\Bold{Q}
sage: latex(ZZ['x'])
\Bold{Z}[x]
sage: latex(matrix(QQ, 2, 3, [[2,4,6],[-1,-1,-1]]))
\left(\begin{array}{rrr}
2 & 4 & 6 \\
-1 & -1 & -1
\end{array}\right)

通过这种方式,可以有效地使用Sage来构造LaTeX文档的各个部分:在Sage中创建或计算对象 latex(foo) 对象的 foo 然后将LaTeX字符串剪切/粘贴到文档中。

该命令 view(foo) 将显示呈现的LaTeX表示形式 foo 。在后台,该命令运行 latex(foo) 并将LaTeX字符串合并到一个简单的LaTeX文档中,使用系统范围的TeX安装处理该文档,最后将调用适当的查看器来显示输出。

在Jupyter笔记本中,您可以自动看到输入命令输出的渲染LaTeX表示。您可以通过执行以下命令启动此自动呈现 %display latex (并停止执行 %display plain )。

因此,在Jupyter笔记本中,你会得到

Jupyter笔记本电脑使用 MathJax 在Web浏览器中干净地呈现数学。MathJax是一个开源的数学显示引擎,可以在所有现代浏览器中使用。它能够渲染 Latex 的一个很大的子集,但不是完全的。它不支持复杂的表格、分区或文档管理之类的事情,因为它面向精确呈现LaTeX的数学片段。

Jupyter笔记本中的自动 Latex 渲染(带 %display latex On)在内部通过 sage.misc.html.MathJax 班级。此类的对象通过以下方式转换Sage对象 latex() 转换为MathJax喜欢的一种形式的HTML,然后将其包装在HTML中。**

sage: from sage.misc.html import MathJax
sage: mj = MathJax()
sage: var('z')
z
sage: mj(z^12)
<html>\[z^{12}\]</html>
sage: mj(sqrt(z^2 + 1/2))
<html>\[\sqrt{z^{2} + \frac{1}{2}}\]</html>
sage: mj('a string')
<html>\[\verb|a|\verb| |\verb|string|\]</html>
sage: mj(QQ)
<html>\[\newcommand{\Bold}[1]{\mathbf{#1}}\Bold{Q}\]</html>
sage: mj(ZZ['x'])
<html>\[\newcommand{\Bold}[1]{\mathbf{#1}}\Bold{Z}[x]\]</html>
sage: mj(matrix(QQ, 2, 3, [[2,4,6],[-1,-1,-1]]))
<html>\[\left(\begin{array}{rrr}
2 & 4 & 6 \\
-1 & -1 & -1
\end{array}\right)\]</html>

这对于了解是否需要了解Sage对象的LaTeX渲染非常有用。

定制 Latex 生成

有几种方法可以自定义由 latex() 指挥部。有一个名为的预定义对象 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_delimiters 方法的工作原理类似。

常见的环和域(整数、有理、实数等)的方式Are排版可以由 latex.blackboard_bold 方法。默认情况下,这些字体是粗体排版,但也可以选择以双面打字的方式书写,就像有时在书面工作中所做的那样。这是通过重新定义 \Bold{} Sage内置的宏。**

sage: latex(QQ)
\Bold{Q}
sage: from sage.misc.html import MathJax
sage: mj = MathJax()
sage: mj(QQ)
<html>\[\newcommand{\Bold}[1]{\mathbf{#1}}\Bold{Q}\]</html>
sage: latex.blackboard_bold(True)
sage: mj(QQ)
<html>\[\newcommand{\Bold}[1]{\mathbb{#1}}\Bold{Q}\]</html>
sage: latex.blackboard_bold(False)

在Jupyter笔记本中,

可以通过添加新宏来利用LaTeX的可扩展特性。可以添加单独的宏,以便在MathJax解释LaTeX片段时使用它们。**

sage: latex.add_macro(r"\newcommand{\sqrt}[1]{(#1)^\frac{1}{2}}")
sage: latex.extra_macros()
'\\newcommand{\\sqrt}[1]{(#1)^\\frac{1}{2}}'
sage: var('x y')
(x, y)
sage: latex(sqrt(x+y))
\sqrt{x + y}
sage: from sage.misc.html import MathJax
sage: mj = MathJax()
sage: mj(sqrt(x + y))
<html>\[\newcommand{\sqrt}[1]{(#1)^\frac{1}{2}}\sqrt{x + y}\]</html>
sage: latex.extra_macros('')

在Jupyter笔记本中,

定制 Latex 加工

系统范围内的TeX被调用来处理完整的LaTeX文档,例如当您 view(foo) ,在哪里 foo 是一个复杂的Sage对象,对于 MathJax 去处理。该命令 latex_extra_preamble 用于构建完整LaTeX文档的前言,因此下面说明如何实现这一点。如往常一样,请注意需要在Python字符串中使用双反斜杠。**

sage: latex.extra_macros('')
sage: latex.extra_preamble('')
sage: from sage.misc.latex 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文件的前导中。任何内容都可以包含在前言中 latex.add_to_preamble 命令和专用命令 latex.add_package_to_preamble_if_available 在尝试将某个包添加到前言之前,将首先检查是否确实有某个包可用。

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

sage: from sage.misc.latex 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}}

可以添加特定的包,同时检查其是否存在,如下所示。作为一个例子,我们只是说明了在序言中添加一个假定不存在的一揽子计划的企图。**

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}'

还可以定制所使用的TeX方言,以及输出和相关查看器的性质。

备注

Sage包含了构建和使用Sage所需的几乎所有内容,但Tex本身是一个重要的例外。因此,在以下情况下,您需要安装完整的TeX系统,以及一些相关的转换实用程序。许多版本的Linux都有基于TeXLive的包,MacOS上有MacTeX,Windows上有MiKTeX。

这个 latex.engine() 命令可以用来控制系统范围内的可执行文件 latexpdflatexxelatex 都是有工作的。什么时候 view() 并将引擎设置为 latex ,生成DVI文件,Sage将使用DVI查看器(如xdvi)来显示结果。相比之下,使用 view() 当引擎设置为 pdflatex 将生成一个PDF作为结果,Sage将调用您系统的实用程序来显示PDF文件(Acrobat、okular、evince等)。

对于您使用这些设施进行的练习,有一些预先打包的示例。要使用这些功能,必须将 sage.misc.latex.latex_examples 对象,该对象是 sage.misc.latex.LatexExamples 类,如下所示。这个类目前有交换图、组合图、纽结理论和pstraks的例子,分别练习以下程序包:xy、tkz-graph、xypic、pstraks。导入后,在上使用Tab键完成 latex_examples 查看预打包的示例。调用每个示例将为您提供有关正确呈现该示例所需的一些解释。要实际查看这些示例,有必要使用 view(foo) (一旦前同步码、引擎等都正确设置)。**

sage: from sage.misc.latex import latex_examples
sage: foo = latex_examples.diagram()
sage: foo
LaTeX example for testing display of a commutative diagram produced
by xypic.
<BLANKLINE>
To use, try to view this object -- it will not work.  Now try
'latex.add_to_preamble("\\usepackage[matrix,arrow,curve,cmtip]{xy}")',
and try viewing again. You should get a picture (a part of the diagram arising
from a filtered chain complex).

关于如何处理复杂的LaTeX表达式的示例,让我们看看组合图的示例,该示例使用 tkz-graph Latex 包装。

备注

tkz-graph LaTeX产品包构建在 tikz 前端连接到 pgf 类库。呈现组合图需要使用 pgf 库和文件 tkz-graph.stytkz-berge.sty 。它们很可能已经是系统范围的TeX安装的一部分。即使没有,也应该很容易找到安装它们的说明。

首先,我们通过将相关包添加到LaTeX文件的序言中来确保将其包括在内。**

sage: latex.extra_preamble('\\usepackage{tikz}\n\\usepackage{tkz-graph}\n'
....:                      '\\usepackage{tkz-berge}\n\\usetikzlibrary{arrows,shapes}')

当DVI文件用作中间格式时,图形图像不能正确形成,因此最好将LaTeX引擎设置为 pdflatex 可执行文件::

sage: latex.engine('pdflatex')

在这一点上,命令如下 view(graphs.CompleteGraph(4)) 应生成带有完整图形的适当图像的PDF K_4

实际上,可以省略预备步骤,因为为图表自动正确地设置了前导码 pdflatex 是Sage中的默认LaTeX引擎。请在重新启动Sage后重试该命令。

请注意,有多种选项可以通过以下方式影响图形在LaTeX中的呈现方式 tkz-graph ,这超出了本节的范围。请参阅小节 sage.graphs.graph_latex 有关说明和详细信息,请参阅《参考手册》。

SageTeX

SageTeX是一个可用于进一步集成Tex和Sage的程序。它是一组TeX宏,允许LaTeX文档包含指令,让Sage计算各种对象并使用 latex() 。看见 使用SageTeX 以获取更多信息。