org-latex
Org-mode
で作成した文書を LaTeX 文書に変換する方法です。
ワークフロー
Orgファイルの編集(
emacs kumaroot.org
)LaTeXエクスポート(
C-c C-e l l
)LaTeXファイルのバッファを開く(
C-x b kumaroot.tex
)YaTeXコマンドでコンパイル(
C-c C-t j
)YaTeXコマンドでプレビュー(
C-c C-t p
)
必要なパッケージ(ox-latex
)
LaTeX文書へのエクスポートはox-latex.el
が担っています。
2014年にorg-latex
からox-latex
にパッケージ名が変更になりました。
package.el
でインストールした場合はautoload
されるはずなので、
(require 'ox-latex)
はとくに要らないはずです。
ドキュメントクラスの設定(org-latex-default-class
)
LaTeXのエクスポートに使うドキュメントクラスを指定します。
デフォルトはarticle
になっているので、日本語を使う場合はjsarticle
にする必要があります。
ただし、まずは org-latex-classes
(後述)に追加する必要がある。
Orgファイル中の #+LATEX_CLASS:
(大文字/小文字の区別なし)で指定できる
(ない場合はデフォルト値が使われる)。
Original value was
(("article" ;; <-- the name of the class
;; HEADER-STRING : documentclass (+ default-packages)
"\\documentclass[11pt]{article}"
;; SECTIONING : matching for Org headings and LaTeX sectioning
("\\section{%s}" . "\\section*{%s}")
("\\subsection{%s}" . "\\subsection*{%s}")
("\\subsubsection{%s}" . "\\subsubsection*{%s}")
("\\paragraph{%s}" . "\\paragraph*{%s}")
("\\subparagraph{%s}" . "\\subparagraph*{%s}"))
("report"
"\\documentclass[11pt]{report}"
("\\part{%s}" . "\\part*{%s}")
("\\chapter{%s}" . "\\chapter*{%s}")
("\\section{%s}" . "\\section*{%s}")
("\\subsection{%s}" . "\\subsection*{%s}")
("\\subsubsection{%s}" . "\\subsubsection*{%s}"))
("book"
"\\documentclass[11pt]{book}"
("\\part{%s}" . "\\part*{%s}")
("\\chapter{%s}" . "\\chapter*{%s}")
("\\section{%s}" . "\\section*{%s}")
("\\subsection{%s}" . "\\subsection*{%s}")
("\\subsubsection{%s}" . "\\subsubsection*{%s}")))
ドキュメントクラスの追加(org-latex-classes
)
alist
になっているのでadd-to-list
を使って自分で設定を追加できます。
jsarticle
などの日本語ドキュメントクラスは各自で追加しておきましょう。
(add-to-list 'org-latex-classes
'("jsarticle"
"\\documentclass[dvipdfmx,12pt]{jsarticle}"
("\\section{%s}" . "\\section*{%s}")
("\\subsection{%s}" . "\\subsection*{%s}")
("\\subsubsection{%s}" . "\\subsubsection*{%s}")
("\\paragraph{%s}" . "\\paragraph*{%s}")
("\\subparagraph{%s}" . "\\subparagraph*{%s}")
)
)
(add-to-list 'org-latex-classes
'("jsreport"
"\\documentclass[dvipdfmx,12pt,report]{jsbook}"
("\\chapter{%s}" . "\\chapter*{%s}")
("\\section{%s}" . "\\section*{%s}")
("\\subsection{%s}" . "\\subsection*{%s}")
("\\subsubsection{%s}" . "\\subsubsection*{%s}")
("\\paragraph{%s}" . "\\paragraph*{%s}")
)
)
(add-to-list 'org-latex-classes
'("jsbook"
"\\documentclass[dvipdfmx,12pt]{jsbook}"
("\\part{%s}" . "\\part*{%s}")
("\\chapter{%s}" . "\\chapter*{%s}")
("\\section{%s}" . "\\section*{%s}")
("\\subsection{%s}" . "\\subsection*{%s}")
("\\subsubsection{%s}" . "\\subsubsection*{%s}")
)
)
(add-to-list 'org-latex-classes
'("bxjsarticle"
"\\documentclass[pdflatex,jadriver=standard,12pt]{bxjsarticle}"
("\\section{%s}" . "\\section*{%s}")
("\\subsection{%s}" . "\\subsection*{%s}")
("\\subsubsection{%s}" . "\\subsubsection*{%s}")
("\\paragraph{%s}" . "\\paragraph*{%s}")
("\\subparagraph{%s}" . "\\subparagraph*{%s}")
)
)
(add-to-list 'org-latex-classes
'("beamer"
"\\documentclass[dvipdfmx,12pt]{beamer}"
("\\section{%s}" . "\\section*{%s}")
("\\subsection{%s}" . "\\subsection*{%s}")
("\\subsubsection{%s}" . "\\subsubsection*{%s}")
("\\paragraph{%s}" . "\\paragraph*{%s}")
("\\subparagraph{%s}" . "\\subparagraph*{%s}")
)
)
パッケージの追加(org-latex-packages-alist
)
LaTeXエクスポートした時に、ヘッダーに挿入されるパッケージ群です。
org-latex-default-packages-alist
の後に追記されます。
これもalist
になっているのでadd-to-list
を使って自分で設定を追加できます。
hyperref
パッページを使ったときのしおりの文字化け対策として
pxjahyper
パッケージを追加したり、hyperref
の設定(hypersetup
)を追加するとよいです。
add-to-list
第2引数にパッケージ名 or コマンド名を指定します。
hypersetup
などのコマンド名の先頭につけるバックスラッシュはエスケープが必要です。
第3引数をt
にすることで、書いた順番でプリアンブルに出力されます。
使うパッケージは、すべてのファイルに共通なパッケージにします。
その際、すでに設定されている org-format-latex-header
や
org-latex-default-packages-alist
のパッケージとコンフリクトしないように注意する必要があります。
hyperref
パッケージはすでにインクルードされてるので hypersetup
で設定を変更する必要があります。
また、Orgファイル内の#+LATEX_HEADER:
でファイルに個別の設定ができます。
;; usepackage型
(add-to-list 'org-latex-packages-alist '("オプション" "パッケージ名") t)
;; maketitle型
(add-to-list 'org-latex-packages-alist "\\コマンド名{オプション}" t)
サンプルコード
;; しおりの文字化け対策
(add-to-list 'org-latex-packages-alist '("" "pxjahyper") t)
;; (add-to-list 'org-latex-packages-alist '("" "atbegshi") t)
;; (add-to-list 'org-latex-packages-alist "\\AtBeginShipoutFirst{\\special{pdf:tounicode EUC-UCS2}}" t)
;; hyperrefの設定
(add-to-list 'org-latex-packages-alist "\\hypersetup{setpagesize=false}" t)
(add-to-list 'org-latex-packages-alist "\\hypersetup{colorlinks=true}" t)
(add-to-list 'org-latex-packages-alist "\\hypersetup{linkcolor=blue}" t)
;; その他のパッケージの追加
(add-to-list 'org-latex-packages-alist '("" "listings") t)
(add-to-list 'org-latex-packages-alist '("" "color") t)
(add-to-list 'org-latex-packages-alist '("" "fancyvrb") t)
;; 文字ハイライトに minted を使う(pdflatexじゃないと動かない)
;;(add-to-list 'org-latex-packages-alist '("" "minted"))
(setq org-latex-listings t)
デフォルトで使われるパッケージ( org-latex-default-packages-alist
)
デフォルトのパッケージは Org-mode
を動かすために必要な最低限のパッケージなので基本的には変更しないほうがよいです。
ただし、あるパッケージを使いたいときに、ここにあるパッケージとコンフリクトするようなら修正が必要です。
リストにあるパッケージ一覧
inputenc
for basic font and character selection
fixltx2e
Important patches of LaTeX itself
graphicx
for including images
longtable
For multipage tables
float
for figure placement
rotating
for sideways figures and tables
ulem
for underline and strike-through
amsmath
for subscript and superscript and math environments
textcomp
for various symbols used for interpreting the entities in
org-entities
. You can skip some of these packages if you don’t use any of their symbols.hyperref
for cross-references
デフォルト設定
Emacs24.1
で多少変更されたみたいです。
Value:
(("AUTO" "inputenc" t)
("T1" "fontenc" t)
("" "fixltx2e" nil)
("" "graphicx" t)
("" "longtable" nil)
("" "float" nil)
("" "wrapfig" nil)
("" "rotating" nil)
("normalem" "ulem" t)
("" "amsmath" t)
("" "textcomp" t)
("" "marvosym" t)
("" "wasysym" t)
("" "amssymb" t)
("" "hyperref" nil)
"\\tolerance=1000")
上文字、下文字の自動変換をオフにする
(setq org-use-sub-superscripts nil)
(setq org-export-with-sub-superscripts nil)
Orgファイル中の^(ハット)
や_(アンダースコア)
以降の英数字は自動的に上文字、下文字に変換されてしまいます。
便利なのかもしれませんが、意図しない箇所も変換されてしまうのはやっぱり不便なのでオフにします。
エクスポートするときも同じ理由でオフにしておきます。
上付き・下付きにしたい場合は、
文字^{上付き}
、 文字_{下付き}
のように 中括弧 {}
で囲みます。
Orgファイル中で C-c C-x \
すればプレビューできます。
hyperref の設定
\usepackage{hyperref}
\hypersetup{
setpagesize=false, %% <-- This line is very important
pdfkeywords={},
pdfsubject={},
pdfcreator={Emacs 24.4.1 (Org mode 8.2.10)}}
hyperref
パッケージと jsarticle
は仲が良くないので、そのままコンパイルするとページの幅がおかしくなります。
\hypersetup
でsetpagesize=false
を設定することで解決できます。
しかし、デフォルトの hyperref
オプションはox-latex.el
にハードコーディングされていて追加/変更できないので
org-latex-packages-alist
や#+latex_headers:
/ #+latex_header_extra:
などを複数回使って、
1つずつ呼び出すことにします。
\\usepackage{hyperref}
\\hypersetup{pdfkeywords={},
pdfsubject={},
pdfcreator={Emacs 24.4.1 (Org mode8.2.10)}}
\\hypersetup{ setpagesize=false }
とりあえずテストしたい場合は、
編集しているOrgファイルの先頭に#+latex_header:
もしくは#+latex_header_extra:
を
使って定義するとよいです。
latex_header
とlatex_header_extra
の違いを調べるために、以下の順番でhypersetup
を定義してみました。
#+latex_header: \hyperref{setpagesize=false}
#+latex_header_extra: \hyperref{colorlinks=true}
#+latex_header: \hyperref{linkcolor=blue}
これでlatex_header
> latex_header_extra
の順に追加されることがわかりました。
\usepackage{hyperref}
\hypersetup{setpagesize=false} %% latex_header:
\hypersetup{linkcolor=blue} %% latex_header:
\hypersetup{colorlinks=true} %% latex_header_extra:
\tolerance=1000
\author{Shota}
\date{\today}
\title{\LaTeX{} Export Test}
\hypersetup{pdfkeywords={},
pdfsubject={},
pdfcreator={Emacs 24.4.1 (Org mode 8.2.10)}}
出力場所は、デフォルト出力の hypersetup
の上になるが、コンパイルには影響しないのでこれで良しとします。
その他
org-export-latex-coding-system
No document
org-export-latex-date-format
No document
org-file-apps
ファイルを開く外部プログラムを設定できる。 何も設定しないとシステムデフォルトのプログラムを使うようになっている。
ox-latex
というより、=org= の機能。 PDFをPreview.app
で開くように設定する(もしかして不要なのかな?)。 デフォルトの設定を見ながら検討する。org-latex-pdf-process
OrgのLaTeXエクスポート(
C-c C-e l p
)でPDFを作るための設定。 内部ではpdflatexが走ることになる。詳細は後述。
org-latex-classesの詳細
- 第1引数
LaTeXファイルの挿入される文字列。
documentclass
やusepackage
を書くことができる。org-latex-default-packages-alist
やorg-latex-packages-alist
に入っているパッケージを 呼び出すことができる。 Orgファイル内の#+LATEX_HEADER:
、#+LATEX_HEADER_EXTRA:
キーワードの行で指定することもできる。- 第2引数
説明するよりソースを読んだ方が早い。 以下に
org-latex-classes
デフォルト値を掲載。
HEADER-STRINGの制御
DEFAULT-PACKAGES
/NO-DEFAULT-PACKAGES
(=org-latex-default-packages-alist
)PACKAGES
/NO-PACKAGES
(=org-latex-packages-alist
)EXTRA
/NO-EXTRA
その他の関連する変数
buffer-file-coding-system
org-latex-inputenc-alist
org-export-default-language
org-latex-pdf-processの詳細
Its value is
("pdflatex -interaction nonstopmode -output-directory %o %f"
"pdflatex -interaction nonstopmode -output-directory %o %f"
"pdflatex -interaction nonstopmode -output-directory %o %f")
Orgファイルから直接PDFを生成することもできる
( C-c C-e l p
/ C-c C-e l o
)。
これはそのための設定。デフォルトの設定だと、pdflatex を使っている。
3回も回しているとは知らなんだ。
リストになっているのは、途中で bibtex
を入れたりできるように。
Org自身に適当なコンパイル方法を検知する仕組みが無いので、
ユーザが好きにいじれるようにしてるみたい。
日本語だと pdflatex
がうまく動かないので、一度LaTeXファイルにエクスポートして、
pTeXを使ってコンパイルしていたが、これをきちんと設定すれば、楽になるのかも。
org-latex-packages-alistの詳細
A cell is of the format: ("options" "package" SNIPPET-FLAG)
- 第1引数
パッケージのオプション
- 第2引数
パッケージ名
- 第3引数
よくわからん
org-format-latex-headerの詳細
あとでちゃんと読もうかな。
Documentation
The document header used for processing LaTeX fragments. It is imperative that this header make sure that no page number appears on the page. The package defined in the variables `org-latex-default-packages-alist’ and `org-latex-packages-alist’ will either replace the placeholder “[PACKAGES]” in this header, or they will be appended.Documentation: The document header used for processing LaTeX fragments. It is imperative that this header make sure that no page number appears on the page. The package defined in the variables `org-latex-default-packages-alist’ and `org-latex-packages-alist’ will either replace the placeholder “[PACKAGES]” in this header, or they will be appended.
デフォルト値
"\\\\documentclass{article}\\n
\\\\usepackage[usenames]{color}\\n [PACKAGES]\\n [DEFAULT-PACKAGES]\\n
\\\\pagestyle{empty} % do not remove\\n
% The settings below are copied from fullpage.sty\\n
\\\\setlength{\\\\textwidth}{\\\\paperwidth}\\n
\\\\addtolength{\\\\textwidth}{-3cm}\\n
\\\\setlength{\\\\oddsidemargin}{1.5cm}\\n
\\\\addtolength{\\\\oddsidemargin}{-2.54cm}\\n
\\\\setlength{\\\\evensidemargin}{\\\\oddsidemargin}\\n
\\\\setlength{\\\\textheight}{\\\\paperheight}\\n
\\\\addtolength{\\\\textheight}{-\\\\headheight}\\n
\\\\addtolength{\\\\textheight}{-\\\\headsep}\\n
\\\\addtolength{\\\\textheight}{-\\\\footskip}\\n
\\\\addtolength{\\\\textheight}{-3cm}\\n
\\\\setlength{\\\\topmargin}{1.5cm}\\n
\\\\addtolength{\\\\topmargin}{-2.54cm}"
LaTeXエクスポートの再設定
基本設定の項目が分かったので、もう一度設定を見直してみます。
デフォルトの設定を確認する
org-latexの設定をすべてコメントアウトして、エクスポートしてみたときLaTeXファイルのヘッダーは 次のようになっていました。
\\documentclass[11pt]{article}
\\usepackage[utf8]{inputenc}
\\usepackage[T1]{fontenc}
\\usepackage{fixltx2e}
\\usepackage{graphicx}
\\usepackage{longtable}
\\usepackage{float}
\\usepackage{wrapfig}
\\usepackage{rotating}
\\usepackage[normalem]{ulem}
\\usepackage{amsmath}
\\usepackage{textcomp}
\\usepackage{marvosym}
\\usepackage{wasysym}
\\usepackage{amssymb}
\\usepackage{hyperref}
\\tolerance=1000
\\author{Shota}
\\date{\\today}
\\title{\\LaTeX{} Export Test}
\\hypersetup{pdfkeywords={},
pdfsubject={},
pdfcreator={Emacs 24.4.1 (Org mode 8.2.10)}}
\\begin{document}
\\maketitle
\\tableofcontents
このままYaTeX環境でコンパイル(=pTeX
)できますが、
たくさんのdvipdfmx:warning:(error messages)
という警告が表示されます。
LaTeXファイルを開き、ドキュメントクラスのオプションでドライバーにdvipdfmx
を指定することで解決できます。
\\documentclass[11pt, dvipdfmx]{article}
直接出力(=pdflatex
)も試してみましたが、
org-latex-compile: PDF file ./testing.pdf wasn't produced: [package error]
というログがMessagesバッファに残っていてうまくいってないようです。
org-latex-pdf-process を pTeXに変更する
(use-package ox-latex
:config
(setq org-latex-pdf-process
("ptex2pdf -l -ot -synctex=1 -file-line-error"
"ptex2pdf -l -ot -synctex=1 -file-line-error"
"ptex2pdf -l -ot -synctex=1 -file-line-error")
)
Warning: \`"ptex2pdf -l -ot -synctex=1 -file-line-error"' is a malformed function
という警告が表示され、そもそもの設定がうまくできない。
setq
ではできないのか?後で調べる。
ドキュメントクラスにjsarticleを追加する
\\documentclass[12pt, dvipdfmx]{jsarticle}
文字サイズは少し大きく(= 12pt
)して、ドライバには dvipdfmx
を指定する。
sectioning については、article のデフォルトを使う。
(add-to-list 'org-latex-classes
'("jsarticle"
"\\\\documentclass[dvipdfmx,12pt]{jsarticle}"
("\\\\section{%s}" . "\\\\section\*{%s}")
("\\\\subsection{%s}" . "\\\\subsection\*{%s}")
("\\\\subsubsection{%s}" . "\\\\subsubsection\*{%s}")
("\\\\paragraph{%s}" . "\\\\paragraph\*{%s}")
("\\\\subparagraph{%s}" . "\\\\subparagraph\*{%s}") ))
ドキュメントクラスにjsbookを追加する
\\documentclass[12pt, dvipdfmx]{jsbook}
文字サイズは少し大きく(=12pt)して、ドライバには dvipdfmx を指定する。 sectioning については、book のデフォルトを使う。
(add-to-list 'org-latex-classes
'("jsbook"
"\\\\documentclass[dvipdfmx,12pt]{jsbook}"
("\\\\part{%s}" . "\\\\part\*{%s}")
("\\\\chapter{%s}" . "\\\\chapter\*{%s}")
("\\\\section{%s}" . "\\\\section\*{%s}") ("\\\\subsection{%s}" .
"\\\\subsection\*{%s}") ("\\\\subsubsection{%s}" .
"\\\\subsubsection\*{%s}") ) )
ドキュメントクラスにjsreportを追加する
\\documentclass[12pt, dvipdfmx, report]{jsbook}
文字サイズは少し大きく(=12pt)して、ドライバには dvipdfmx を指定する。 「jsreport」というクラスファイルはないが、jsbook に report オプションをつければいいらしい。 sectioning については、article のデフォルトを部分に chapter を付け加えた。
(add-to-list 'org-latex-classes
'("jsreport"
"\\\\documentclass[dvipdfmx,12pt,report]{jsbook}"
("\\\\chapter{%s}" . "\\\\chapter\*{%s}")
("\\\\section{%s}" . "\\\\section\*{%s}")
("\\\\subsection{%s}" . "\\\\subsection\*{%s}")
("\\\\subsubsection{%s}" . "\\\\subsubsection\*{%s}")
("\\\\paragraph{%s}" . "\\\\paragraph\*{%s}") ) )
デフォルトのドキュメントクラスを jsarticle に変更する
すべてのOrgファイルに
#+latex_class: jsarticle
を付けるのはめんどくさいので デフォルトに設定する。
(setq org-latex-default-class "jsarticle")
listingsを使ってコードブロックの装飾する
(setq org-latex-listings t)
(add-to-list 'org-latex-packages-alist '("" "listings"))
(add-to-list 'org-latex-packages-alist '("" "color"))
(add-to-list 'org-latex-packages-alist '("" "fancyvrb"))
listlingsパッケージの初期設定はlstsetを使う。hypersetupのときと同じ ように、Orgファイルの先頭に書いておく。
#+latex_header: \lstset{language=[LaTeX]TeX}
#+latex_header: \lstset{basicstyle=\small}
#+latex_header: \lstset{stringstyle=\ttfamily}
#+latex_header: \lstset{commentstyle=\ttfamily}
#+latex_header: \lstset{showstringspaces=false}
#+latex_header: \lstset{frame=shadowbox}
#+latex_header: \lstset{rulesepcolor=\color{black}}
#+latex_header: \lstset{fancyvrb=true}
簡単なテスト方法
LaTeXエクスポートの設定のテスト [1]_のために、必要なemacs設定ファイルを編集してー、ロー ドしてー、確認してー、とやっていると結構疲れます。
Org文書中に記述できるソースコードのブロックは、なんと内容を実行する 機能がついています。なので、テストの際はそれを使うと格段に捗ります。あるので、それを使うと
#+begin\ :sub:`src` emacs-lisp /#+BEGIN:sub:`SRC` emacs-lisp :exports
results :results silent (setq org-latex-listings t) (add-to-list
'org-latex-packages-alist '("" "listings")) (add-to-list
'org-latex-packages-alist '("" "color")) /#+END:sub:`SRC`
#+end\ :sub:`src`
上のコードをOrg文書の最初の方に書いておきます。エクスポートしたLaTeX 文書のヘッダには、「listings」「color」パッケージが追加されています。
#+begin\ :sub:`src` latex \\usepackage{hyperref} \\tolerance=1000
\\usepackage{color} %% <-- Added here \\usepackage{listings} %% <--
Added here \\hypersetup{setpagesize=false} \\hypersetup{linkcolor=blue}
\\hypersetup{colorlinks=true} \\author{Shota}
#+end\ :sub:`src`
思った通りの動きが確認できたのち、emacs設定ファイルに移動させればOKです。
PDFLaTeXの設定
ソースコードのハイライトに minted.sty を使うためにはpdflatexを使わな ければいけません。そのための設定をここにメモします。
日本語 + PDFLaTeX
BXjsclsというクラスファイルを使います。
PDFLaTeX + minted.sty
minted.sty は外部プログラムのPygmentsを呼ぶため、コンパイル時 に-shell-escape オプションを付ける必要があります。
#+begin\ :sub:`src` sh $ pdflatex -shell-escape sample.tex
#+end\ :sub:`src`
Org-LaTeXエクスポート + minted.sty
さて、ようやく本来の目的にたどり着きました。少し使ってみたところ、 minted環境の中では日本語が使えないみたいなので、それを修正してから いろいろ試した方が良さそうです。