Solist Work Blog

List of all blog posts

EmacsでMarkdownからpdfを作る

アイデアとしてはEmacsで今編集しているMarkdownファイルからいきなりpdfを生成するようにして楽をしようということです。 何はともあれ出来上がったgifアニメーションをご覧ください。

emacsでmarkdownからpdfを作る

Emacsで対象となるMarkdownファイルを開いた状態で

M-x md2pdf

これだけで同じディレクトリ内にpdfができて楽になりました。

M-x md2docx

これだけで同じディレクトリにdocxが生成されます。

Officeの断捨離?

最近は請求書や見積書をwebアプリで作ることは一般化しているので、 wordやexcelなどのoffice系ソフトの必要性は低下してきています。 wordやexcelを使いたい人も最終的にpdfで出力すればトラブルも少ないと周知されてきたので、 資料となるデータはpdfでいただくことが多くなってきました。 これはたいへんありがたいことです。

そうであるならば、docxとpdfを作成するときにoffice系のソフトで文書を作成しないようにすると、個人的にはoffice系のソフトウェアを断捨離できるのではないかという企みです。 githubでMarkdownでドキュメントを書くのは慣れていますし、docxとpdfもこの際Markdownで書いていくことにしましょう。 office系のソフトウェアはemacsキーバインド1で文章が書けなくて苦痛だったので、 Emacsでdocxとpdfを生成できるなら仕事が捗るようになります。

コマンドラインのみで動かす場合

md2pdf draft.md

docxを作る場合(ほとんどpdfでよいと思うけど)

md2docx draft.md

これでdraft.docxのファイルが完成するようになりました。

必要なものをInstall

LaTeXとpandocが必要なのでお使いのOSに合わせてインストールしてください。 例はArchLinuxです。

sudo pacman -S pandoc texlive-langjapanese texlive-latexextra

~/.bashrcか~/.zshrcに以下のように書いておきます。

function md2pdf() {
    if [ $# = 1 ]; then
        fname_ext=$1
        fname="${fname_ext%.*}"
        pandoc $1 -o $fname.pdf -V mainfont=IPAPGothic -V fontsize=16pt --pdf-engine=lualatex
    else
        echo 'usage: md2pdf file.md'
    fi
}


function md2docx() {
    if [ $# = 1 ]; then
        fname_ext=$1
        fname="${fname_ext%.*}"
        pandoc $1 -t docx -o $fname.docx -V mainfont=IPAPGothic -V fontsize=16pt --toc --highlight-style=zenburn
    else
        echo 'usage: md2docx file.md'
    fi
}

コマンドラインだけならこれで終わりです。 フォントはお好きなものを設定してください。

Emacs

ここから本題に入ります。 コマンドラインでディレクトリ移動してコマンドをたたくのも悪くはないですが、 もっと楽にエディタから直接pdfとdocxを作りたいのでelispを書きます。

exec-path-from-shellが必要なのでインストールします。

(defun md2pdf ()
"Generate pdf from currently open markdown."
(interactive)
(let ((filename (buffer-file-name (current-buffer))))
(shell-command-to-string
 (concat "pandoc "
     filename
     " -o "
     (file-name-sans-extension filename)
     ".pdf -V mainfont=IPAPGothic -V fontsize=16pt --pdf-engine=lualatex"))
(shell-command-to-string
 (concat "xdg-open "
     (file-name-sans-extension filename)
     ".pdf"))))


(defun md2docx ()
"Generate docx from currently open markdown."
(interactive)
(let ((filename (buffer-file-name (current-buffer))))
(shell-command-to-string
 (concat "pandoc "
     filename
     " -t docx -o "
     (file-name-sans-extension filename)
     ".docx -V mainfont=IPAPGothic -V fontsize=16pt --toc --highlight-style=zenburn"))
(shell-command-to-string
 (concat "xdg-open "
     (file-name-sans-extension filename)
     ".docx"))))

mac os xではxdg-openのかわりにopenコマンドを利用してください。

フォントはお好きなものを設定してください。


  1. xkeysnail, xremapでできないこともないと思います [return]