はじめに

Asciidoc は簡単な書式で記述したテキストファイルを HTML など さまざまなフォーマットに整形することができるツールです。

Asciidoc はテキストを単に整形するだけでなく、 外部ファイルやシェルの実行結果を読み込んだり、 CSVの内容を取り込んで表にすることができるなど 多彩な機能を持っていてます。

この資料はAsciidocの使い方について説明したものです。

Asciidoc について

Asciidoc はニュージーランドのStuart Rackham氏により、 2002年から開発が始まったPython で動作する文書整形ツールです。[1] 10年以上の間いろいろな機能拡張されてきました。

私も2008年に Graphviz に対応するためのパッチを提供していて、 2009年の asciidoc-8.3.2 からマージされています。

Asciidoc が非常に便利なところは、 バックエンドの整形ツールを選ぶことで、 同じテキストを HTML, PDF, EPUB など多彩なフォーマットに変換できることです。

Kindle などの電子書籍が広く普及するようになったことで、 Asciidoc の存在が大きくなっていきました。 [7],[8]

インストール

ソースコードやコンパイル済みのバイナリを それぞれのディストリビューション向けにパッケージしたものは、 次のURLから参照することができます。

RedHat Enterprise Linux 6 (RHEL6) や CentoS 6 の場合であれば、 次のようにインストールすることができます。

# BASEURL=http://pkgs.repoforge.org/asciidoc
# rpm -ivh ${BASEURL}/asciidoc-8.6.9-1.el6.rfx.noarch.rpm

Mac の場合でもコンパイル済みのバイナリが MacPorts [2]から配布されていますので、 次のようにインストールすることができます。

$ sudo port install asciidoc

Windows の場合は、Cygwin という Linux エミュレータを インストールすることで利用できるようになります。[3] 意外に知られていませんが、 Red Hat も Cygwin をリリースしていて無料で使うことができます。[4]

Asciidoc のインストールは Cygwin のセットアップツールから選ぶことで インストールすることがでいます。[5]

また、Cygwin に apt-cyg [6] をインストール設定済みであれば、 次のようにコマンドラインでインストールすることができます。

# apt-cyg install asciidoc

Asciidoc の使い方

詳細な使用方法は Asciidoc ユーザガイドを参照することになりますが、 簡単な使い方はチートシート(Cheatsheet)が公開されています。[9]

この中から一般的なテクニカルノートを記述するときに、 必要な機能について整理し説明することにします。

左側がAsciidocでの記述、 右側が整形したものを表示しています。

ヘッダ

日本語の扱い場合が多いため次のように記述するのが簡単です。

== レベル 1
Text.

=== レベル 2
Text.

==== レベル 3
Text.

===== レベル 4
Text.

レベル 1

Text.

レベル 2

Text.

レベル 3

Text.

レベル 4

Text.

パラグラフ

.タイトル(省略可)

通常の
パラグラフ
タイトル(省略可)

通常の パラグラフ

.タイトル(省略可)

 リテラルパラグラフ
 記述したままを表示させたいときは
 空白文字でインデントします。
タイトル(省略可)
リテラルパラグラフ
記述したままを表示させたいときは
空白文字でインデントします。
.タイトル(省略可)
[source,perl]
die 'connect: '.$dbh->errstr;

次のパラグラフにある文字列は、
コードとして処理されません。
タイトル(省略可)
die 'connect: '.$dbh->errstr;

次のパラグラフにある文字列は、 コードとして処理されません。

.タイトル(省略可)
NOTE: これはシングルパラグラフの
      ノートを記述例です。
注
タイトル(省略可)
これはシングルパラグラフの ノートを記述例です。
.タイトル(省略可)
[NOTE]
これはシングルパラグラフの
ノートを記述例です。
注
タイトル(省略可)
これはシングルパラグラフの ノートを記述例です。
TIP: 補足
補足 補足
IMPORTANT: 重要.
重要 重要.
WARNING: 警告.
警告 警告.
CAUTION: 注意.
注意 注意.

ブロック

ブロックは4文字以上の区切り記号に挟まれたテキストで、 使う区切り記号により整形の仕方が変わります。

.タイトル(省略可)
----
*リスティング* ブロック

用途: コードもしくはファイルの表示(リスティング)
----
タイトル(省略可)
*リスティング* ブロック

用途: コードもしくはファイルの表示(リスティング)
.タイトル(省略可)
[source,perl]
----
# *ソース(source)* ブロック
# 用途: ソースコードのハイライト表示
# (`source-highlight` もしくは `pygmentize` が必要です)
use DBI;
my $dbh = DBI->connect('...',$u,$p)
    or die "connect: $dbh->errstr";
----
タイトル(省略可)
# *ソース(source)* ブロック
# 用途: ソースコードのハイライト表示
# (`source-highlight` もしくは `pygmentize` が必要です)
use DBI;
my $dbh = DBI->connect('...',$u,$p)
    or die "connect: $dbh->errstr";
.タイトル(省略可)
****
*サイドバー* ブロック

用途: サイドバー形式のノート (^^)
****
タイトル(省略可)

サイドバー ブロック

用途: サイドバー形式のノート (^^)

.タイトル(省略可)
==========================
*例示(Example)* ブロック

用途: 例示 (^^;

デフォルトのキャプションは"Example:"になります。
次のようにして変更できます。

 [caption="Custom: "]

これを例示ブロックの前に置きます。
==========================
例 1. タイトル(省略可)

例示(Example) ブロック

用途: 例示 (^^;

デフォルトのキャプションは"Example:"になります。 次のようにして変更できます。

[caption="Custom: "]

これを例示ブロックの前に置きます。

.タイトル(省略可)
[NOTE]
===============================
*ノート* ブロック

用途: マルチパラグラフのノード

別のパラグラフ

===============================
注
タイトル(省略可)

ノート ブロック

用途: マルチパラグラフのノード

別のパラグラフ

////
*コメント* ブロック

用途: コメント。asciidocはテキストを処理しない
////
*パススルー* ブロック
++++
<p>
用途: バックエンドのマークアップの書式を記述する
<table border="1">
<tr><td>1<td>2
</table>
++++

パススルー ブロック

用途: バックエンドのマークアップの書式を記述する

12
 .タイトル(省略可)
 ....
 *リテラル* ブロック
 ·
 用途: 書いたままに表示させたいとき
 パラグラフ (インデント付き) を表示するときなど
    1. はじめに.
    2. 次に.
 リストとして処理するとうまくいかない
 ....
タイトル(省略可)
*リテラル* ブロック
·
用途: 書いたままに表示させたいとき
パラグラフ (インデント付き) を表示するときなど
   1. はじめに.
   2. 次に.
リストとして処理するとうまくいかない
.タイトル(省略可)
[quote, author, cite source]
____
*引用* ブロック

用途: 誰かの著作を引用するとき
____
タイトル(省略可)

引用 ブロック

用途: 誰かの著作を引用するとき

cite source
— author

テキスト

強制的に +
改行

強制的に
改行

標準, _イタリック_, *ボールド*, +モノ(monospaceフォント)+.

``ダブルクォート'', `シングルクォート'.

標準, ^上付き^, ~下付き~.

標準, イタリック, ボールド, モノ(monospaceフォント).

『ダブルクォート』, 「シングルクォート」.

標準, 上付き, 下付き.

コマンド表示: `ls -al`

+モノ(monospaceフォント) *ボールド*+

`passthru *option*`

コマンド表示: ls -al

モノ(monospaceフォント) ボールド

passthru *option*

PATH表示: '/some/filez.txt', '.b'

PATH表示: /some/filez.txt, .b

[red]#赤いテキスト# [yellow-background]#黄色い背景#
[big]#さらに文字を大きく# [red yellow-background big]*そしてボールド(全部)*

赤いテキスト 黄色い背景 さらに文字を大きく そしてボールド(全部)

文字単位で指定: n__i__**b**++m++[red]##r##

文字単位で指定: nibmr

// コメント   asciidoc はテキストを処理しない
(C) (R) (TM) -- ... -> <- => <= &#182;

© ® ™ — … → ← ⇒ ⇐ ¶

''''

エスケープ:
\_italic_, +++_italic_+++,
t\__e__st, +++t__e__st+++,
+++<b>bold</b>+++, $$<b>normal</b>$$
\&#182;
\`not single quoted'
\`\`not double quoted''

エスケープ: _italic_, _italic_, t__e__st, t__e__st, bold, <b>normal</b> &#182; `not single quoted' ``not double quoted''

リスト

.バレットリスト
* バレット
  - バレット
* バレット
** バレット
*** バレット
**** バレット
***** バレット
バレットリスト
  • バレット

    • バレット

  • バレット

    • バレット

      • バレット

        • バレット

          • バレット

.バレットリスト 2
- バレット
  * バレット
バレットリスト 2
  • バレット

    • バレット

.オーダーリスト
. ナンバー
. ナンバー
  .. レター
  .. レター
. ナンバー
.. 英数字小文字
.. 英数字小文字
... ローマ数字小文字
... ローマ数字小文字
.... 英数字大文字
.... 英数字大文字
..... ローマ数字大文字
..... ローマ数字大文字
.... 英数字大文字
... ローマ数字小文字
.. 英数字小文字
. ナンバー
オーダーリスト
  1. ナンバー

  2. ナンバー

    1. レター

    2. レター

  3. ナンバー

    1. 英数字小文字

    2. 英数字小文字

      1. ローマ数字小文字

      2. ローマ数字小文字

        1. 英数字大文字

        2. 英数字大文字

          1. ローマ数字大文字

          2. ローマ数字大文字

        3. 英数字大文字

      3. ローマ数字小文字

    3. 英数字小文字

  4. ナンバー

.オーダーリスト 2
a. レター
b. レター
   .. レター2
   .. レター2
       .  ナンバー
       .  ナンバー
           1. ナンバー2
           2. ナンバー2
       .  ナンバー
   .. レター2
c. レター
オーダーリスト 2
  1. レター

  2. レター

    1. レター2

    2. レター2

      1. ナンバー

      2. ナンバー

        1. ナンバー2

        2. ナンバー2

      3. ナンバー

    3. レター2

  3. レター

.ラベルリスト
用語 1::
    定義 1
用語 2::
    定義 2
    用語 2.1;;
        定義 2.1
用語 3::
    定義 3
用語 4:: 定義 4
用語 4.1::: 定義 4.1
用語 4.2::: 定義 4.2
用語 4.2.1:::: 定義 4.2.1
ラベルリスト
用語 1

定義 1

用語 2

定義 2

用語 2.1

定義 2.1

用語 3

定義 3

用語 4

定義 4

用語 4.1

定義 4.1

用語 4.2

定義 4.2

用語 4.2.1

定義 4.2.1

.ラベルリスト 2
用語 1;;
    定義 1
    用語 1.1::
        定義 1.1
ラベルリスト 2
用語 1

定義 1

用語 1.1

定義 1.1

[horizontal]
.ラベルリスト(行単位)
用語 1:: 定義 1
用語 2:: 定義 2
[horizontal]
    用語 2.1;;
        定義 2.1
    用語 2.2;;
        定義 2.2
用語 3::
    定義 3
用語 4:: 定義 4
[horizontal]
用語 4.1::: 定義 4.1
用語 4.2::: 定義 4.2
[horizontal]
用語 4.2.1:::: 定義 4.2.1
用語 4.2.2:::: 定義 4.2.2
用語 4.3::: 定義 4.3
用語 5:: 定義 5
ラベルリスト(行単位)
用語 1

定義 1

用語 2

定義 2

用語 2.1

定義 2.1

用語 2.2

定義 2.2

用語 3

定義 3

用語 4

定義 4

用語 4.1

定義 4.1

用語 4.2

定義 4.2

用語 4.2.1

定義 4.2.1

用語 4.2.2

定義 4.2.2

用語 4.3

定義 4.3

用語 5

定義 5

[qanda]
.Q&A
質問 1::
    回答 1
質問 2:: 回答 2
Q&A
  1. 質問 1

    回答 1

  2. 質問 2

    回答 2

.インデントはオプション
- バレット
    * another バレット
        1. ナンバー
        .  again ナンバー
            a. レター
            .. again レター

.. レター
. ナンバー

* バレット
- バレット
インデントはオプション
  • バレット

    • another バレット

      1. ナンバー

        1. again ナンバー

          1. レター

            1. again レター

            2. レター

        2. ナンバー

    • バレット

  • バレット

.リストの分割
. ナンバー
. ナンバー

はじめに出現するパラグラフはリストを分割します。

. ナンバー

.ヘッダもリストを分割します。
. ナンバー

--
. リストブロックの記述もリストを分割します。
. ナンバー
. ナンバー
--

--
. ナンバー
. ナンバー
--
リストの分割
  1. ナンバー

  2. ナンバー

はじめに出現するパラグラフはリストを分割します。

  1. ナンバー

ヘッダもリストを分割します。
  1. ナンバー

  1. リストブロックの記述もリストを分割します。

  2. ナンバー

  3. ナンバー

  1. ナンバー

  2. ナンバー

.継続(Continuation)
- バレット
行を開けずに記述すると
. ナンバー
  リストは継続します。
* バレット

 改行して空白に続けて記述すると、
 書いたままに記述でき、
 リストは継続します

.. レター
+
プラス記号(+)はリストを分割しません
+
----
リストの中に

ブロックを記述できます。
----
+
最後の継続
継続(Continuation)
  • バレット 行を開けずに記述すると

    1. ナンバー リストは継続します。

      • バレット

        改行して空白に続けて記述すると、
        書いたままに記述でき、
        リストは継続します
        1. レター

          プラス記号(+)はリストを分割しません

          リストの中に
          
          ブロックを記述できます。

          最後の継続

.リストブロックはサブリストを含むことができます。
- バレット
  * バレット
+
--
    - バレット
      * バレット
--
  * バレット
- バレット
  . ナンバー
    .. レター
+
--
      . ナンバー
        .. レター
--
    .. レター
  . ナンバー
リストブロックはサブリストを含むことができます。
  • バレット

    • バレット

      • バレット

      • バレット

    • バレット

  • バレット

    1. ナンバー

      1. レター

        1. ナンバー

        1. レター

      2. レター

    2. ナンバー

表(テーブル)

.表の例
[options="header,footer"]
|=================================
|カラム 1|カラム 2      |カラム 3
|1       |アイテム 1    |a
|2       |アイテム 2    |b
|3       |アイテム 3    |c
|合計6   |Three items   |d
|=================================
表 1. 表の例
カラム 1 カラム 2 カラム 3

合計6

Three items

d

1

アイテム 1

a

2

アイテム 2

b

3

アイテム 3

c

.データ形式はCSV, 各カラム幅は表示域の15% (60 ÷ 4 = 15)
[format="csv",width="60%",cols="4"]
[frame="topbot",grid="none"]
|======
1,2,3,4
a,b,c,d
A,B,C,D
|======
表 2. データ形式はCSV, 各カラム幅は表示域の15% (60 ÷ 4 = 15)

1

2

3

4

a

b

c

d

A

B

C

D

図(画像)、リンク

はじめのホーム
image:images/icons/home.png[]
, 次のホーム
image:images/icons/home.png[代替テキスト]
.

.ブロックイメージ
image::images/icons/home.png[]
image::images/icons/home.png[代替テキスト]

.イメージをサムネイル表示
image:images/face.jpg["My Avator",
width=80,link="images/face.jpg"]

はじめのホーム images/icons/home.png , 次のホーム 代替テキスト .

images/icons/home.png
図 1. ブロックイメージ
代替テキスト
イメージをサムネイル表示

My Avator

link:asciidoc[このドキュメント]
link:asciidoc.html[]
link:/index.html[このサイトのトップ]
http://google.com
http://google.com[グーグル検索]
mailto:root@localhost[管理者のメールアドレス]

システムコマンドマクロ

asciidoc ではシステムコマンドマクロと呼ぶ、 指定したファイルの内容やコマンドの実行結果を取り込むことができます。

  • include - 指定したファイルを読み込む

  • eval - python の式を実行した結果を取り込む

  • sys - シェルの実行結果を取り込む

外部ファイルを読み込むときは次のように記述します。

 -----------------------------------
 include::ファイルパス[]
 -----------------------------------

アトリビュートでタブサイズを指定することもできます。

 ------------------------------------
 include::ファイルパス[tabsize=4]
 ------------------------------------

次のように記述すると asciidoc は date コマンドを実行します。

 -------------------------------------
 sys::["date"]
 -------------------------------------

その結果を取り込んで整形します。

2015年  3月 18日 水曜日 09:24:17 JST

コマンドラインで --safe オプションを与えると、 システムコマンドマクロは展開されません。

フィルター

Asciidocには外部コマンドを呼び出して取り込むフィルタ機能があります。 フィルターにはasciidocとともにインストールされる組み込みフィルターと、 ユーザが後から自由に追加できるプラグインフィルターがあります。

代表的な組み込みフィルターは source と graphviz です。

source フィルター

構文ハイライター pygments もしくは source-highlight がインストールされていると、 リスティングブロック内に記述したプログラムのソースの構文が色付けされて整形されます。

 [source,sh,numbered]
 --------------------------------------------------
 #!/bin/bash
 echo "Hello, World!"
 --------------------------------------------------
1
2
#!/bin/bash
echo "Hello, World!"

graphviz フィルター

Graphvizはダイヤグラムやネットワーク図や状態遷移図などのグラフを、 テキストで論理的な記述により表現でき、 それを描画することができるツールです。[10] Graphviz は非常に便利なツールですが、 グラフに特化しているためテキスト整形には向いていません。

AsciiDocは作図機能などを単独では持っていませんが、 graphvizフィルタを使うと Graphviz を AsciiDoc から使うことができ、 両方の良いところを享受することができます。

graphvizフィルターは組み込みフィルターなので、 システムに graphviz がインストールされていれば、 リスティングブロック内に記述した graphviz のソースが整形されます。

 ["graphviz", "images/graphviz-sample.png"]
 ------------------------------------------------
 digraph automata_0 {
    size ="8.5, 11"; node [shape = circle];
    0 [ style = filled, color=lightgrey ];
    2 [ shape = doublecircle ];
    0 -> 2 [ label = "a " ];
    0 -> 1 [ label = "other " ];
    1 -> 2 [ label = "a " ];
    1 -> 1 [ label = "other " ];
    2 -> 2 [ label = "a " ];
    2 -> 1 [ label = "other " ];
    "Machine: a" [ shape = plaintext ];
 }
 ------------------------------------------------
images/graphviz-sample.png

ギャラリーを参照すると graphviz でどのような作図ができるかよくわかるので、 参照しておくことをお勧めします。

プラグイン

Asciidoc にはインストール後の環境に、 バックエンド、フィルター、テーマ をユーザ権限でも追加することができる、 プラグインという仕組みがあります。

コマンドラインでオプション --backend--filter--theme を与えて追加/削除/リストします。

追加したプラグインは $HOME/.asciidoc/{backend,filter,theme} 以下に 格納されます。

利用可能なプラグインを参照
$ asciidoc --filter list
$ asciidoc --backend list
$ asciidoc --theme list
プラグインのインストール
$ asciidoc --filter install ZIP_FILE
$ asciidoc --backend install ZIP_FILE
$ asciidoc --theme install ZIP_FILE
プラグインを削除
$ asciidoc --filter remove NAME
$ asciidoc --backend remove NAME
$ asciidoc --theme remove NAME

ditaa フィルターの追加

ditaa はJavaで動作する図をテキストで表現するアスキーアートから グラフィカルな画像データに変換するツールです。

    +--------+   +-------+    +-------+
    |        | --+ ditaa +--> |       |
    |  Text  |   +-------+    |diagram|
    |Document|   |!magic!|    |       |
    |     {d}|   |       |    |       |
    +---+----+   +-------+    +-------+
        :                         ^
        |       Lots of work      |
        +-------------------------+

これが次のように整形されて取り込まれます。

images/asciidoc-ditaa1.png

ditaa では漢字など2文字幅があるものを単純に1文字として判断してしまいます。 そのためエディタではボックスがつながっているように見えていても、 ditaa では囲われていないため色付できないなどうまく処理できません。

 ["ditaa","images/ditaa-sample2.png"]
 ---------------------------------------
 +-------------+-------------+
 |cGRE 緑色    |cPNK 桃色    |
 +-------------+-------------+
 -----------------------------------------
images/ditaa-sample2.png

この問題を修正した jditaa が公開されています。[14]

jditaa は日本語などの2バイト文字を見つけると、 その文字の後ろに自動的に空白文字を挿入してから処理するため、 エディタで入力した期待どおりの結果になります。

images/ditaa-sample3.png

jditaa を asciidoc のフィルタZIPにしていますので、 次のようにすると簡単にインストールすることができます。

$ wget http://repobank.openmyroad.com/DocSys/jditaa-filter-1.1.zip
$ asciidoc --filter install jditaa-filter-1.1.zip

フィルタ名を ditaa の代わりに jditaa をするだけです。

利用方法(抜粋)
 ["jditaa","出力ファイルのパス"]
 ---------------------------------------

deckjs バックエンドの追加

deckjs はスライド表示が行えるHTML5形式で整形するバックエンドです[15]

deckjs を asciidoc のバックエンドZIPにしていますので、 次のようにすると簡単にインストールすることができます。

$ wget http://repobank.openmyroad.com/DocSys/deckjs-backend-1.6.2.1.zip
$ asciidoc --backend install deckjs-backend-1.6.2.1.zip

利用方法は、 asciidoc を実行するときのコマンドラインを次のようにします。

$ asciidoc --backend deckjs source.txt

このHTMLをブラウザで表示すると、 次のようなスライド操作ができます。

  • 右カーソルキー: スライドを進む

  • 左カーソルキー: スライドを戻る

  • g キー: 指定した番号のスライドへ移動

  • t キー: 目次を表示、クリックで移動

  • m キー: スライド一覧、クリックで移動

文章中に記述するアトリビュート :deckjs_theme::deckjs_transition: は、 deskjs によって理解されスライド方法などの見た目を変えることができます。

  • deskjs_theme の設定可能な値

    • beamer, swiss, web-2.0, sandstone, shadow, neon, bower

  • deskjs_transition の設定可能な値

    • beamer, cube, fade, horizontal-slide, vertical-slide

設定例:
:deckjs_theme: swiss
:deckjs_transition: cube

また、firefox であれば次のAdd-ons をインストールしておくと、 メニューやナビゲーションバーを隠すことができ、 表示域が広がります。

PDF の生成

asciidoc でバックエンドに DocBook を指定すると、 PDFやEPUBなどのフォーマットに変換することができます。

単にPDFに変換したいだけであれば、 HTMLをPDFに変換するための wkhtml2pdf コマンドを使うのが簡単です。[16]

Windows, Linux, MacOS などのコンパイル済みのバイナリが配布されています。

具体的に asciidoc から PDF に変換する手順は次のようになります。

$ asciidoc Asciidoc-Howto.txt
$ wkhtmltopdf Asciidoc-Howto.html Asciidoc-Howto.pdf

小技

私はリスト1に示した makefile を利用しています。

はじめにディレクトリを作成して、 この makefile をコピーし make setup を実行すると、 著者や日付などを書き込んだ profile.inc と、 ディレクトリ名をドキュメントのファイル名とする ファイルを自動生成します。

以後はmake を実行するだけで、 ソースのテキストファイルとHTMLファイルのタイムスタンプを比較し、 必要があれば asciidoc を実行してくれるため手間が省けて便利です。

実行例:
$ mkdir sample
$ cd sample
$ cp ~/asciidoc.make Makefile
$ make setup
$ ls
files  images  Makefile  profile.inc  sample.txt  slide.inc

スライドを作りたいときは、 Makefile で定義している ENABLE_SLIDE を YES に設定して、 make を実行します。

リスト1: asciidoc.makeの内容
#
# common makefile for asciidoc
# Goichi Iisaka <iisaka51@gmail.com>
# Version: 1.2
# 18 Dec 2014 Cold Day
#
# REQUIRES:
# http://www.methods.co.nz/asciidoc/
# http://houqp.github.io/asciidoc-deckjs/
# http://wkhtmltopdf.org/
# SEE ALSO:
# http://imakewebthings.com/deck.js/
#
AUTHOR="飯坂 剛一"
EMAIL="iisaka51@gmail.com"
DATE=$(shell date "+%Y-%m-%d" )
ENABLE_SLIDE=NO
ENABLE_PDF=YES

# Configuration for ASCIIDOC
ASCIIDOC_ICONDIR=/etc/asciidoc/images/icons
ASCIIDOC_OPTIONS=-a iconsdir=./images/icons -a icons -a lang=ja
ASCIIDOC_CMD=asciidoc
# Configuration for wkhtmltopdf
CONVPDF_CMD=wkhtmltopdf

# YOU MAY NOT NEED TO EDIT BELLOWS
DOCNAME=$(shell basename $(CURDIR) )
DIRNAME=$(shell basename $(CURDIR))
TEXTS=$(shell ls -1 *.txt 2>/dev/null )
INCFILES=$(shell ls -1 *.inc 2>/dev/null )
HTMLS=${TEXTS:.txt=.html}
PDFS=${TEXTS:.txt=.pdf}


all: $(HTMLS) $(PDFS)
        @echo "Done."
list:
        @echo "$(TEXTS)"
backup:
        cd .. && zip -ur $(CURDIR).zip $(DIRNAME)
clean:
        rm -f *~ $(HTMLS) $(PDFS) *.slide.html 2>/dev/null
clean_icon:
        rm -rf images/icon
setup_dirs:
        @[ -d images ] || mkdir images
        @[ -d files ] || mkdir files
setup_icon: setup_dirs
        @cp -rL $(ASCIIDOC_ICONDIR) images

setup: setup_dirs
        @{ echo ":author: $(AUTHOR) " ; \
          echo ":email: $(EMAIL) " ; \
          echo ":revdate: $(DATE)"  ; \
          echo ":revnumber: 0.0 " ; \
          } > profile.inc
        @{ echo ":deckjs_theme: shadow " ; \
          echo ":deckjs_transition: cube " ; \
          echo ":pygments: " ; \
          echo ":pygments_style: autumn " ; \
          echo ":scrollable:";  \
          } > slide.inc
        @{ echo "= $(DOCNAME)" ; \
           echo "include::profile.inc[]" ; \
           echo "include::slide.inc[]" ; \
          }  >> $(DOCNAME).txt

# clear out all suffixes
.SUFFIXES:
# list only those we use
.SUFFIXES: .txt .html .slide .pdf

.txt.html:
        [ $(ENABLE_SLIDE) != NO ] && { $(ASCIIDOC_CMD) --backend deckjs $(ASCIIDOC_OPTIONS) $< ; mv $@ $*.slide.html ; } || :
        $(ASCIIDOC_CMD) $(ASCIIDOC_OPTIONS) $<
.html.pdf:
        [ $(ENABLE_PDF) != NO ] && { $(CONVPDF_CMD) $*.html $*.pdf ; }
$(TEXTS): $(INCFILES)
        touch $@

参考資料