我是如何使用Markdown,Pandoc和互联网上的一些帮助写书的

我最近提到我刚写了一本书吗? 我希望您不要在这里和我的社交媒体提要上感到厌烦,但是我对这本书的结果感到非常满意,并且我希望有尽可能多的人来尝试。 我在研究和编写本书方面有丰富的经验。 但是当我开始的时候,我完全没有写书的经验。 我不仅要对认知心理学和教学实践等方面进行大量研究,而且还必须弄清楚将书合在一起的技术过程。

对于一个如此复杂的项目,事实证明,您不能只打开文字处理程序并开始输入。 要考虑的问题是没有一个正确的答案,因此我不得不想出一种对他们和我的工作流程都有效的方法。 在撰写本文时,我从博客文章和文章中获得了很多帮助,所以我想分享我从所有这些中学到的知识,希望对其他人有所帮助。

合理的警告:我将要描述的许多内容在慈善上都可以称为“黑客”。 可能会有更简单,更好的方法来处理几乎所有您将看到的事情。 如果您有改进的想法,请留在评论中。

Markdown是我写作世界的中心

首先,您必须了解我对使用Markdown的投入。

Markdown是一个文本处理平台,该平台强调使文本可读,同时保持表单的简单性。 如果您不熟悉Markdown,请从这里开始,然后阅读所有相关信息,然后在线或在文本编辑器中进行尝试。 如果说我是Markdown的粉丝,那就太轻描淡写了。 对于我来说,Markdown比文本处理系统更接近成为一种生活方式。 我喜欢Markdown:我喜欢它的简单性,可移植性,轻巧性,面向未来。 除非有充分的理由,否则我会在Markdown中编写所有内容:除非有充分的理由:报告,教学大纲,电子邮件,甚至是我的博客文章和购物清单。

通过使用Markdown进行编写,并将写作内容保留为本质上纯文本的形式,我基本上可以在任何位置和任何设备上打开和编辑它,而不必担心兼容性。 在我的Mac上,我主要使用Atom编写,或者如果我想改变步伐,则有时使用Sublime Text或Typora编写。 如果我不在Mac电脑中,可以在iPad上使用社论。 如果我只有Web浏览器,则可以使用StackEdit。 该语言本身与硬件和操作系统无关。 它只是纯文本,并添加了一些香料。 因为它基于纯文本,所以不复杂,文件很小,而且我知道这些文件将在100年后可读和可编辑。

在写书的第一阶段,我就知道我真的很想用Markdown写这本书。

但…

我的出版商Stylus Publications非常高兴与之合作。 他们从一开始就提供支持,目前在营销方面做得很好。 从我的编辑到为会议安排传单的人,每个与Stylus接触的人都很棒。

但是,手写笔不做Markdown。 手写笔仅适用于Word文档。

这说得通。 我不是Word的忠实拥护者,但它做得很好的一件事就是跟踪更改。 去年八月我提交稿件后,就开始了来回过程,我的主编建议进行大规模修改。 我做了那些,然后把它们寄回去了。 然后进行了一系列的副本编辑交换,其中提出了许多较小的详细更改。 所谓“大量”,是指数百种,从错别字到更正,再到对段落的完整重组。 并不是所有提议的更改都是我要进行的更改,至少是按照编辑建议的方式。 因此,我们必须有一种方法来提出更改,接受或拒绝或修改它们,并跟踪它们。 Word可能是最好的选择。

但是,至少可以说,我没有想到用Word写一本300页的书的想法。 因此,我需要设计一种方法来在Word中交付最终产品 ,而无需实际在Word中编写产品

输入Pandoc

幸运的是,我不必看得很远。 已经有一个很棒的工具可以执行我想做的事情,而实际上我已经使用了一段时间了:Pandoc。

Pandoc是一个命令行程序,基本上可以将任何类型的(基于文本的)文件更改为任何其他类型的(基于文本的)文件。 例如,您可以使用它将Word文档转换为HTML,将LaTeX文件转换为Word(格式已格式化!),将纯文本转换为ePub等。 特别是,您可以轻松地将Markdown转换为Word。 要将foo.md转换为foo.docx ,只需导航到foo.md所在的目录并键入

 pandoc -s foo.md -o foo.docx 

-s代表“源”, -o代表“输出”。 就是这样-Markdown文件的Word定义版本将与源代码位于同一目录中。

所以我的计划变成了:

  1. 将每个单独的章节编写为自己的单独的Markdown文件。 我写这本书的初衷是使各个章节简短。 这样,将书的所有各个部分分开就很简单了。
  2. 完成后,将所有Markdown文件合并为一个大文件。
  3. 使用Pandoc将大型Markdown文件转换为Word。

如果我要这样做的话,要克服的一大障碍是:处理参考资料。

使用BiBTeX管理参考

如果您曾经写过期刊文章,那么您将知道管理这些引用可能很棘手。 文本中的每个实际参考都必须使用某种缩写信息来标记。 有时,这是一个数字(例如,“ [3]”)指向参考书目中给出完整参考文献结尾的位置; 有时它是带有出版日期的作者列表(例如,“(Lennon和McCartney,1964)”)。 像这样的引用有不同的样式。

引用已发表作品中的参考文献非常重要,这是奖学金的核心概念,即源头上的透明性,而且非常脆弱。 如果您写了一篇50页的论文,引用了20遍文章,并且都贴上了“ [3]”标签,然后在修订过程中添加或减去了引用,以使“ [3]”不再是第三篇,该怎么办?参考书目? 您不想手动搜寻并更改所有[3]。 它在20页的论文中有点烦人,而在300页的书中则可能引起精神错乱,而错过其中一部参考文献的可能性很高。 我实际上并没有计算我的书有多少参考,但是参考部分的篇幅只有8页,包括对书,期刊文章,网站,未出版的手稿,私人采访等的参考。 所以这是一个大问题。

您需要的是一种自动执行引用的方法。 例如,如果Lennon和McCartney的论文可以被编码为LennonMcCartney1964 ,并且有一个系统允许您在每次引用它时输入LennonMcCartney1964 ,然后自动以正确的编号生成书目,然后进行跟踪[3]的问题不再是问题。 幸运的是,这个系统存在并且已经使用了数十年,它被称为BiBTeX。

BiBTeX通常与使用LaTeX(一种用于编写数学和技术文档的标记语言)编写的文档相关联。 我们的数学家像使用氧气一样使用乳胶。 这是所有数学家都使用的一项技术。 如果我正在编写LaTeX文档,并且想引用1964年Lennon和McCartney的论文,则只需要:

  1. 创建纯文本文件,然后使用BiBTeX的格式语法输入论文的引文信息。 其中一种语法是用于引用本文的句柄,例如LennonMcCartney1964
  2. 转到我要引用该论文的地方并键入: \cite{LennonMcCartney1964}
  3. 确保LaTeX源文档中包含几行代码,告诉其处理BiBTeX文件。 接着,
  4. 只需编译LaTeX文档。 LaTeX会为引用自动编号,如果这些更改在您的文本中出现,则在再次编译时引用也会更改。

因此,如果您使用的是LaTeX文档,则BiBTeX是正确的解决方案。 我不是。 我是Markdown家伙,还记得吗?

使BiBTeX与Markdown和Pandoc一起使用

幸运的是,我偶然发现了神学院学生Chris Krycho的这篇博客文章,这为我提供了最终解决方案。 事实证明,即使引用位于Markdown文件而不是LaTeX文件中,Panddoc也可以像老板一样处理BiBTeX。

它的工作方式是这样的。

首先,为参考创建BiBTeX文件,就像使用LaTeX一样。 对于这本书,我使用了BibDesk,这是一个用于管理BiBTeX文件的免费工具。 但是您可以为此使用一个文本文件。 BibDesk如下所示,其中突出显示了一个参考。

然后,在Markdown文件中,每当创建引用时,您只需在引用的引用关键字前添加@符号即可。 例如,上面显示的Linda Nilson的参考书的引用键为nilson2013creating 。 因此,当我想引用它时,只需输入@nilson2013creating如下所示:

此引用语法是LaTeX命令\cite{nilson2013creating}的Markdown模拟。 处理Markdown文件时,该引文将使用我可以指定的样式转换为格式化的引文。 您问这个“处理”如何完成? 使用Pandoc。 使Pandoc完成所有这些操作的命令是:

 pandoc foo.md --smart --standalone --bibliography /.../talbertlibrary.bib -o foo.docx 

其中foo.md是Markdown源文件,/…/ /.../talbertlibrary.bib是存储引用的BiBTeX文件位置的完整路径。 (该矿被称为talbertlibrary.bib 。)传递给Pandoc的选项是:

  • --smart :这使排版看起来不错(将破折号转换为破折号等),并且与书目无关。 但是对于发布者来说,这很重要。
  • --standalone :文档说“使用适当的页眉和页脚生成输出”。 老实说,我不确定如果不进行处理会怎样。 我在互联网上找到它,不想与它混淆。
  • --bibliography :这是告诉Pandoc您正在从书目中提取引用的参数。 这之后是BiBTeX文件的路径。 @语法会自动呈现。

同样,一旦Pandoc运行,它会生成一个Word文件。 这是结果的屏幕截图:

非常重要: Pandoc还将所有引用放在输出文件的末尾,并按字母顺序排列。 因此,您最终得到的是书目。

画龙点睛

在大型Markdown文件上运行Pandoc后,我得到了一个格式精美的Word文档,其中包含自动引用和参考书目。 我需要做的就是:

  • 添加出版商想要的封面。 在Word中琐碎。
  • 添加目录。 可以使用Pandoc在Markdown中完成此操作,但在Word中更容易完成,尤其是因为Markdown中使用#符号的标头语法会在Word中创建实际的标头,而Word的目录生成器使用标头来完成其工作,只需选择一个菜单即可。
  • 有几次,我在Markdown语法中包含的某些图像在Pandoc之后看起来不正确。 例如,有几张图像需要并排显示,而在Markdown中我不知道要这样做。 只需在Pandoc之后添加这些内容,会更简单。

这样一来,我就有了一份手稿,可以直接供出版商使用,而无需在Word中进行任何实际的编写。

从那里继续前进, 一切都在Word中完成,这再次是因为这是我的发布者使用的标准文件格式,并且跟踪更改很重要。 但是我可以接受,因为我所做的任何更改都没有涉及大量的实际写作。

结论

就像后记一样,我的书中没有很多数学符号,但是如果有,我仍然可以使用此工作流程,因为Pandoc可以使用MathJax渲染Markdown文件中的LaTeX表达式。 您所要做的就是在Pandoc命令中添加--mathjax

 pandoc foo.md --mathjax --smart --standalone --bibliography /.../talbertlibrary.bib -o foo.docx 

这将生成一个包含LaTeX渲染公式的Word文件。 或者,如果您需要输出为PDF,只需将.docx更改为.pdf ; 同样,如果您需要纯LaTeX文件,请将其更改为.tex

通常情况下,您应该使用最好的工具来完成工作。 为了写作我的书,那个工具是Markdown和写作部分的文本编辑器。 加上BibDesk来管理我的参考资料; 然后用Word使它们看起来都不错。 我真的很高兴找到使所有这些相互作用的方法,并且我强烈倾向于将来将此工具堆栈用于任何编写项目。