【pandoc】Markdownをtexに変換しよう

プログラミング言語

こんにちは,ブログカフェChromaの色です!

前回,VSCodeとMarkdownの連携の話をしました.

その次のステップとして,論文を書く際によく用いられるtex文書もMarkdownから変換できれば楽なのになー!って思いました.

Markdownからtexへ変換可能なツールとして,pandocがあり,今回はその設定の詳細を語りたいと思います.

かなり苦戦したので,解決法などをシェアしたいと思います.

自分用の説明書きを加筆修正したものなので,読みにくい点あればご指摘願います!

この記事のターゲット

  • pandocの設定がうまくいかない人
  • Markdownとtexをよく利用する人
  • 論文をサクサク書きたい人

default.latexとは

一応説明書きを残しておきます.

簡単に言うと,pandocでファイルをtex形式に変換する際に適用する設定ファイルのようなもの.

今回はMarkdownを例にとって説明します.

Markdownは簡単なコードでボールドやイタリックなどが可能だが,texはちゃんとした記述が必要.

以下に簡単な例を示します.

見出しがあって,その後に太字の文章が続くようなレイアウトを作る場合について.

texの場合

\documentclass[uplatex]{jsarticle}

\begin{document}
\section{見出し}
\textbf{この中が太字}
\end{document}

Markdownの場合

# 見出し
**この中が太字**

全然違いますね.

このように,Markdownとtexでは,同じことを実現するのに必要な記述が全然違う

default.latexでは,他形式→texに変換する際に追加する内容を主に設定していると思われる.

default.latexの設置場所

その前に,共通の操作をば.

ターミナル(またはコマンドプロンプト)を立ち上げ,

pandoc -v

と入力する.

-vオプションは,pandocのバージョン情報を表示させることができる.以下の画面が表示されるはず.

pandoc バージョン
Compiled with pandoc-types 1.17.0.5, texmath 0.9.4.4, skylighting 0.3.3.1
Default user data directory: /home/ユーザ名/.pandoc
Copyright (C) 2006-2016 John MacFarlane
Web:  http://pandoc.org
This is free software; see the source for copying conditions.
There is no warranty, not even for merchantability or fitness
for a particular purpose.

上記の/home/ユーザ名/.pandoc部分がpandoc関連の設定ファイル読み込み場所(Windowsでは.pandocではなくpandocになっているかも).

.pandoc(pandoc)フォルダがない場合は上で調べた場所に作成しましょう.

作成した.pandoc(pandoc)フォルダ内に,templetesという名前のフォルダを更に作成.

最後に,templetesフォルダ内にdefault.latexを作成して作業完了!!

最終的なディレクトリ構成はlinuxなら/home/ユーザ名/.pandoc/templates/default.latexみたいになってればOKだと思います.

お手本にしたもの

こちらのページでdefault.latexの内容をコピペして試してみた.

直接コードを貼ることはしませんので,リンク先のdefault.latexをご覧ください.

自作のdefault.latexの内容は下にありますがこちらからすぐに見ることができます.

上記の中身は,mdファイルをtex形式に変換するときにどのようにタグ付けしたり色付けしたりするかの設定が書かれているっぽい.

仕上がりはきれいになってとても重宝する!

が,(個人的に)普段使わないパッケージがたくさん入っているので,素の状態ではコンパイルエラーが出てしまう…

色

あと,なんかプリアンブルがごちゃごちゃしている…

更に調べてみて,わかったことがあるので紹介します!

uplatex使う場合はmicrotypeとの相性悪し

私はuplatexを使っているので,プリアンブルにある\usepackage[microtype]的な記述は消したほうがいいかもしれません.

usepackageの上にifpackageexistsが使われているが,パッケージ自体は存在するため,読み込まれてしまうので回避できません…まとめて消去しましょう.

hyperrefとも相性悪い

hyperrefの所為なのかはわからんが,sectionとかに変な囲いができてコンパイルできない…

そこでdefault.latex中の\hyperref\hypersetupのif-endif間の部分は全て消してしまいましょう.

それぐらいを消せば一応コンパイルは通るかな?

color系もうざったければ…

この程度の変更であれば,mdでハイライトを有効にしている場合,tex経由のpdfでも色付きでコードが表示されます.

これは,usepackage{color}関連のパッケージによるものっぽい.

usepackage周辺もしくはbegin{document}の手前くらいにある色設定の項目で,好きなように色設定ます.

RGBコードで指定してあげましょう.

しかし,コードの部分がかなりタグだらけになってしまい見栄えが悪いので要らなければまとめて削除すると吉.

tableofcontentsがない

つまり目次については自分で書いてねってことです.

毎回書くのがめんどくさければ,default.latex中の\begin{document}の前らへんに\tableofcontentsを挿入しておけば毎回の手間が省けるので便利かと.

こんな感じでプリアンブルにも好きなものをぶっこめるんです.

\documentclassの中身が足りない

上記のコードだったら[uplatex]しか書いてない…

一応A4用紙を想定していることを明記しておきたいので,\documentclass[a4paper,uplatex]{jsarticle}にしました.

あとはプリアンブル関連で,マージンとかの設定もしたかったので以下の感じに.

\usepackage{ascmac}
\usepackage[margin=1in]{geometry}
\usepackage[dvipdfmx]{graphicx}
\setcounter{tocdepth}{3}

tocdepthは見出しの階層を目次でどこまで表示するかを設定しているので好きに数字を変えるといいです.

自分用にdefault.latexをカスタマイズした

色々編集したりしてみて,最終的にこんな感じに落ち着きました.

改変後のdefault.latex

%my settings
\documentclass[uplatex,a4paper]{jsarticle}
\usepackage{ascmac}
\usepackage[margin=1in]{geometry}
\usepackage[dvipdfmx]{graphicx}
\setcounter{tocdepth}{3}

$if(title)$
\title{$title$$if(thanks)$\thanks{$thanks$}$endif$}
$endif$
$if(subtitle)$
\providecommand{\subtitle}[1]{}
\subtitle{$subtitle$}
$endif$
$if(author)$
\author{$for(author)$$author$$sep$ \and $endfor$}
$endif$
$if(institute)$
\providecommand{\institute}[1]{}
\institute{$for(institute)$$institute$$sep$ \and $endfor$}
$endif$
\date{$date$}
$if(beamer)$
$if(titlegraphic)$
\titlegraphic{\includegraphics{$titlegraphic$}}
$endif$
$if(logo)$
\logo{\includegraphics{$logo$}}
$endif$
$endif$


\begin{document}
$if(title)$
$if(beamer)$
\frame{\titlepage}
$else$
\maketitle
$endif$
$if(abstract)$
\begin{abstract}
$abstract$
\end{abstract}
$endif$
$endif$
\tableofcontents

$for(include-before)$
$include-before$

$endfor$
$if(toc)$
$if(beamer)$
\begin{frame}
\tableofcontents[hideallsubsections]
\end{frame}
$else$
{
$if(colorlinks)$
\hypersetup{linkcolor=$if(toccolor)$$toccolor$$else$$endif$}
$endif$
\setcounter{tocdepth}{$toc-depth$}
\tableofcontents
}
$endif$
$endif$
$if(lot)$
\listoftables
$endif$
$if(lof)$
\listoffigures
$endif$
$body$

$if(natbib)$
$if(bibliography)$
$if(biblio-title)$
$if(book-class)$
\renewcommand\bibname{$biblio-title$}
$else$
\renewcommand\refname{$biblio-title$}
$endif$
$endif$
$if(beamer)$
\begin{frame}[allowframebreaks]{$biblio-title$}
\bibliographytrue
$endif$
\bibliography{$for(bibliography)$$bibliography$$sep$,$endfor$}
$if(beamer)$
\end{frame}
$endif$

$endif$
$endif$
$if(biblatex)$
$if(beamer)$
\begin{frame}[allowframebreaks]{$biblio-title$}
\bibliographytrue
\printbibliography[heading=none]
\end{frame}
$else$
\printbibliography$if(biblio-title)$[title=$biblio-title$]$endif$
$endif$

$endif$
$for(include-after)$
$include-after$

$endfor$
\end{document}

これでもかなり削ったほうなんです!

そのうち一行一行の意味を把握できればいいなと思っています…

ただ,問題点があります.

color関連を中途半端に消してしまった

多分color関連の設定項目,プリアンブルに相当する部分は消したけどコード内の変換については何もいじっていない.

起こり得る問題としては,ハイライト付きのコードがある状態でtex形式に変換する際,色のタグだけコードに入るが宣言がされていないのでnot detected的なエラーが出そうってこと.

改善の余地がありますね.

md側でのテクニック

プリアンブルの記述が楽にできるよ.

md文書のはじめに,---で囲ったブロックを作成して…

その中に,以下のように記述すると,コンパイル時に自動的にタイトルとか挿入してくれます.

---
title: タイトル
author: 名前
date: 日付
---

便利やん.

でも,この機能はdefault.latexの設定を変えると消えちゃう可能性があるので気をつけましょう.

header-includesとかそのあたりは消さずに残しておきましょう.

なお,こういう記述法をYAMLと言うんだとか.

YAMLについても詳しく調べたらまた紹介しますね!

では,今回はこのへんで失礼します!

参考にさせていただいたサイト

https://qiita.com/mosamosa/items/da33422f2bfc37bc5904 (2019年6月11日閲覧)

コメント

タイトルとURLをコピーしました