使用 emacs 进行 TeX 工作流程的简单指南

使用 emacs 进行 TeX 工作流程的简单指南

进度报告

四个月后,我觉得在这里“汇报”是个好主意,于是我写了一些东西。然后,我有了更好的想法,并把它变成了一篇博客文章。

你可以读在 TeX.sx 博客上


受最近聊天室对话的启发,我考虑重新访问emacs作为我的源代码编辑器。为了给它一个好机会(过去十年左右,我尝试了四五次都失败了),我想请教一些有用的提示,或者指向更大作品的指针,以便尽可能顺利地从 TeXWorks 过渡。

我的主要特点作案手法是:

  • 大量使用memoirbeamertikz
  • 结构化文档,\input以及standalone
  • lualatex(偶尔需要使用 xelatex 或 pdflatex),由 latexmk 驱动
  • biblatex(使用 bibtex 而不是 biber,但仅通过惯性)
  • unicode,无一例外
  • Windows 7的
  • TeXWorks 之外的通用 PDF 查看器:PDF XChange

我希望得到解决的问题和不确定性包括(我承认其中一些可能与主题不直接相关——在这种情况下链接可能更合适)如下:

  • emacs 的初始设置,包括 (...)TeX-workflow 特定的附加组件
  • 直接从 emacs 环境进行编译和预览
  • 源文件和预览文件的同步
  • 自动完成
  • 拼写(英语-英国、葡萄牙语-巴西、西班牙语和法语)
  • 任何其他暗示、陷阱等
  • 一个很好的教程

答案1

我从未在 Windows 中使用过 Emacs,但我八九个月前才开始学习和使用 Emacs,现在我的大部分工作都使用它。

学习

首先,您需要熟悉 Emacs 的基础知识,这很可能是您最沮丧的地方。对于新用户来说,基本用法的命令可能很难学习,因为它们与其他编辑器不同。让学习过程花点时间,最终您将变得非常高效。要知道,一旦您克服了文化冲击并学习了基础知识,您就会喜欢 Emacs。

开始学习 Emacs 基础知识的一个好方法是通过其内置教程,您可以通过 访问C-h t。花点时间从头到尾学习教程。确保您学会了如何在缓冲区中导航、编辑缓冲区、打开新缓冲区以及在缓冲区之间切换。您不需要一次性学会所有内容。您可以随时返回教程。

掌握了基础知识后,您应该尝试在 Emacs 中完成一些工作。开始时,请同时使用旧编辑器。在将大部分时间花在 Emacs 上的前一两个月,您可能会来回切换。重要的是,您要花时间习惯 Emacs,并时不时地尝试学习新东西。即使是长期用户也会偶尔学习新东西。这是一个永无止境的学习过程。

你的习惯和做事方式可能与 Emacs 的方式相冲突。有时最好让 Emacs 适应你习惯的工作方式,有时 Emacs 有更好的方式,然后最好适应。例如,当我开始使用 Emacs 时,我认为它打开文件和在缓冲区之间切换的方式很复杂和笨拙,所以我倾向于使用菜单和工具栏来完成这些任务。但当我理解并习惯了处理缓冲区的命令(例如在C-x b缓冲区之间切换)后,我对它的效率印象深刻。为了进一步提高在文件之间切换的效率,您可能想要学习的是书签功能

要了解有关 Emacs 的更多信息,其内部帮助非常有用。您可以通过执行查看帮助选项C-h ?。像往常一样,网络也提供了很好的帮助。一个特定的网站是EmacsWiki. 在 Stack Exchange 网络上本网站适用于 TeX 相关的 Emacs 问题,但是有时你会过得更好询问堆栈溢出那里有更多 Emacs 专家聚集。对于有关 Emacs 的一般和非编程问题,你可以尝试超级用户。 最后,聊天可能是发泄与 Emacs 相关的挫败感(或兴奋感)的好地方。

模式和工具

你想要使用的 LaTeX 是 Emacs 模式奥科特克斯为此http://emacswiki.org/emacs/AUCTeX是一个很好的资源,另请参阅emacs+AUCTeX 的有用快捷键、键绑定或预定义命令开始学习 AUCTeX 的最佳方式可能是阅读快速启动。我在下面的设置中包含了一些在使用 AUCTeX 时可以开始使用的配置。AUCTeX 可以处理\inputstandalone

我从未使用过memoir,所以我不知道是否有一些特定的 Emacs 小工具可以帮助解决这个问题。一般来说YASnippet是让插入您经常插入的结构和制作模板变得更容易的好方法,因此它memoir也应该对有帮助。 同样适用于beamer。 创建 beamer 幻灯片的另一种方法是通过另一个 Emacs 模式,称为Org 模式这是一种记笔记、维护待办事项列表、进行项目规划和创作的模式。你要做的是编写一个 org 文件并将其导出到 beamer. 最后,对于 TikZ 结帐TikZ 的 AucTeX 扩展

你可以设置 Emacs 以与 latexmk 配合使用(我喜欢的方式是https://stackoverflow.com/a/8026921/789593)。然后,由于您使用 latexmk,因此您可以通过 latexmk 自己的配置使用 bibtex 设置 biblatex 并使用 lualatex、xelatex 和 pdflatex 进行编译。

要插入biblatex引文宏和交叉引用,您可以使用参考TeX它随 AUCTeX 一起提供。查看使用 biblatex 引用命令设置 RefTeX用于配置。在下面的配置中,我已经包含了这样的行。

Emacs 有完全支持 unicode并且它对大多数命令都有自动完成功能。AUCTeX 还提供了TeX 命令的自动完成

Emacs 有很好的拼写工具。我用的是飞咒当我需要检查拼写时,我会在写作时关闭它以避免分心。使用 AUCTeX,它可以知道代码和文本之间的区别。使用 Flyspell 可以对M-x flyspell-buffer整个缓冲区进行拼写检查,也M-x flyspell-region可以对标记区域进行拼写检查。如果您想将拼写检查与 LaTeX 语言包集成,以下问题可能会让您感兴趣:

工作流

我已经在每天使用 LaTeX 和工作流程?它包括 LaTeX 工作流程的一般描述(但没有考虑特定的编辑器),以及如何通过 Org-mode 和 AUCTeX 实现它的简短描述。我认为在 Org-mode 中最好进行概述和起草。AUCTeX 最适合在流程的后期使用。由于您的问题是关于 Emacs 和 LaTeX 的,因此我不会过多谈论 Org-mode,而是专注于 AUCTeX。

最佳工作流程可能因任务和人员而异。以下只是关于如何在 Emacs 中处理 LaTeX 文件的一些一般说明。当您在 Emacs 中编辑 LaTeX 文件时,您可能会花费大部分时间使用 AUCTeX,但由于您使用 biblatex,因此您还将编辑 .bib 文件。粗略地说,使用 LaTeX 文件可以分为编写或编译。

在写作时,你应该使用 Emacs 中的所有基本命令来浏览文本和编辑文本。这些你通过练习来学习。AUCTeX 提供了一些你应该学习的 LaTeX 特定命令,确保检查用于创建宏、C-c Enter和环境的命令C-c C-eLaTeX 数学模式以及用于插入引文和交叉引用的 RefTeX 命令,请参阅上面的 AUCTeX 资源了解详情。为了加快并简化 LaTeX 文件的创建,您可以通过 YASnippet 使用模板,如中所述使用模板。另外,.bib 文件还有一种特殊模式,可以方便编辑此类文件。

在编译时,你可以使用上面描述的 latexmk,但你也可以使用 AUCTeX 内置的编译方法,这种方法相当不错(C-c C-c)。要查看当前缓冲区的输出,只需执行C-c C-v。如果编译失败,AUCTeX 可以带你到发生错误的行。

工作流程的另一个方面是跟踪变更。这可以通过修订控制来实现,请参阅在 LaTeX 文档中使用版本控制(git 等)有什么好处VCS 与 LaTeX 文档的良好工作实践是什么?了解详情。Emacs 内置支持许多修订控制系统。如果你使用 git玛吉特优于内置的 git 支持。

设置

你的 Emacs 配置基于你的.emacs 文件这是一个由 Lisp 代码组成的文本文件。您不必了解 Lisp 即可配置 Emacs(尽管了解一些 Lisp 会对您有好处)。通常,您会在网上找到一些代码片段,然后将其粘贴到 .emacs 中。

配置 Emacs 是一个永无止境的过程。这没有什么错。您可以根据自己的需要进行调整。但是,最好有一个开始。下面是一个 .emacs 文件。我删除了大部分内容,只留下一些次要的显示配置、一些常规的 AUCTeX 和 RefTeX 配置以及一些用于正确语法突出显示流行软件包(如 、enumitembiblatexmacros )中的宏的配置csquotes。我对其进行了大量注释,以便更容易理解它的作用。如果有一些配置您不喜欢,您可以删除相关行或注释它们以停用它们。请务必保留 .emacs 的备份,以免丢失配置。

;;; Brent.Longborough's .emacs

(global-visual-line-mode 1); Proper line wrapping
(global-hl-line-mode 1); Highlight current row
(show-paren-mode 1); Matches parentheses and such in every mode
(set-fringe-mode '(0 . 0)); Disable fringe because I use visual-line-mode
(set-face-background hl-line-face "#f2f1f0"); Same color as greyness in gtk
(setq inhibit-splash-screen t); Disable splash screen
(setq visible-bell t); Flashes on error
(setq calendar-week-start-day 1); Calender should start on Monday
(add-to-list 'default-frame-alist '(height . 59)); Default frame height.

;;; AUCTeX
;; Customary Customization, p. 1 and 16 in the manual, and http://www.emacswiki.org/emacs/AUCTeX#toc2
(setq TeX-parse-self t); Enable parse on load.
(setq TeX-auto-save t); Enable parse on save.
(setq-default TeX-master nil)

(setq TeX-PDF-mode t); PDF mode (rather than DVI-mode)

(add-hook 'TeX-mode-hook 'flyspell-mode); Enable Flyspell mode for TeX modes such as AUCTeX. Highlights all misspelled words.
(add-hook 'emacs-lisp-mode-hook 'flyspell-prog-mode); Enable Flyspell program mode for emacs lisp mode, which highlights all misspelled words in comments and strings.
(setq ispell-dictionary "english"); Default dictionary. To change do M-x ispell-change-dictionary RET.
(add-hook 'TeX-mode-hook
          (lambda () (TeX-fold-mode 1))); Automatically activate TeX-fold-mode.
(setq LaTeX-babel-hyphen nil); Disable language-specific hyphen insertion.

;; " expands into csquotes macros (for this to work babel must be loaded after csquotes).
(setq LaTeX-csquotes-close-quote "}"
      LaTeX-csquotes-open-quote "\\enquote{")

;; LaTeX-math-mode http://www.gnu.org/s/auctex/manual/auctex/Mathematics.html
(add-hook 'TeX-mode-hook 'LaTeX-math-mode)

;;; RefTeX
;; Turn on RefTeX for AUCTeX http://www.gnu.org/s/auctex/manual/reftex/reftex_5.html
(add-hook 'TeX-mode-hook 'turn-on-reftex)

(eval-after-load 'reftex-vars; Is this construct really needed?
  '(progn
     (setq reftex-cite-prompt-optional-args t); Prompt for empty optional arguments in cite macros.
     ;; Make RefTeX interact with AUCTeX, http://www.gnu.org/s/auctex/manual/reftex/AUCTeX_002dRefTeX-Interface.html
     (setq reftex-plug-into-AUCTeX t)
     ;; So that RefTeX also recognizes \addbibresource. Note that you
     ;; can't use $HOME in path for \addbibresource but that "~"
     ;; works.
     (setq reftex-bibliography-commands '("bibliography" "nobibliography" "addbibresource"))
;     (setq reftex-default-bibliography '("UNCOMMENT LINE AND INSERT PATH TO YOUR BIBLIOGRAPHY HERE")); So that RefTeX in Org-mode knows bibliography
     (setcdr (assoc 'caption reftex-default-context-regexps) "\\\\\\(rot\\|sub\\)?caption\\*?[[{]"); Recognize \subcaptions, e.g. reftex-citation
     (setq reftex-cite-format; Get ReTeX with biblatex, see https://tex.stackexchange.com/questions/31966/setting-up-reftex-with-biblatex-citation-commands/31992#31992
           '((?t . "\\textcite[]{%l}")
             (?a . "\\autocite[]{%l}")
             (?c . "\\cite[]{%l}")
             (?s . "\\smartcite[]{%l}")
             (?f . "\\footcite[]{%l}")
             (?n . "\\nocite{%l}")
             (?b . "\\blockcquote[]{%l}{}")))))

;; Fontification (remove unnecessary entries as you notice them) http://lists.gnu.org/archive/html/emacs-orgmode/2009-05/msg00236.html http://www.gnu.org/software/auctex/manual/auctex/Fontification-of-macros.html
(setq font-latex-match-reference-keywords
      '(
        ;; biblatex
        ("printbibliography" "[{")
        ("addbibresource" "[{")
        ;; Standard commands
        ;; ("cite" "[{")
        ("Cite" "[{")
        ("parencite" "[{")
        ("Parencite" "[{")
        ("footcite" "[{")
        ("footcitetext" "[{")
        ;; ;; Style-specific commands
        ("textcite" "[{")
        ("Textcite" "[{")
        ("smartcite" "[{")
        ("Smartcite" "[{")
        ("cite*" "[{")
        ("parencite*" "[{")
        ("supercite" "[{")
        ; Qualified citation lists
        ("cites" "[{")
        ("Cites" "[{")
        ("parencites" "[{")
        ("Parencites" "[{")
        ("footcites" "[{")
        ("footcitetexts" "[{")
        ("smartcites" "[{")
        ("Smartcites" "[{")
        ("textcites" "[{")
        ("Textcites" "[{")
        ("supercites" "[{")
        ;; Style-independent commands
        ("autocite" "[{")
        ("Autocite" "[{")
        ("autocite*" "[{")
        ("Autocite*" "[{")
        ("autocites" "[{")
        ("Autocites" "[{")
        ;; Text commands
        ("citeauthor" "[{")
        ("Citeauthor" "[{")
        ("citetitle" "[{")
        ("citetitle*" "[{")
        ("citeyear" "[{")
        ("citedate" "[{")
        ("citeurl" "[{")
        ;; Special commands
        ("fullcite" "[{")))

(setq font-latex-match-textual-keywords
      '(
        ;; biblatex brackets
        ("parentext" "{")
        ("brackettext" "{")
        ("hybridblockquote" "[{")
        ;; Auxiliary Commands
        ("textelp" "{")
        ("textelp*" "{")
        ("textins" "{")
        ("textins*" "{")
        ;; supcaption
        ("subcaption" "[{")))

(setq font-latex-match-variable-keywords
      '(
        ;; amsmath
        ("numberwithin" "{")
        ;; enumitem
        ("setlist" "[{")
        ("setlist*" "[{")
        ("newlist" "{")
        ("renewlist" "{")
        ("setlistdepth" "{")
        ("restartlist" "{")))

答案2

Kieran Healy 的“选择您的工作流应用程序”是一个很好的起点。在文章中,Healy 写了关于 EMACS、LaTeX、R 的内容。

答案3

对于编译和预览,我在 Windows 机器上使用内置预览功能并没有取得很大成功。我没有完全在 Emacs 中工作,而是使用苏门答腊 PDF使用 TeX-source-correlate-mode 的查看器。这样我就可以生成带有参考链接的 PDF,然后从 Emacs 正向搜索 PDF,再从 PDF 反向搜索 Emacs 中的源文件。Sumatra 还会在连续编译时更新查看器中的 PDF,因此您不必像使用 Acrobat 那样关闭 PDF 查看器。

我的 .emacs 文件的相关部分是:

(add-hook 'LaTeX-mode-hook 'TeX-source-correlate-mode)
(server-start)
(require 'sumatra-forward)

第一行打开正向和反向链接的关联模式。第二行是当我从 PDF 进行反向搜索时,Emacs 将跳转到当前代码缓冲区中的行,而不是每次反向搜索时都尝试打开新的 Emacs 实例。最后一行加载一个包来处理用于正向搜索的苏门答腊特定 lisp。

关于如何用 Emacs 设置 Sumatra 以及 sumatra-forward.el 的更多信息,可以在这里找到这里

我的其他技巧和窍门大部分都已在NN 的精彩回答。我只想重申 YASnippet 非常适合模板文本,并且非常易于配置。我经常用它来做类似的事情\frac{}{},这样当我展开片段时,我可以从分子切换到分母,然后切换到退出分数。

我发现另一个有用的软件包是突出显示括号模式,它可以为{[()]}光标周围的颜色着色。它曾多次帮助我编辑长方程式。

我还要补充一点,Org-mode 是一款很棒的工具,除了 LaTeX 集成之外,它还有很多功能。这就是我开始使用 Emacs 并继续使用它的原因。所以,如果你正在寻找一些额外的动力来重新使用 Emacs,我建议你看看 Org-mode 能做什么。

答案4

这里已经有很多很棒的答案了。我一直面临的一个问题是在幻灯片上插入图形对象。我为此使用了 tikz(带覆盖),但第一次尝试就获得正确的坐标总是一个问题,我最终浪费了太多时间进行编写-编译-检查迭代。

我编写了一个名为 的新包,cart.el它使这个过程更加简化,允许用户单击框架以插入适当的坐标。我将其托管在github 这里- 一定要检查一下!

下面是在 emacs 上使用此包在几分钟内完整创建的幻灯片,例如: 在此处输入图片描述

我在这里发布这个是因为这已经成为我在 emacs 上准备演示文稿的工作流程的主要部分。

相关内容