org-mode 下英文标点与中文标点的转换?

我喜欢用英文标点而不是中文标点, 但是导出需要上交的报告时需要用中文标点, 因此希望将 org mode buffer 中的英文标点转换为中文标点, 正则表达式替换是不够的, 比如数学环境和代码环境中的 , 就不应该被替换.

我想只对不导出部分(比如 :noexport: tag 下)的 paragraph 进行替换, 并且避开数学环境, 代码环境等. 在z自己实现之前, 我想问问有没有已有的包对 org-mode 进行中英文标点转换的?

我写过一个转换标点符号的函数。只处理了我用到的情况。你可以参考下。

(defun my-convert-to-fullwidth-punctuations ()
  (interactive)
  (let ((cjk "\\([\u4E00-\u9FCC\u3400-\u4DB5\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA1F\uFA21\uFA23\uFA24\uFA27-\uFA29]\\|[\ud840-\ud868][\udc00-\udfff]\\|\ud869[\udc00-\uded6\udf00-\udfff]\\|[\ud86a-\ud86c][\udc00-\udfff]\\|\ud86d[\udc00-\udf34\udf40-\udfff]\\|\ud86e[\udc00-\udc1d]\\)" )
        (punct-before-cjk '(("\"" . "“")
                            ("(" . "(")
                            ("'" . "‘")))
        (punct-after-cjk '(("." . "。")
                           ("," . ",")
                           ("!" . "!")
                           ("?" . "?")
                           (":" . ":")
                           (";" . ";")
                           ("\"" . "”")
                           (")" . ")"))))

    (pcase-dolist (`(,punct-half . ,punct-full) punct-before-cjk)
      (replace-regexp-in-region (concat (regexp-quote punct-half) cjk)
                                (concat punct-full "\\1")
                                (point-min)))
    (pcase-dolist (`(,punct-half . ,punct-full) punct-after-cjk)
      (replace-regexp-in-region (concat cjk (regexp-quote punct-half))
                                (concat "\\1" punct-full)
                                (point-min)))))
1 个赞

这不是自己实现最简单吗? 没有包天生满足你这么个人化的需求的. 你把自己写的替换函数放到 org-export-before-processing-hook 或者 org-export-before-parsing-hook 里, 甚至可以不改动 org 源文件, 只改导出的文件.