首先介绍一下背景

首先介绍一下背景

由于我已经为此奋斗了一段时间,但在网上却找不到这个问题,所以我想通过在这里发布这个问题来减轻一些人的生活负担。


假设:

基本 LaTeX 文本和方程式安基SRS正确生成。有关设置,请参阅Anki文档。我正在运行 Windows 7 64 位,对于其他系统,命令可能会有所不同。

问题:

AnkiSRS 允许用户输入 LaTeX 代码。但是,当用户包含 TikZ 或基于 TikZ 的包时,生成的文档是错误的。

例子:

包括\usepackage{chemfig}前言并尝试用 生成简单的化学图\chemfig{A-B}。结果如下:
错误的
与应该的输出相反:
正确的

如何补救这种情况?

答案1

总结一下

首先介绍一下背景

Anki 使用latex编译器从输入的 LaTeX 代码创建.dvi中间文档,然后.png使用转换器将其转换为位图图像dvipng。Anki 只能处理.png图片格式!

现在,TikZ(在绝大多数情况下)只能用pdflatex编译器编译,编译器不会创建.dvi文档,而是.pdf立即生成文档。这当然意味着在 TikZ 之上构建的所有包(例如 chemfig)也只能用 编译pdflatex

要将.pdf文档转换为.png文件,我们必须有一个外部程序。我的选择是Imagemagick,它提供了一个命令来执行我们想要的操作(convert)。

因此,使用命令行中的以下命令,我们应该排版正确的 LateX.pdf文档,然后.png在 AnkiSRS 之外将其转换为图片:

pdflatex tmp
convert -trim -density 300 tmp.pdf tmp.png

但是,出于某种原因,Anki 不支持在排版 LaTeX 文档后输入命令行,因此我们需要让pdflatex跳转到命令行本身并调用 ,convert以便它能够为 Anki 提供预期的输出(.png)。这分两步完成。

首先,我们需要使用独立文档类。我使用了以下命令,需要一点解释:

\documentclass[convert={convertexe={convert}}]{standalone}

带有选项的独立包convert尝试通过 Imagemagick 转换文件.pdf。遗憾的是,Imagemagick 的命令convert使用了与Windows 系统的命令 convert将文件分配表从 FAT32 转换为 NTFS。
夏勒先生该软件包的创建者意识到了这个问题,这就是为什么该软件包会调用imgconvert而不是,convert以避免在运行 Windows 的机器上出现问题。

可以将 Imagemagick 程序重命名为imgconvert,也可以使用选项调用独立类convert={convertexe={convert}}。在使用前者时遇到问题后,我选择了后者。但是,我不建议在运行 Windows Server 2008 或 Windows Vista 的机器上使用它。

其次,必须启用编译器以转至命令行,如下所示:

pdflatex tmp -shell-escape

此时,此命令应排版.pdf文档并将其转换为.png。尽管编译器会报告错误,但是.png正确的。这可能在命令行中没有问题,但在 Anki 中它会崩溃。出于我仍然不完全理解的原因,可以通过包含以下内容来修复它

\providecommand{\pgfsyspdfmark}[3]{}

位于文档开头。有关更多详细信息,请参阅此线

综合起来

现在让我们看看 Anki。我们需要安装插件编辑 LaTeX 构建过程。当我们打开它进行编辑时,会弹出以下代码:

newLaTeX = \
[
  ["latex", "-interaction=nonstopmode", "tmp.tex"],
  ["dvipng", "-D", "200", "-T", "tight", "tmp.dvi", "-o", "tmp.png"]
]

# make the changes
import anki.latex
anki.latex.latexCmds = newLaTeX

我建议像这样编辑它:

# original setting
#newLaTeX = \
#[
#  ["latex", "-interaction=nonstopmode", "tmp.tex"],
#  ["dvipng", "-D", "200", "-T", "tight", "tmp.dvi", "-o", "tmp.png"]
#]

#===================================

# TikZ compliant setting
newLaTeX = \
[
  ["pdflatex", "-interaction=nonstopmode", "--shell-escape", "tmp.tex"]
]

# make the changes
import anki.latex
anki.latex.latexCmds = newLaTeX

由于我无法找到有关语法的任何帮助,我假设这#是一个行注释,并且不知道如果有需要的话是否可以有条件地共同选择编译器。

现在,像这样更新所有笔记的 LaTeX 标题:

\providecommand{\pgfsyspdfmark}[3]{}
\documentclass[convert={convertexe={convert}},border=2]{standalone}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{amssymb,amsmath}
\usepackage{xcolor}
\usepackage{chemfig}
\pagestyle{empty}
\setlength{\parindent}{0in}
\begin{document}

它应该可以工作(如果 tl dr;安装 Imagemagick)。

答案2

有一种比 PeV 的答案稍微简单一些的方法,对我来说很有用(MacTeX 2023)。

这依赖于以下命令:

pdflatex -output-format=dvi -shell-escape -interaction=nonstopmode tmp.tex

dvisvgm --no-fonts -Z 2 tmp.dvi -o tmp.svg

更改标题/前言

转到Tools >> Manage Note Types >> <select a note type> >> Options。在这里,您可以调整在 Anki 编译 LaTeX 代码时将包装的页眉和页脚。

有一个复选框,标题为Create scalable images with dvisvgm。勾选该框(这是可取的,因为 svg 图像比 png 图像更容易重新缩放)。

更改\documentclass{...}\documentclass[dvisvgm]{standalone}。该dvisvgm选项告诉 LaTeX 编译器您希望它生成一个可以转换为 svg 文件的文件。

\usepackage{tikz}确保在标题中有一个位置。

更改编译器调用

转到Tools >> Add-ons。双击Edit LaTeX build process。按如下所示设置“svgCommands”部分。

{
    "pngCommands": [
        [
            "latex",
            "-shell-escape",
            "-interaction=nonstopmode",
            "tmp.tex"
        ],
        [
            "dvipng",
            "-D",
            "200",
            "-T",
            "tight",
            "tmp.dvi",
            "-o",
            "tmp.png"
        ]
    ],
    "svgCommands": [
        [
            "pdflatex",
            "-output-format=dvi",
            "-shell-escape",
            "-interaction=nonstopmode",
            "tmp.tex"
        ],
        [
            "dvisvgm",
            "--no-fonts",
            "-Z",
            "2",
            "tmp.dvi",
            "-o",
            "tmp.svg"
        ]
    ]
}

相关内容