我正在研究开始同时使用 Python 和 (La)TeX。
现在我看到 ctanpythontex
和上有两个包hybrid-latex
。它们的优点和缺点是什么?哪个解决方案更完善(有理由吗)?对未来有什么期待吗,即两者都仍在积极维护/改进吗?请随意添加其他解决方案以结合 Python 和 LaTeX。
答案1
好吧,尽管这个问题是基于观点的,我还是会向你介绍我的知识和经验。
首先,也就是说,我有使用的经验,PythonTeX
但从未使用过hybrid-latex
。我用它来学习 Python,尤其是numpy, matplotlib, pandas, lxml
数据处理方面的知识。接下来的几点将告诉你为什么。
我发现这个包是这个主题中唯一仍在维护和积极开发的包。在搜索时,我甚至没有点击
hybrid-latex
,但我遇到了pyLaTeX
当时似乎被遗弃的包。PythonTeX
minted
与和软件包有相同的作者fancyvrb
,这在某种程度上保证了作者在 TeX 编程方面的技能。PythonTeX
支持许多其他编程语言 - R、Julia、Perl、bash 等我简单看了一下
pyLaTeX
手册——上面提到的所有缺点PythonTeX
都是无效的。PythonTeX
如果是解释型语言,添加新语言相当容易。具有特定要求的编译型语言可能会有问题。PythonTeX
有足够的选项、环境和宏来指定要执行的代码块、仅排版(仅打印)或两者兼而有之。它还允许您无缝轻松地引用 LaTeX 文本中的变量值。看看快速入门指南,太棒了。错误消息与 TeX 行号同步 - 因此,如果您的代码出现错误,您就会知道错误
.tex
发生在文件中的哪一行。这很有帮助。对于设置自动编译,有一个
arara
规则(注意,我是它的作者,让别人测试它会很酷)并且还有一个如何设置的指南latexmk
。PythonTeX
由于和都PythonTeX
需要latex-hybrid
3 步编译,这也有很大帮助。最后,
PythonTeX
拥有活跃的作者和社区。作者现在主要活跃在 Github 上。
缺点:
实际上只有一个。也就是说,由于疫情和其他原因,作者目前没有资源来积极开发该软件包。目前它主要是在修复错误。作者还有其他类似的项目,codebraid
它与 相结合pandoc
并修复了大部分PythonTeX
限制。
但,PythonTeX
绝不是被抛弃。
答案2
由于我也经常使用 Python 和 LaTeX,所以我玩了pythontex
一段时间的 package。一开始,一切都很有趣,很刺激。但后来,我决定完全远离它。我的建议是:如果你正在写一篇严肃的学术文章,尽量不要使用pythontex
。
原因如下:
- 如果你要发表文章,许多出版商的编辑系统(甚至 arXiv)根本不支持
pythontex
。为了不同的投稿,可能需要彻底重构文档,这是有风险的。 - 就我个人而言,我发现使用 Python 编码时,代码高亮和自动缩进非常有用。话虽如此,如果您在 LaTeX 编辑器中编写 Python 代码,则不会从这些功能中受益。
- 如果您使用的话,调试 Python 代码会非常困难
pythontex
。 - 如果你的机器上有多个 Python 可执行文件(例如 anaconda),则需要花费大量精力来配置正确的文件。如果你与其他人合作,而他们的 Python 可执行文件不同,情况会变得更加复杂。
我认为上面的要点可以总结为一句话:将 LaTeX 与 Python 结合在一起容易导致兼容性、可用性和可迁移性问题。
由于 Python 是一种更全面的语言,因此每当需要结合 Python 和 LaTeX 时,我认为大部分工作量都应该在 Python 方面完成。Python 的任务应该是生成tex
或pdf
LaTeX 可以直接使用的文件。这使得您的 LaTeX 源完全独立于发布者。
我认为在结合 Python 和 LaTeX 时,这些问题非常有意义:
- 如何确保图表的样式与文档的样式相同?假设正在使用
matplotlib
,解决方案是使用pgf
具有正确 LaTeX 前言的后端。 - 鉴于 LaTeX 和 Python 现在已经解耦,如何简化工作流程?我通常会将我的每个图封装到一个 Python 函数中,并在需要更新时调用它。该函数不仅应生成图形,还应将其保存到正确的目录中。如果您只重新运行一两个图,这可以节省时间。
subprocess
如果在 Python 端比在 LaTeX 端进行的更改更多,您甚至可以使用该库从 Python 调用 LaTeX 构建系统。 - 一些基本的 LaTeX 编程知识可以帮助减少工作量。例如,如果 LaTeX 中的一个大图由 20 个子图组成(在本例中,是 Python 生成的 pdf 文件),那么只需在 LaTeX 中编写一个循环即可将它们全部包含进去,而重复工作很少。