用 Vim 和 LaTeX 在数学课上跟上授课速度并记下笔记(二)-Inkscape

前言

上一篇说到了 Vim + LaTeX 的配置,这次我们来说一下图例的绘制方法

译者:Bon

原作者:Gilles Castel

声明:本次翻译已经获得原作者的授权

Disclaimer:This translation is permitted by Gilles Castel

原博客链接:How I’m able to take notes in mathematics lectures using LaTeX and Vim-2| Gilles Castel

前一段时间我在 Quora 上回答了一个问题: Can peo­ple ac­tu­al­ly keep up with note-taking in Math­e­mat­ics lec­tures with LaTeX(人是否真的可以用 LaTeX 跟上课程的速度来记笔记)。在那里, 我解释了我的 Vim 和 LaTeX 的工作流以及我是如何在 Inkscape 中进行绘图的。但是工作流从那以后(译注:2017年)变化了许多, 我想写一些博客文章来解释我现在的工作流程。

在我的上一篇博客中,我解释了我是如何使用 Vim 和 LaTeX 来进行课程笔记的。在这次的博客中,我将会讨论我是如何使用 Inkscape 来绘制示意图以及是如何自定义快捷方式管理器来管理的。

一些例子

首先,让我先向你展示一下我所制作的示意图的例子。它们用于复分析、微分几何、电动力学以及我的椭圆曲线学士论文。我通常在上课的期间用 Inkscape 来画好它们,当然除了论文的那些。现在就开始讲如何来做吧。

example-1

example-2

example-3

example-4

example-5

Inkscape 是什么?

Inkscape 是一款开源矢量图编辑器,适用于所有的主要平台。这可以说是一个免费的,或者说功能更少的,Adobe Illustrator 的替代品。你可以用它来设计传单和 Logo,如下图所示,不过它在这里是一个绘制数学示意图的强大工具。

inkscape

为什么用 Inkscape?

我们一般给 LaTeX 添加图例的方式是使用 TikZ、PSTricks 还有 As­ymp­tote。这些选项有一个共同点:它们是基于代码的,即你只需要编写一些代码来指定绘制的图形的方式。例如下边的 TikZ 代码

1
2
3
4
5
\begin{tikzpicture}
\coordinate (A) at (1, 3);
\draw[thick, ->] (0, 0) -- (A);
\node[above right] at (A) {$A = (1, 2)$};
\end{tikzpicture}

可以生成这样的图:

tikzexample4

这些软件的好处是你可以用编程的方式来绘制图形:你可以使用变量、你可以进行计算,或者使用 for 循环等。 此外,图形总是可以在文档中很好地融合,因为这些的生成是基于 LaTeX 本身进行排版的。 这意味着你可以毫不费力地排版图形,或者如果你稍后想要换个字体,那你的所有的图形都可以在你重新渲染以后换成新的字体。

但是,这个优势会让你损失掉另外的东西:反馈和速度。 当你绘制复杂的图形的时候,如果你没有图形化界面的话,这件事可能会非常的耗时。单击并拖动对象来移动对象,或者徒手绘制曲线,或者拖动 Bézier 曲线上的一个点都是不可能的。这让 TikZ 比起 Inkscape 来说更难使用,也会耗费更多的时间。 我之前使用 TikZ 来绘制过复杂的图形,然后我发现 Inkscape 在大多数情况下总是好处比 TikZ 多得多,尤其是如果你在课程期间感受到了时间的压力以后。

了解了这个前因后,让我们开始吧。

在 LaTeX 文档中包含 Inkscape 图形

就好像 TikZ 一样,Inkscape 可以使用 LaTeX 文本来渲染图形。所以它也可以将图形导出为 pdf 和一个 LaTeX 文件。导出的 pdf 文档会包括剥离掉文档的图形,而 LaTeX 文件则是包含了将文本放对位置的代码。例如,假设你正在用 Inkscape 来编辑下边的图形:

Riemann's theorem

为了在 LaTeX 文档中包含这个图形,你需要去到文件>另存为,选择’pdf’作为扩展名,然后按保存,会弹出以下对话框:

saveas

选择 ‘Omit text in pdf and cre­ate LaTeX file’, 将图形保存为 pdf+LaTeX。要在你的 LaTeX 文档中包含这些 Inkscape 图形。你可以在你的序言(pre­am­ble)中添加如下代码:

1
2
3
4
5
6
7
8
9
\usepackage{import}
\usepackage{xifthen}
\usepackage{pdfpages}
\usepackage{transparent}

\newcommand{\incfig}[1]{%
\def\svgwidth{\columnwidth}
\import{./figures/}{#1.pdf_tex}
}

假设该图是 figures/riemmans-theorem.svg,你可以用下边这种方式包含进去:

1
2
3
4
5
6
\begin{figure}[ht]
\centering
\incfig{riemmans-theorem}
\caption{Riemmans theorem}
\label{fig:riemmans-theorem}
\end{figure}

编译你的文档,你就可以获得以下的内容了。

Rendered figure

正如你所见到的那样,文本会由 LaTeX 渲染,然后图形会看起来是十分的完美。如果后续你想要更改你的字体的话,它可以动态更新为:

Rendered figure with different font

这设置意味着你可以在 Inkscape 中绘制图形,而且还可以拥有 LaTeX 的排版功能。

快速创建以及在 LaTeX 中引用文件

当我在课堂上做笔记的时候,我需要能够在不中断我的笔记流程的情况下添加图形,而不是花时间打开 Inkscape ,搜索目录,然后键入 LaTeX 代码来手动添加图形等等。为了避免这些情况,我利用了 Vim 的一些快捷方式来管理我的图形。例如,当我键入想要创建的图形的标题然后按下Ctrl+F,会按着以下的步骤进行:

  1. 脚本会根据 LaTeX 文件所在的根目录来寻找图
  2. 然后检查在这个目录中是否存在相同名称的图形。如果存在的话, 脚本就什么都不做。
  3. 如果没有,我的图形模板会被复制到图形目录中去。
  4. 包含图标题的当前行将会被替换成 LaTeX 代码以包含该图。
  5. 新的图会在 Inkscape 中打开。
  6. 设置文件监视器,以便每当你按下Ctrl + S的时候,会将图形保存为 svg 文件,而且它也会保存为 pdf+LaTeX。这意味着我们之前讨论过的烦人的 pdf 保存框不再弹出。

看它的实际效果:

including_figure

当我想要编辑一个图形的时候,我可以按一下Ctrl+F 以正常模式打开一个选择对话框,允许我搜索当前文档的图形。在选择完一个以后,它会在 Inkscape 中显示图形。当我保存以后,包含它的代码将会被复制到剪贴板。这样,我删除了原始的代码以后,我可以重新在后文中包含它。

editing_figure

这些快捷方式使得添加和打开图形变得轻而易举。我不必记得要把图形保存为 pdf+LaTeX选择正确的目录或编写包含该图所需的代码。添加新图形的麻烦程度远远低于我必须手动执行这些操作的麻烦程度。你可以在 Github 上找到管理图形的脚本。

现在我来解释一下我是如何管理图形的。我想谈谈实际上我是如何在 Inkscape 中 绘制 图形的。

绘制示意图

虽然在大多数情况下,在 Inkscape 中绘制图形会比在 TikZ 快很多。但是它还是比手工绘制慢得多。使用 Inkscape 的内置快捷方式可以加速这个过程,但是它还是没有达到我的标准。

因此,我决定使用 Python 来编写一个自定义的快捷方式管理器。这能够允许拦截所有到达 Inkscape 之前的键盘事件。通过这种方式,我可以完全地控制每次按键的解释方式,从而为我提供了很大的灵活性。

绘制形状

让我们从 Inkscape 的内置键盘快捷方式开始。例如,r 激活矩形绘制工具,e 绘制省略号等。而我的实现方式是,利用快捷方式管理器来“重放”这些键盘事件,即,我会直接传递它们到 Inkscape 中去。

但是,我不打算用p 来调用铅笔或者用b 来调用贝塞尔工具,我用的是wf, 这个会让我在用自己的右手来操控鼠标的时候更加舒服。本着要为左手制作快捷方式的精神,我也把 z映射成了 undoShift+zdeletextog­gle snap­ping ,而这些又是很难用左手直接就能搞定的。

应用常用样式的 Key chord

样式是第二个我在 Inkscape 中经常需要调整的东西 。而我常用来绘画的样式其实十分的简单:

  • 形状例如矩形或圆形,颜色大多是黑色、浅灰色、白色或透明, 偶尔也会可选地具有自己的笔划。
  • 线条(包括笔划)大多是实线,点线或虚线。他们可以(非常)粗,也可以有正常的宽度,或者可选地在任一侧上具有箭头。

这些选项组合在一起给出了下面常用的样式表:

default-style-names2

由于我总是经常要用到这些样式,我希望它们对于我来说可以变得更快。但是使用 Inkscape 中的快捷样式需要太长的时间了。例如,假设你需要更改某些对象的样式,如下图所示:

Changing styles

你需要按下Ctrl+Shift+F 来打开样式面板,然后通过单击更新每个对象的样式,因为你无法使用 Inkscape 中的键盘快捷键来执行此操作。这很烦人。理想情况中,它应该只需要几分之一秒的时间。

inkscape-editing

这就是 Key chord 发挥用处的地方了。Key chord 是键盘快捷键,由两个或多个同时击键组成。例如,当我快速按下sf,我的快捷方式管理器会将当前的选择应用成特粗线条以及填充成灰色。如果我想要笔画变粗,我会按下s+f+g 同时,而g 代表的是粗(主要是t键很难同时按)

这样,每个样式属性都可以对应到一个键:s 代表的是正常笔划,f指的是灰色填充,g 是厚,a 指的是箭头,d指的是点线,e 指的是虚线等等。下面是选项的完整表格。

default-styles-keys2

此表中的一些某些样式仅对应一个键,例如左上角的样式:仅仅填充灰色而没有外边缘,而这可能会带来一个问题,因为只有按下f才能够调用出贝塞斯曲线了。解决方案是按Space + f,在这里面,space就好像一个占位符。

有了这些 key chords,之前的问题就可以用几次击键就可以解决问题了:

  • f+s 可以使得矩形变成灰色并且赋予它实心的边框。
  • f+h+e 代表了“填充并且赋予非常粗的虚线”。
  • a+g+d 添加了一个箭头,并且使线条变成粗点了。

fast-editing-inkscape

添加文字

另外一个制作图形的重要部分就是添加文字。由于图形中经常要包括一些数学公式,我希望可以在 Vim 中使用我的 片段 。为了确保这个,我可以按下 t ,而这个可以打开一个很小的 Vim 窗口来让我输入 LaTeX。等我离开这个窗口,会有一个文本节点插入到 Inkscape:

latex-as-text

正如我之前介绍的那样,当我在文档中插入图形时,LaTeX 将呈现此文本。但是,有时我想立即渲染一些 LaTeX,可以用 Shift+T 来实现:

latex-as-svg

这两种选择各有好处坏处。我一般会使用第一种方法,因为文本是由 LaTeX 文档呈现的。这意味着字体将始终匹配。 你可以使用文档前言中定义的宏。然而,缺点是文本的定位有时有点困难。由于你无法在 Inkscape 中看到最终的结果,因此你有时候需要从 Inkscape 从跳转到我的 pdf 阅览器并返回以微调结果。

保存和使用不太常用的样式

尽管 key chord 所定义的样式可以适用于 90% 的情景,但是我有时候还是需要自定义风格。例如当我要绘制光学图形的时候,我就需要有一个玻璃和光线的样式了。为此,首先我就需要用默认的快捷方式来在 Inkscape 中创建样式:

custom-style-1

为了保存这些样式,我需要选中其中一个对象,并且按下Shift + s。然后我输入新样式的名称,在本例子中我定义的名称是“Glass”,然后按Enter 来确认。现在这个样式已经保存,我可以在以后使用它了。

现在,当我选择一个对象时,按下 s 并且键入 “Glass”, 相应的样式将应用于该对象。但是,实际上,在实际中没有必要输入全名,因为到目前为止,只需要匹配到了该字符所对应的唯一样式的时候,样式就会立即应用了。例如,如果我只要一个 ‘g’ 开头的样式,那么输入 ‘g’ 就足够了。如果你还有其它的样式,例如‘grass’,那你还是需要输入’gl’的。

令人烦恼的是,每当你键入太多字符的时候——假设你需要键入’gl’会应用样式,但你输入’gla’的时候,剩下的键也就是’a’往往会被解释成另外一个命令,而这个就会给出意想不到的结果。因此,快捷方式管理器在返回默认模式之前会等待500毫秒。而这个已经足以让人看到已经应用了样式并停止输入了。

custom-style-2

添加和保存对象

我的设置的最后一个功能是添加和保存对象。我可以用a来添加他们,并且使用Shift+a来保存它们。例如,按下a 并键入 “ec” 会得到一条椭圆曲线:

Elliptic curve

另一个例子中,按下 a 然后输入 “dg” 会添加一个钥匙孔(”dg” 是键盘上 “kh” 的镜像)。我还可以用 Ctrl+-将它从特定的形状中减去它:

keyhole2

还有其它的一些例子,例如 blobs 和 2D、 3D 轴,这些我在复分析和微分几何中经常会用到它们。

A blob and 2D, 3D axis

代码

如果你想自己来尝试一番,你可以在 GitHub 上找到我的 Vim 管理图形脚本 和我的 Inkscape 快捷方式管理器。 这些脚本都工作在基于 Linux 的系统上。第一个脚本也许可以突破这个限制,但是第二个就应该不行了。

总结

使用 Inkscape,为文章、书本、演示文稿来快速绘制图形是十分方便的。他们看起来很专业,也可以很好地融入你的文档当中去。虽然它比手工绘制慢,但在绝大多数情况下它绝对比 TikZ 快得多。我的自定义快捷方式管理器和管理图形的 Vim 脚本可以让它变得更快,而这个就允许了我在课堂上绘制图形。

喜欢这篇博客文章吗?分享出去吧!

本文作者: Bon
本文地址https://bonxg.com/p/86.html
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 CN 许可协议。转载请注明出处!

# Bon
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×