最近为了解决在LaTeX下的计算问题,寻找了很多解决方案。我首先使用了calculator & calculus宏包,但是受限于LaTeX本身局限的长度计算功能和感人的精度,我抛弃了这个选项;之后我看到了CalcTeX这个项目,但是这个只有一个雏形,而且只支持Linux。这个PythonTeX是我目前找到的最适合解决这个问题的方案,因为这个问题的本质是引入Python脚本解决LaTeX本身语法无法解决或者很难解决的问题,所以实际上其功能远不止计算算式了。
PythonTeX简介
PythonTeX本质是一个和MakeIndex和BibTeX一样的TeX辅助编译工具,主要实现在TeX文档中插入Python代码,并将执行结果输出到源文档的功能。因为PythonTeX是编译工具,所以和一般宏包不同,他不仅仅需要使用\includepackage命令包含宏包,同时还需要安装PythonTeX程序和Python环境。
PythonTeX安装
- 首先PythonTeX环境需要Python环境,且需要2.7或者3.2以上的Python版本,Windows和Mac OS X用户直接到官网下载安装包即可;Linux用户使用apt-get(Ubuntu)或者yum(centos)安装即可。
- PythonTeX需要Python的Pygment库,这个库直接在安装好Python后使用pip install pygment安装即可。(Linux下还要单独安装Python-pip)
- 对于Windows 下的MikTeX用户,因为MikTeX已经集成了PythonTeX,宏包安装工具会在第一次调用pythontex命令的时候提示安装,所以可以略过此步;TeX Live参照官方说明,使用python进行安装。
- 目前绝大多数TeX编辑环境都没有设置PythonTeX的命令,这个需要在响应的TeX编辑器中添加命令,这里以TeXworks为例:在设置菜单(Edit->Preference->Typesetting->Processing Tools)点击加号,在Program中填pythontex,argument中填$fullname即可。
- PythonTeX需要如下宏包支持:fancyvrb, fvextra, etoolbox, xstring, pgfopts, newfloat (part of the caption bundle), currfile, and color or xcolor,除了上述宏包意外pythontex宏包也需要安装。
PythonTeX基本使用方法
首先需要在引言中引入pythontex宏包
\usepackage{pythontex}
PythonTex有五个基本命令和四个基本环境,五个命令分别是
\py{1+1} %直接输出结果
\pyc{var = 3} %仅执行Python代码
\pyb{var = 4} %执行并输出Python代码
\pyv{var = 5} %仅输出Python代码
\pys{\verb|var = !{var}|} %在输出LaTeX代码的过程中执行代码并输出,!{var}为执行的代码
上面五行代码执行后的结果分别是
- 第一行:2(输出的是1+1的计算结果)
- 第二行:无输出(Python中变量var被赋值为3)
- 第三行:var = 4(Python中变量var被幅值为4)
- 第四行:var = 5(Python中变量var的值未改变,仍为4)
- 第五行:var = 4(Python中变量var的值为4,所以4被输出)
而四个环境则分别对应上面第二个到第五个命令,可以同时包含多行代码
\begin{pycode} %仅执行Python代码
var = 3
\end{pycode}
\begin{pyblock} %执行并输出Python代码
var = 4
\end{pyblock}
\begin{pyverbatim} %仅输出Python代码
var = 5
\end{pyverbatim}
\begin{pysub} %在输出LaTeX代码的过程中执行代码并输出,!{var}为执行的代码
\verb|var = !{var}|
\end{pysub}
常见的几个问题和解决方案
缩进问题
使用PythonTeX时建议使用空格进行代码缩进,而且多行代码时每行代码顶头写。如果使用XeLaTeX,并使用tab缩进,在运行pythontex时会出错,这是因为xelatex将tab编码为^^I,而Python无法识别,此时可以尝试XeLaTeX –8bit命令(似乎新版已经取消了这个命令支持)。
编译找不到.pytxcode文件
如果使用MikTeX,并使用其自带的texify程序进行编译,请不要带–clean参数,这个参数会删除编译产生的.pytxcode文件,导致继续进行pythontex不能成功。
参考:
[1] Geoffrey M. Poore, The pythontex package, 2016/07/21