Weave.jl を使えば Julia + Markdown → PDF,HTML ができる!


Weave.jl とは & この記事を通してできること

Weave.jl は,

  • Markdown で記述した Juliaコードを実行してくれる.
  • 書いたコード,出力された結果は出力先(HTML , pdf)に出力してくれる.

という特徴があるパッケージです.MarkdownとJuliaの融合ですね!(語彙力)
大学のレポート,ゼミの資料や自分の考えをまとめる...など用途が浮かびますね!

Weave.jl を書くにあたって,

は書ける(書き方を知ってる & 書き方を調べられる)という前提で進めます.

環境

私は VSCode で編集しています.
VSCode での Julia環境構築については,この記事 などを参考にしてください.

VSCode の拡張機能は

を入れています.

mac
macOS Catalina

julia

julia> versioninfo()

Julia Version 1.4.2
Commit 44fa15b150* (2020-05-23 18:35 UTC)
Platform Info:
  OS: macOS (x86_64-apple-darwin18.7.0)
  CPU: Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-8.0.1 (ORCJIT, skylake)
Environment:
  JULIA_EDITOR = "/Applications/Visual Studio Code.app/Contents/Resources/app/bin/code"
  JULIA_NUM_THREADS = 

流れ

1. jmd ファイル

お使いのブラウザで .jmd 拡張子のファイルを用意します.(jmdって多分,julia+markdownでしょうな...)
用意した .jmdファイルに以下のように記述します.

コードが書いてある部分を見ると,sin(x) のグラフに cos(x) のグラフを重ね合わせるコードですね.このように,3つのグレイヴアクセント(`)に囲まれた箇所にコードを書いていきます.出力の時は,この部分に書かれたコードが実行されます.

これを出力していきましょう.

2. 実行用の .jl ファイル

続いて,実行用の .jl ファイルを準備します.私は .jmdと同じディレクトリにおきましたが,後で相対パスを入れるので問題はないです.用意した .jlファイルには目的に応じて次のようなコードを書き込みます.

jmd → HTML をしたい人

demo.jl
using Weave

#相対パスを入力
filename = normpath("demo.jmd")

weave(filename , out_path = :pwd , doctype = "md2html")

jmd → pdf をしたい人

demo.jl
using Weave

#相対パスを入力
filename = normpath("demo.jmd")

# 英語のみでいいとき
weave(filename , out_path = :pwd , doctype = "md2pdf")

# 日本語を出力したいとき
weave(filename , out_path = :pwd , doctype = "md2pdf" , template="julia_tex.tpl")

ここでpdf変換のコードに出てきたjulia_tex.tplについて,これは日本語対応のためのファイルです..jlファイルと同じディレクトリに置いておきましょう.中身は以下のようなものです.(黒木さんが書かれたコードです.こちら)

julia_tex.tpl
%%
%% Taken from 
%% https://github.com/JunoLab/Weave.jl/blob/master/templates/julia_tex.tpl
%%
%% I've applied GenKuroki-san's patch
%% https://gist.github.com/genkuroki/479a1fec113035f05c661675eee8b830
%%


% \documentclass[12pt,a4paper]{article}
\documentclass[12pt,a4paper,xelatex,ja=standard]{bxjsarticle}
% \usepackage[a4paper,text={16.5cm,25.2cm},centering]{geometry}
\geometry{top=1cm, bottom=1cm, left=2cm, right=2cm}
\usepackage{lmodern}
\usepackage{amssymb,amsmath}
\usepackage{bm}
\usepackage{graphicx}
\usepackage{microtype}
\usepackage{hyperref}
\setlength{\parindent}{0pt}
\setlength{\parskip}{1.2ex}

\hypersetup
       {   pdfauthor = { {{{:author}}} },
           pdftitle={ {{{:title}}} },
           colorlinks=TRUE,
           linkcolor=black,
           citecolor=blue,
           urlcolor=blue
       }

{{#:title}}
\title{ {{{ :title }}} }
{{/:title}}

{{#:author}}
\author{ {{{ :author }}} }
{{/:author}}

{{#:date}}
\date{ {{{ :date }}} }
{{/:date}}

{{ :highlight }}

\begin{document}

{{#:title}}\maketitle{{/:title}}

\tableofcontents

{{{ :body }}}

\end{document}

3. 実行

それでは,ここまで記述ができたら実行していきましょう.VSCodeでは,shift + Enter で Julia REPLが動き出します.実行が成功すると,HTMLに変換した人はHTMLファイル,pdfに変換した人はpdfファイルがディレクトリ内に生成されています.pdf変換した後はこんな感じ↓(ついでに実行したHTMLファイルもいます)

どうでしょう,すごいですよね!!(鼻息)
しっかり実行された状態でpdfに変換されてくれましたね.HTMLに変換した人も,ブラウザで開いてもらうとしっかり表示されます.後これGitHubにあげて公開できますね,強い.

4. HTMLの日本語対応問題

記事の最後に,まだ触れていなかった「HTMLの日本語対応化」について書きます.これはもうHTMLファイルを直で編集するのが早い.エディタでHTMLファイルを開いて,2行目あたりにある

demo.html
<HTML lang = "en">

demo.html
<HTML lang = "ja">

に書き換えておしまいです.簡単簡単.

最後に

ここまで読んでくださりありがとうございました.ぜひ試してみてください.
Weave.jlを使っていろんなことができそうですね,私も想像が働きます.

ここまでたどり着くために参考にしたものは記事内リンクで埋め込ませていただきました.感謝します.
よりスマートに書いている記事はこちらです.