Sage、 Latex 和朋友们

作者:Rob Beezer(2010-05-23)

Sage与TeX的 Latex 方言有着强烈的协同关系。本节旨在介绍各种各样的互动,从最基本的开始,到更不寻常和神秘的。(因此,您可能不想在第一次阅读本教程时阅读整个部分。)

概述

通过对Sage所采用的三种主要方法的力学原理的简要概述,可能最容易理解 Latex 的各种用途。

  1. Sage中的每个“对象”都需要有一个 Latex 表示。您可以通过在笔记本或sage命令行中执行, latex(foo) 在哪里? foo 是Sage的目标。输出是一个字符串,它应该呈现 foo 在TeX的数学模式中使用时(例如,在一对单美元符号之间括起来时)。下面是一些例子。

    通过这种方式,Sage可以有效地用于构建LaTeX文档的部分:在Sage中创建或计算一个对象,print latex() 并将其剪切/粘贴到文档中。

  2. 笔记本界面配置为使用 MathJax 在web浏览器中清晰地呈现数学。MathJax是一个开放源码的JavaScript数学显示引擎,可以在所有现代浏览器中工作。它能够呈现一个大的,但不是完全完整的TeX子集。它不支持复杂的表、分区或文档管理,因为它的目标是精确地呈现TeX的“片段”。通过转换 latex() 将对象(如上所述)表示为MathJax可接受的HTML形式。

    由于MathJax使用自己的可伸缩字体,它优于其他依赖于将等式或其他TeX片段转换为静态内联图像的方法。

  3. 在Sage命令行中,或者在笔记本电脑中,当LaTeX代码比MathJax所能处理的更复杂时,可以在系统范围内安装LaTeX。Sage包含了构建和使用Sage所需的几乎所有内容,但一个重要的例外是TeX本身。因此,在这些情况下,您需要安装TeX,以及一些相关的转换实用程序,以充分利用功率。

这里我们将演示 latex() 函数。::

sage: var('z')
z
sage: latex(z^12)
z^{12}
sage: latex(integrate(z^4, z))
\frac{1}{5} \, z^{5}
sage: latex('a string')
\text{\texttt{a{ }string}}
sage: latex(QQ)
\Bold{Q}
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)

基本的MathJax功能在笔记本中基本上是自动的,但是我们可以用 MathJax 班级。这个 eval 这个类的函数将Sage对象转换为它的LaTeX表示,然后用HTML包装它,这个HTML调用CSS“math”类,然后使用MathJax。:

sage: from sage.misc.latex import MathJax
sage: mj = MathJax()
sage: var('z')
z
sage: mj(z^12)
<html><script type="math/tex; mode=display">\newcommand{\Bold}[1]{\mathbf{#1}}z^{12}</script></html>
sage: mj(QQ)
<html><script type="math/tex; mode=display">\newcommand{\Bold}[1]{\mathbf{#1}}\Bold{Q}</script></html>
sage: mj(ZZ['x'])
<html><script type="math/tex; mode=display">\newcommand{\Bold}[1]{\mathbf{#1}}\Bold{Z}[x]</script></html>
sage: mj(integrate(z^4, z))
<html><script type="math/tex; mode=display">\newcommand{\Bold}[1]{\mathbf{#1}}\frac{1}{5} \, z^{5}</script></html>

基本用途

如概述所示,利用Sage对 Latex 的支持的最简单方法是使用 latex() 函数创建合法的LaTeX代码以表示数学对象。这些字符串可以合并到独立的LaTeX文档中。这在笔记本和Sage命令行中是相同的。

另一个极端是 view() 命令。在Sage命令行 view(foo) 将创建 foo ,将其合并到一个简单的LaTeX文档中,然后使用系统范围的TeX安装处理该文档。最后,将调用适当的查看器来显示TeX命令的输出。使用哪个版本的TeX,以及输出和相关查看器的性质,可以自定义(请参见 定制 Latex 加工

在笔记本里 view(foo) 命令创建HTML和CSS的适当组合,以便MathJax可以在工作表中正确地呈现LaTeX表示。对于用户来说,它只是创建一个格式良好的输出版本,与Sage的默认ASCII输出不同。并非Sage中的每一个数学对象都有一个LaTeX表示法,可以适应MathJax有限的功能。在这些情况下,可以绕过MathJax解释,而是调用系统范围的TeX,然后将随后的输出转换为图形图像以在工作表中显示。影响和控制这一过程将在下面的章节中讨论 定制 Latex 生成 .

这款笔记本还有两个使用TeX的功能:第一个是工作表第一个单元格上方的“排版”按钮,位于四个下拉框的右侧。当选中时,任何后续的单元格计算都将导致由MathJax解释的输出,因此具有排版质量。请注意,这种影响是不可逆的——需要重新评估以前评估过的单元格。本质上,检查“Typeset”按钮等同于在 view() 命令。

笔记本的第二个功能是在注释工作表时输入TeX。当光标放在工作表的单元格之间,出现蓝色条时,按住shift键单击将打开一个小型字处理程序TinyMCE。这允许输入文本,使用WSIWYG编辑器为样式化文本创建HTML和CSS命令。因此,可以在工作表中添加格式化文本作为注释。但是,一对美元符号或一对双美元符号之间的文本被MathJax解释为内联或显示数学(分别)。

定制 Latex 生成

有几种方法可以自定义 latex() 命令。在笔记本和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_delimiters 方法的工作原理类似。

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

sage: latex(QQ)
\Bold{Q}
sage: from sage.misc.latex 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解释笔记本中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.latex 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>

以这种方式添加的额外宏也将用于系统范围内的TeX版本被调用时所使用的对象比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 将首先检查某个包是否实际可用,然后再尝试将其添加到序言中。

在这里,我们将geometry包添加到preamble中,并使用它来设置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}'

定制 Latex 加工

还可以控制TeX的哪个变体用于系统范围的调用,从而影响输出的性质。类似地,也可以控制笔记本何时使用MathJax(简单的TeX片段)或系统范围的TeX安装(更复杂的LaTeX表达式)。

这个 latex.engine() 可执行文件可用于控制系统范围内的 latexpdflatexxelatex 用于更复杂的 Latex 表达。什么时候? view() 从sage命令行调用,并且引擎设置为 latex ,生成一个dvi文件,Sage将使用dvi查看器(如xdvi)来显示结果。相反,使用 view() 在Sage命令行中,当引擎设置为 pdflatex ,将生成一个PDF作为结果,Sage将调用系统的实用程序来显示PDF文件(acrobat、okular、evince等)。

在笔记本中,有必要介入决定MathJax是否将解释TeX的一个片段,或者如果LaTeX足够复杂以至于全系统的TeX安装应该做这项工作。这个设备是一个字符串列表,如果在一段LaTeX代码中发现任何一个字符串,它就会向笔记本发出信号,绕过MathJax并调用LaTeX(或由 latex.engine() 命令)。此列表由 latex.add_to_mathjax_avoid_listlatex.mathjax_avoid_list 命令。:

sage: latex.mathjax_avoid_list([])
sage: latex.mathjax_avoid_list()
[]
sage: latex.mathjax_avoid_list(['foo', 'bar'])
sage: latex.mathjax_avoid_list()
['foo', 'bar']
sage: latex.add_to_mathjax_avoid_list('tikzpicture')
sage: latex.mathjax_avoid_list()
['foo', 'bar', 'tikzpicture']
sage: latex.mathjax_avoid_list([])
sage: latex.mathjax_avoid_list()
[]

假设在笔记本中生成了一个 Latex 表达式 view() 或者选中“Typeset”按钮,然后通过“mathjax避免列表”识别为需要外部 Latex 安装,然后选择可执行文件(如 latex.engine() )会处理 Latex 。但是,Sage不会生成外部查看器(这是命令行行为),而是尝试将结果转换为一个裁剪紧密的单一图像,然后将其作为单元格的输出插入到工作表中。

转换的进行方式取决于几个因素——主要是您指定了哪些可执行文件作为引擎,哪些转换实用程序在您的系统上可用。四个有用的转换器将涵盖所有可能发生的情况 dvipsps2pdfdvipngImageMagick 一套, convert . 目标是生成一个PNG文件作为输出,并将其包含回工作表中。当一个LaTeX表达式可以通过 Latex 引擎成功地转换为dvi时,dvipng应该完成转换。如果LaTeX表达式和所选引擎创建了一个具有dvipng无法处理的特殊情况的dvi,那么dvips将创建一个PostScript文件。这样的PostScript文件,或由引擎创建的PDF文件,例如 pdflatex ,然后用 convert 实用性。其中两个转换器的存在可以用 have_dvipng()have_convert() 日常工作。

如果您安装了必要的转换器,这些转换将自动完成;如果没有,则会打印一条错误消息,告诉您缺少什么以及在哪里下载。

有关如何处理复杂的 Latex 表达式的具体示例,请参见下一节中的示例 (一个例子:有tkz图的组合图 )使用 Latex tkz-graph 生成组合图的高质量渲染的包。对于其他示例,有一些预打包的测试用例。要使用这些,必须导入 sage.misc.latex.latex_examples 对象的实例 sage.misc.latex.LatexExamples 类,如下所示。这门课目前有交换图,组合图,纽结理论和pstricks的例子,它们分别练习以下的包:xy,tkz图,xypic,pstricks。导入后,使用tab completion on latex_examples 查看预打包的示例。调用每个示例将返回一些解释,说明如何使示例正确呈现。要真正看到示例,有必要使用 view() (一旦前导码、引擎等设置正确)。:

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

一个例子:有tkz图的组合图

使用 tkz-graph 包裹。这个包是建立在 tikz 前端 pgf 类库。因此,所有这些组件都需要是全系统TeX安装的一部分,而且这些组件可能不是在某些TeX实现中打包的最新版本。因此,为了获得最佳效果,有必要或建议将这些作为您个人texmf树的一部分来安装。创建、维护和定制系统范围或个人TeX安装超出了本文档的范围,但是应该很容易找到说明。中列出了所需的文件 全功能TeX装置 .

因此,首先,我们需要通过将相关包添加到最终的LaTeX文档的序言中来确保包含这些包。当dvi文件用作中间格式时,图形的图像不会正确形成,因此最好将latex引擎设置为 pdflatex 可执行文件。在这一点上一个命令 view(graphs.CompleteGraph(4)) 应该在Sage命令行中获得成功,并生成带有完整图形的适当图像的PDF K_4 .

为了在笔记本中获得类似的体验,有必要使用“MathJax避免列表”来禁用图形的LaTeX代码的MathJax处理 tikzpicture 所以这是一个好的选择,让字符串包含在避免列表中。现在, view(graphs.CompleteGraph(4)) 在工作表中,应该调用pdflatex来创建PDF,然后 convert 实用程序将提取一个PNG图形以插入工作表的输出单元格中。下面的命令演示了在笔记本中使用LaTeX处理图形的步骤。:

sage: from sage.graphs.graph_latex import setup_latex_preamble
sage: setup_latex_preamble()
sage: latex.extra_preamble() # random - depends on system's TeX installation
'\\usepackage{tikz}\n\\usepackage{tkz-graph}\n\\usepackage{tkz-berge}\n'
sage: latex.engine('pdflatex')
sage: latex.add_to_mathjax_avoid_list('tikzpicture')
sage: latex.mathjax_avoid_list()
['tikz', 'tikzpicture']

在这一点上,命令 view(graphs.CompleteGraph(4)) 应产生一个图形版本的图表粘贴到笔记本上,已使用 pdflatex 处理 tkz-graph 实现图形的命令。请注意,有多种选项可以影响在LaTeX中通过渲染图形的方式 tkz-graph ,这也超出了本节的范围,有关说明和详细信息,请参阅参考手册中标题为“图形的LaTeX选项”的部分。

全功能TeX装置

TeX与Sage集成的许多更高级的特性需要在系统范围内安装TeX。许多Linux版本都有基于TeX live的基本TeX包,对于OSX有TeXshop,对于Windows则有MikTeX。这个 convert 实用程序是 ImageMagick 套件(应该是一个软件包或一个容易下载的),和三个程序 dvipngps2pdfdvips 可能包含在您的TeX分发中。前两个也可以分别从http://sourceforge.net/projects/dvipng/作为 Ghostscript .

呈现组合图需要最新版本的PGF库和文件 tkz-graph.stytkz-arith.sty 也许 tkz-berge.sty ,全部来自 Altermundus site .

外部程序

有三个程序可以进一步整合TeX和Sage。第一个是sagetex。sagetex的一个简明描述是,它是一个TeX宏的集合,允许LaTeX文档包含让Sage使用 latex() Sage内置支持。因此,作为编译LaTeX文档的中间步骤,Sage的所有计算和LaTeX格式特性都可以自动处理。例如,一次数学考试可以通过使用sagetex让sagetex进行一对一的计算,来保持问答之间的正确对应。看到了吗 使用SageTeX 更多信息。

tex2sws从一个LaTeX文档开始,但是为Sage代码的放置定义了额外的环境。当使用正确的工具处理时,结果是一个Sage工作表,其中的内容被正确地格式化为MathJax,Sage代码被合并为输入单元。因此,可以用LaTeX编写教科书或文章,包括Sage代码块,整个文档可以转换为Sage工作表,其中数学文本格式良好,Sage代码块“实时”。目前正在开发中,请参阅 tex2sws @ BitBucket 更多信息。

sws2tex通过从Sage工作表开始并将其转换为合法的LaTeX,以便使用所有可用于LaTeX文档的工具进行后续处理,从而逆转了该过程。目前正在开发中,请参见 sws2tex @ BitBucket 更多信息。