書式の自由が社会を変える―LibreOfficeとPandocができること

藤原 由来

2017年4月29日

自己紹介

  • 名前
  • 職業
    • フリープログラマ
    • 専門学校 非常勤講師

Pandocに関する活動

Pandoc公式サイト

Pandocと私

  • 院生時代の依頼
    • 従来よりLaTeXで書かれた「教育用システムの利用手引」を、EPUBにできるかどうか検証してくれないか?
    • このとき調べ回って、「Pandocというものがあるらしい」と気づいた
  • 「LaTeXからEPUBに変換する」タスクが想像以上にあっさり実現
    • 多少は難はあったが(input命令に当時は対応してない(今は対応)とか、組版がいけてないとか)
    • この感動が、今の活動の原点
  • なんでこんなにすごいソフトウェアが、日本では知られていなかったんだろう?
    • 「Pandocを広めよう」と決意した瞬間

この発表の概要

  • Pandocの概要
  • Pandocをインストールする
  • Pandocでドキュメントを変換する
    • LibreOffice Writer文書を中心に
  • 「書式の自由」について

Pandocの概要

こんなことに困っていませんか?

  • Writerが重いのでテキストファイルで下書きしたい
  • バージョン管理をしたいけど、Writer文書はgit diffが取りにくい
  • Writer文書をHTMLに変換せよとお達しがあった
  • Writer文書をSphinx(reST)で使いたい
  • Markdownなどでスライドショーを作りたい

Pandocの魅力

Pandocとは

  • Pandoc - About pandoc
  • 文書変換ツール
    • あるフォーマットで書かれた文書を、別のフォーマットに変換するツール
  • Pandocの特徴は、対応フォーマットが非常に多いこと

対応フォーマット(一部省略)

  • 入力
    • Markdown (Pandoc, CommonMark, PHP Markdown Extra, GitHub-Flavored Markdown, MultiMarkdown)
    • (subsets of) Textile, reStructuredText, HTML, LaTeX, MediaWiki markup, Emacs Org mode
    • OPML, DocBook, EPUB, ODT and Word docx
  • 出力
    • 入力フォーマットのほとんど(ODT含む)
    • Markdown
    • manページ, AsciiDoc, InDesign ICML
    • プレゼンテーション: LaTeX Beamer, HTML5(reveal.jsなど)
    • PDF (wkhtmltopdfまたはLaTeXエンジンが必要)

そもそもMarkdownって何?

  • このスライド自体が、実はMarkdownで書かれています
  • 元々はJohn Gruberが作ったオリジナルの処理系 でHTMLに変換するための略記法だった
  • そのうちGitHubやPHPなどで記法が拡張された
    • MultiMarkdownやPandocの登場をきっかけに、目的も「論文」「プレゼンテーション」「電子書籍」など用途が広がった
    • 数々の「方言」がある状態
  • 基本のMarkdownだけを覚えれば、大抵は書けます
    • プレビューを行うのが鉄則

Pandocでできないこと

  • 表主体の文書を扱うこと
    • Excel, LibreOffice Calc
    • 一部に簡単な表を埋め込むことはできる(HTMLの<table>相当)
  • LibreOffice Impressに/を変換すること
    • LaTeX Beamer/HTMLプレゼンには変換可能

Pandocを使う心得

  • 過剰な期待をし過ぎないこと
    • Pandocは万能でないし、文書仕様の全てを満たしているわけではない
  • 補助的に使うのがベスト
    • Pandocで、テキストと大まかな構造を抽出
    • 変換し切れなかった部分を、手作業や自作スクリプトで編集

Pandocの実装

  • 言語: Haskell
    • Pandoc的には、「厳密に型が定義されている」ことがありがたい
    • Haskellは構文解析器(パーサ)を作るのにすごく適している (Parsecなど)
  • モジュール構成
    • Reader: 入力文書を解析し、Haskell上の中間文書に変換する
    • Writer: 中間文書を受け取り、出力フォーマットに変換する
Pandocの処理フロー
Pandocの処理フロー

Pandocが扱えるMarkdown方言

  • Pandoc’s Markdown: -f markdown
    • Pandocにおける標準のMarkdown方言
    • 技術文書から論文・電子書籍まで幅広く対応
  • GitHub Flavored Markdown (gfm): -f markdown_github
    • GitHubの標準、プログラマ・フレンドリーな方言
  • PHP Markdown Extra: -f markdown_phpextra
    • 最近はMarkdown Extraとも呼ばれる
  • MultiMarkdown: -f markdown_mmd
    • HTMLだけでなくLaTeXなどの論文も意図した処理系
  • CommonMark: -f commonmark
    • 仕様の曖昧さをなくすことを目的とした仕様/処理系
    • ここ最近は、事実上の標準に近づく(公式な標準ではない)

補足: Markdownと標準仕様

Pandocをインストールする

ターミナルを開く

  • Mac: ターミナル.app or iTerm2
  • Windows: (今回は)コマンドプロンプト
    • (分かっている方は)お好きなターミナルでも結構です
  • Linux: お好きなターミナル

Pandocのインストール: パッケージマネージャ編

Pandocのインストール: インストーラ編

wkhtmltopdfのインストール

  • PDF出力のために必要
    • TeXLive/MacTeXを入れていれば、LaTeX処理系も利用可能(説明略)
    • ただし、pLaTeXはNGなので、LuaLaTeX/XeLaTeXのみ
  • パッケージマネージャでインストール
    • Mac: $ brew cask install wkhtmltopdf
      • Caskの方なので注意
    • Windows: > cinst -y wkhtmltopdf
    • Debian: $ sudo apt-get install wkhtmltopdf
  • パッケージを直接落としてインストール
    1. wkhtmltopdf - Downloadsからダウンロード
    2. インストール

動作確認: Pandoc単体

Bashにて確認(コマンドプロンプトも同様のはず)

$ pandoc --version
$ pandoc --list-input-formats
$ pandoc --list-output-formats
$ echo "**Hello**" | pandoc -f markdown -t html
<p><strong>Hello</strong></p>

動作確認: Pandoc + wkhtmltopdf (PDF)

$ echo "**Hello**" | pandoc -f markdown -t html5 -o hello.pdf
  • -f: 入力フォーマット名
  • -t: 出力フォーマット名
  • -o: 出力ファイル名
  • 入力ファイル名が指定されていない場合は、標準入力を使用

おまけ: Pandocで作れるスライド

  • このスライド自体をPandocで生成しました
  • 今回は「reveal.js」形式に変換
    • HTML+JavaScriptによるプレゼンテーション
    • クライアントサイドで完結→GitHub Pagesにアップロード可能
  • 補足: Pandocでは他のプレゼン形式にも変換できる
    • LaTeX Beamer
    • reveal.js以外のHTMLプレゼン(割愛)

実際のソースコード

Pandocでドキュメントを変換する

LibreOffice Writer文書を中心に

これからやること

  • Markdown文書からWriter文書に変換する
    • とりあえず変換してみる
    • 綺麗なWriter文書を生成する: テンプレート機能
  • Writer文書をMarkdownに変換する
  • 以下の作業では、GitHubリポジトリのsampleディレクトリにあるファイルを使います
    • 興味のある人はgit cloneして試してみてください

とりあえず変換してみる: pandocコマンド

$ pandoc connpass.md -o connpass.odt
  • -o: 出力ファイル名
    • 多くの場合拡張子で判断できる

ファイルを開く

$ open connpass.odt    # Mac/Linux
> start connpass.odt   # Windows

綺麗なWriter文書を生成する

  • Pandocのテンプレート機能を使う
      1. Pandocコマンドからテンプレートを生成
      1. テンプレートをWriterで編集する
      1. Pandocの変換時にテンプレートをオプションで指定する
      • もしくはユーザデータディレクトリに入れる

(1) Pandocコマンドからテンプレートを生成

$ pandoc --print-default-data-file reference.odt > reference.odt
  • コマンドオプションで指定する場合は「reference.odt」という名前でなくてよい
  • ユーザデータディレクトリ(後述)に入れる場合は必ず「reference.odt」という名前にする

(2) テンプレートをWriterで編集する

  • reference.odtを開く
  • 内容はPandocから参照されない
    • デフォルトで「Hello World!」と表示されている
    • 例えば表示用サンプルを置いてもいい
  • 「スタイルと書式設定」から書式を変更

(3) Pandocの変換時にテンプレートをオプションで指定する

$ pandoc connpass.md --reference-doc=reference.odt -o connpass2.odt
  • --reference-doc: Writer(やWordなど)のテンプレートを指定 (v2.0)
    • 注意: 以前は --reference-odt というオプションだった

補足:テンプレートをユーザデータディレクトリに入れる

  • ユーザデータディレクトリの場所: pandoc -v で出る
    • Windows: C:\Users\ユーザ名\AppData\Roaming\pandoc
    • Mac: $HOME/.pandoc
  • このディレクトリに「reference.odt」という名前でテンプレートを入れると、次回からデフォルトで使ってくれる

PandocとWriterの具体的なノウハウ (nogajunさん)

$ pandoc connpass.md --reference-doc=pandoc-writer.odt -o connpass-pandoc-writer.odt

画像に関するノウハウ (いくやさん)

Writer文書からMarkdown/reST/LaTeX文書に変換してみる

  • nogajunさんのpandoc-writer.odtを変換してみる
  • Markdown (Pandoc’s)
    • $ pandoc pandoc-writer.odt -o pandoc-writer.md
  • reStructuredText (Sphinxなどで使用)
    • $ pandoc pandoc-writer.odt -o pandoc-writer.rst
  • LaTeX

Q&A

(特にPandocコマンドについて)

「書式の自由」について

Pandocも自由を愛する者の味方です

LibreOffice は、ちょうどあなたのように、フリーソフトウェアの原理を信じ、そしてその成果を制限のない形で世界中で共有することを信じるユーザーによって開発されています。

  • PandocのソースコードはGPL

Pandocの思想的インパクト=「書式の自由」

  • 「あらゆる書式は変換できる」というメッセージ
    • 現状、Excelなどは処理できないが・・・
  • 真に「書式の自由」がもたらされたとき、何が起こるか?
    • これから理想論を話します

「書式の自由」がもたらされたとき

  • 各々が好きな書式やソフトで文書を作成できる
  • それを、目的の書式に変換する
    • 確定申告
    • 事務手続き
    • etc.
  • 適切な形式で入力・データベース化・出力できる
    • MS Officeで入力してもいい(もちろんLibreOfficeが嬉しいけど)
    • オープンデータの推進

「書式の自由」が与える真のインパクト

  • 例:「Excel方眼紙(ネ申Excel)」の縛りから人々が解放されたら?
  • 「書式の縛り」が生んできた仕事がなくなる→雇用がなくなる
    • いわゆるシンギュラリティの一種?
    • 例:社内の「Excel職人」がお役御免となる
    • その人たちはどうなるのか?

課題:自由の前提として「肯定」と「居場所」が必要になる

  • 「仕事=プライド」の人は、少なくないらしい
    • そのような人にとって、自由=「何をしてもいい」という状況は虚しく息苦しい
    • 「自由からの逃走」(エーリッヒ・フロム)は起こりうる
  • 「仕事=プライド」の人を単に非難してはいけない
    • ただ、受け入れること
    • 気軽に寄れる「居場所」をつくること

最後に

Pandocの今後の課題

  • 日本語に特化した文書フォーマットにほとんど対応していない
    • 書籍におけるルビや圏点など
    • 日本語コミュニティの必要性
  • 表形式の文書は対応していない
    • Excel文書など→Excel方眼紙への対策には致命的
    • サードパーティのプリプロセッサにより部分的に変換する手段はある
      • 一部の図表(Graphvizなど)はこの方法で取り込むことができる

日本Pandocユーザ会

ドキュメンテーションWiki

Q&A