Solist Work Blog

Software engineer note

EmacsでMarkdownからpdfを作る

Emacsで今編集しているMarkdownファイルからいきなりpdfやdocxを生成できるようになれば仕事がさらにやりやすくなるだろうという着想から作った機能があります。 しばらく使ってみてかなり仕事がはかどるようになりました。

何はともあれ出来上がったgifアニメーションをご覧ください。

emacsでmarkdownからpdfを作る

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

M-x md2pdf

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

M-x md2docx

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

markdownでOfficeを断捨離

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

そうであるならば、pdfとdocxを作成するときにOffice系のソフトウェアで文書を作成しないようにすると、個人的にOffice系のソフトウェアを断捨離できるのではないかという企みです。 pdfで文書を作成するとスマートフォンでも閲覧できるのでよいのではないでしょうか。 GitHubでMarkdownを使ってドキュメントを書くのは慣れていますし、pdfとdocxもこの際Markdownで書いていくことにしましょう。 Markdownはテキストベースのフォーマットなのでgitで管理しやすいのもよい点です。 またOffice系のソフトウェアはEmacsキーバインド1で文章が書けなくて苦痛だったので、 Emacsでpdfとdocxを生成できるなら仕事が捗るようになります。

コマンドラインでpdfとdocxを生成

md2pdf draft.md

pdfを作る場合

md2docx draft.md

docxを作る場合(ほとんどの場合pdfでよいと思いますが)。 これでdraft.docxのファイルが完成するようになりました。

必要なものをinstall

LaTeXPandocが必要なのでお使いの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のmarkdownからpdfを直接生成

ここから本題に入ります。 コマンドラインでディレクトリ移動してコマンドをたたくのも悪くはないですが、 もっと楽にエディタで今編集しているMarkdownから直接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"))))

macOSではxdg-openのかわりにopenコマンドを使用してください。

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


  1. xkeysnail, xremapでできないこともないのかもしれないが… ↩︎

タグ一覧

お仕事のご相談などはこちらからどうぞ

お仕事の依頼はこちらからどうぞ