之前一直用 org-export-docx 这个自定义函数通过 Pandoc 转 org 文件到 docx,最近发现如果文件路径名带空格就法转换。经过查询,只要在命令参数中的路径用 \"
包裹起来就可以正常使用了。
其实这有一个现成的 Emacs 包 ox-pandoc,但我个人需求比较简单,就没去用它,感兴趣的可以试试。
这里总结了一篇文章,介绍两种将 org 文件转 docx 格式的方式。
之前一直用 org-export-docx 这个自定义函数通过 Pandoc 转 org 文件到 docx,最近发现如果文件路径名带空格就法转换。经过查询,只要在命令参数中的路径用 \"
包裹起来就可以正常使用了。
其实这有一个现成的 Emacs 包 ox-pandoc,但我个人需求比较简单,就没去用它,感兴趣的可以试试。
这里总结了一篇文章,介绍两种将 org 文件转 docx 格式的方式。
对于这个问题,用 call-process
替换 shell-command
来解决会更好。写了个更加强壮的版本,更方便看到出错信息。如有写的不对的地方,欢迎指正。
(defun org-pandoc-convert-to-docx ()
"Convert current buffer file to docx format by Pandoc."
(interactive)
(let ((command "pandoc")
(refdoc (list "--reference-doc"
(expand-file-name "var/reference.docx" user-emacs-directory))))
(cond ((not buffer-file-name) (user-error "Must be visiting a file"))
(t (let* ((buffer (generate-new-buffer " *Pandoc output*"))
(filename (list buffer-file-name))
(output (list "-o" (concat (file-name-sans-extension (buffer-file-name)) ".docx")))
(arguments (nconc filename refdoc output))
(exit-code (apply #'call-process command nil buffer nil arguments)))
(cond ((eql 0 exit-code)
(kill-buffer buffer)
(message "Convert finished: %s" (cadr output)))
(t (with-current-buffer buffer
(goto-char (point-min))
(insert (format "%s\n%s\n\n" (make-string 50 ?=) (current-time-string)))
(insert (format "Calling pandoc with:\n\n%s\n\nFailed with error:\n\n"
(mapconcat #'identity (cons command arguments) " ")))
(special-mode))
(pop-to-buffer buffer)
(error "Convert failed with exit code %s" exit-code))))))))
PS:这个函数其实也可以用在 Markdown 等其他格式转 docx,看来名字要改下了。这也是用 pandoc 的优势。