GNU Emacs Org-mode 札记

Table of Contents

1 Org-mode 中英文混排添加空格问题

按照 w3c《中文排版要求》中的中英文混排规范《中文文案排版指北》中的推荐,中英文混排时应当在中英文中插入一个半角空格。但是手动添加空格实在是麻烦,聪明的(懒惰的)程序员们便写出了形形色色的自动化添加空格的外部工具,例如 pangu.py。

但是使用外部工具还是有点麻烦的,org-mode 有没有直接可用的内部工具呢?经过一番搜索,还真有!那就是 pangu-spacing~

1.1 安装

作为直接抄陈斌大佬配置的小白用户,我就写一下怎么在这份配置中安装 pangu-spacing 吧~

修改 ~/.emacs.d/lisp/init-elpa.el 文件,在 melpa-include-packages 变量列表的末尾添加 pangu-spacing,然后重新加载配置文件之后执行 M-x package-install 即可。

1.2 使用

成功安装 pangu-spacing 之后,我们要如何使用它呢?

pangu-spacing 主要提供两个功能:

  • pangu-spacing-mode,
  • pangu-spacing-space-current-buffer.

第一个 pangu-spacing-mode,顾名思义就是一个 minor mode 啦。启用它之后,它会拉大中英文间的间隔。值得注意的是这个 minor mode 只是单纯拉大显示效果的间隔,并没有在中英文之间插入空格,所以这时候导出的 HTML 文档中英文还是粘在一起的。

第二个 pangu-spacing-space-current-buffer 则是在中英文中添加空格。

1.3 不足之处

pangu-spacing 虽然基本上能解决 90% 的需要插入空格的情况,但是奈何 org-mode 功能众多,在某些情况下我们还是需要手动插入空格。

比较典型的例子是插入 description 为纯英文的链接时,按照规范我们应当在这个链接两侧都添加空格,但是很遗憾 pangu-spacing 似乎还无法做到这一点。

2 Org-mode 中文行内格式化问题

众所周知,Org-mode 支持很多 Markup 和富文本语法,例如常见的 BoldItalicUnderlineVerbatimCode等等。在纯英文环境下,因为被标记的单词前后都有空格分割,这些 markup 语法都能正常工作。然而在中文环境下没有用空格分割字这个说法,这些 markup 语法就不能工作了……

有没有解决办法呢?经过一番搜索,答案是有的,但是不优雅(逃

在配置文件中添加以下代码即可:

;; 必须添加在 (require 'org) 之前
(setq org-emphasis-regexp-components
      ;; markup 记号前后允许中文
      (list (concat " \t('\"{"            "[:nonascii:]")
            (concat "- \t.,:!?;'\")}\\["  "[:nonascii:]")
            " \t\r\n,\"'"
            "."
            1))

(with-eval-after-load 'org
  (setq org-match-substring-regexp
        (concat
         ;; 限制上标和下标的匹配范围,org 中对其的介绍见:(org) Subscripts and superscripts
         "\\([0-9a-zA-Zα-γΑ-Ω]\\)\\([_^]\\)\\("
         "\\(?:" (org-create-multibrace-regexp "{" "}" org-match-sexp-depth) "\\)"
         "\\|"
         "\\(?:" (org-create-multibrace-regexp "(" ")" org-match-sexp-depth) "\\)"
         "\\|"
         "\\(?:\\*\\|[+-]?[[:alnum:].,\\]*[[:alnum:]]\\)\\)")))

Created: 2019-02-14 Thu 21:40