DiaryException このページをアンテナに追加 RSSフィード Twitter

2015-06-16(火)

[]Markdown相互参照を使うならpandoc-crossref

LaTeXだと\label\refを使えばいい具合に相互参照できる(参照番号を付けてくれる)が、Markdownだとそういう記法は無い。

pandocというドキュメントコンバータを使うと、Markdown(など)の形式ドキュメント入力にして、様々な処理を加え、Markdownや他の形式ドキュメントを出力することができる。その「様々な処理」はpandocに内蔵されたものの他、プラグイン拡張することができる。

そして、プラグインの1つにMarkdownドキュメント内での相互参照を実現するpandoc-crossrefがある。

例えば以下の様なMarkdownファイルを用意する。

はじまり

[@fig:a_image]に示す画像は特に意味が無い。

![これはイメージです](http://mirrors.creativecommons.org/presskit/logos/cc.logo.large.png){#fig:a_image}

[@eq:b_equation]はどこかで見たことがある数式である。

$$ x^2 + y^2 = 1 $$ {#eq:b_equation}

[@tbl:c_table]はただの表である。

| head1 | head2 |
|:--|:--|
| 1/1 | 1/2 |
| 2/1 | 2/2 |

: 例 {#tbl:c_table}

[@lst:d_code]は動きそうである。

```{#lst:d_code .python .numberLines caption="Pythonっぽいコード"}
import sys
print(sys.version())
print("Hello, Pandoc")
```

おわり

このファイルをpandocコマンドとpandoc-crossrefプラグインで処理し、Markdown形式で出力する。

$ pandoc -s --filter pandoc-crossref -f markdown -t markdown note.md 

その結果が以下のとおり。

---
chapDelim: '.'
crossrefYaml: 'pandoc-crossref.yaml'
eqnPrefix:
- 'eq.'
- 'eqns.'
figPrefix:
- 'fig.'
- 'figs.'
figureTemplate: $$figureTitle$$ $$i$$$$titleDelim$$ $$t$$
figureTitle: Figure
listingTemplate: $$listingTitle$$ $$i$$$$titleDelim$$ $$t$$
listingTitle: Listing
lofTitle: |
    List of Figures
    ===============
lolTitle: |
    List of Listings
    ================
lotTitle: |
    List of Tables
    ==============
lstPrefix:
- 'lst.'
- 'lsts.'
rangeDelim: '-'
tableTemplate: $$tableTitle$$ $$i$$$$titleDelim$$ $$t$$
tableTitle: Table
tblPrefix:
- 'tbl.'
- 'tbls.'
titleDelim: ':'
...
はじまり

fig. 1に示す画像は特に意味が無い。

![Figure 1:
これはイメージです](http://mirrors.creativecommons.org/presskit/logos/cc.logo.large.png)

eq. 1はどこかで見たことがある数式である。

$$ x^2 + y^2 = 1 \qquad(1)$$

tbl. 1はただの表である。

  head1   head2
  ------- -------
  1/1     1/2
  2/1     2/2

  : Table 1: 例

lst. 1は動きそうである。

<div id="lst:d_code" class="listing python numberLines">

Listing 1: Pythonっぽいコード

``` {.python .numberLines}
import sys
print(sys.version())
print("Hello, Pandoc")
```

</div>

おわり

ファイル先頭に設定情報が書き込まれているところは置いておいて、元の入力Markdown@...#...としていたところが、参照番号に置き換わっていることがわかる。

pandocコマンドの出力をHTMLにすると、よくわかる。

f:id:LaclefYoshi:20150616211931p:image

日本語文章の中にfig.eq.tbl.lst.というのは見た目が良くないが、これはYAML設定ファイルを書くことで変更できる。

figureTitle: "図 "
tableTitle: "表 "
listingTitle: "コード "
figPrefix: "図."
eqnPrefix: "式."
tblPrefix: "表."
lstPrefix: "コード."

pandocコマンド実行時に設定ファイルパスを渡す

$ pandoc -s --filter pandoc-crossref -M "crossrefYaml=crossref_config.yaml" note.md 

結果は以下のとおり。

---
chapDelim: '.'
crossrefYaml: 'crossref_config.yaml'
eqnPrefix: '式.'
figPrefix: '図.'
figureTemplate: $$figureTitle$$ $$i$$$$titleDelim$$ $$t$$
figureTitle: 図
listingTemplate: $$listingTitle$$ $$i$$$$titleDelim$$ $$t$$
listingTitle: コード
lofTitle: |
    List of Figures
    ===============
lolTitle: |
    List of Listings
    ================
lotTitle: |
    List of Tables
    ==============
lstPrefix: 'コード.'
rangeDelim: '-'
tableTemplate: $$tableTitle$$ $$i$$$$titleDelim$$ $$t$$
tableTitle: 表
tblPrefix: '表.'
titleDelim: ':'
...

はじまり

図.&#160;1に示す画像は特に意味が無い。

![図 1:
これはイメージです](http://mirrors.creativecommons.org/presskit/logos/cc.logo.large.png)

式.&#160;1はどこかで見たことがある数式である。

$$ x^2 + y^2 = 1 \qquad(1)$$

表.&#160;1はただの表である。

  head1   head2
  ------- -------
  1/1     1/2
  2/1     2/2

  : 表 1: 例

コード.&#160;1は動きそうである。

<div id="lst:d_code" class="listing python numberLines">

コード 1: Pythonっぽいコード

``` {.python .numberLines}
import sys
print(sys.version())
print("Hello, Pandoc")
```

</div>

おわり

f:id:LaclefYoshi:20150616213106p:image

[]Markdownファイルで外部ファイルインポートするならcog

Markdownドキュメント内で外部のファイルの内容を引用したい場面が多々ある。プログラム設定ファイルの説明などを加工としているときに多い。

外部ファイルの内容をコピーしてMarkdownドキュメントペーストしても解決するが、外部ファイルの内容が変更された時には、Markdownドキュメント側も変更する必要があり、保守が大変になる。

cogというコードジェネレータを使ってこの問題を解決した。

例えば以下の様なMarkdownファイルを用意する。

以下はZookeeper用Dockerfileである。

<!-- [[[cog
import cog
filepath = "/home/laclefyoshi/Documents/zookeeper/Dockerfile"
label = "#lst:zookeeper_dockerfile"
format = ".dockerfile"
caption = "Zookeeper用Dockerfile"
cog.outl("```{%s %s .numberLines caption=\"%s\"}" % (label, format, caption))
with open(filepath) as f:
    cog.outl("".join(f.readlines()).strip())
cog.outl("```")
]]] -->
<!-- [[[end]]] -->

filepathに適切なファイルを配置し、cogコマンドでこのファイルを処理させる。

$ cog.py memo.md

結果は以下のとおり。


以下はZookeeper用Dockerfileである。

<!-- [[[cog
import cog
filepath = "Dockerfile"
label = "#lst:zookeeper_dockerfile"
format = ".dockerfile"
caption = "Zookeeper用Dockerfile"
cog.outl("```{%s %s .numberLines caption=\"%s\"}" % (label, format, caption))
with open(filepath) as f:
    cog.outl("".join(f.readlines()).strip())
cog.outl("```")
]]] -->
```{#lst:zookeeper_dockerfile .dockerfile .numberLines caption="Zookeeper用Dockerfile"}
FROM centos
MAINTAINER SAEKI Yoshiyasu <@laclefyoshi>

WORKDIR /tmp
RUN yum install -y java-1.7.0-openjdk-devel.x86_64 tar.x86_64
ENV JAVA_HOME /usr/lib/jvm/java
RUN curl -O http://ftp.tsukuba.wide.ad.jp/software/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
RUN tar zxvf zookeeper-3.4.6.tar.gz
RUN cp zookeeper-3.4.6/conf/zoo_sample.cfg zookeeper-3.4.6/conf/zoo.cfg
RUN mkdir -p /tmp/zookeeper
RUN mv zookeeper-3.4.6 /opt/

WORKDIR /opt/zookeeper-3.4.6
ENTRYPOINT ["./bin/zkServer.sh"]
CMD ["start-foreground"]
EXPOSE 2181
```
<!-- [[[end]]] -->

これをpandocHTML出力すると、以下のようになる。

f:id:LaclefYoshi:20150616214825p:image

逆にコードの中にドキュメントを書く(文芸プログラミング)という方法もあるが、今回はドキュメント割合が大きかったので、こういう解決策を選んだ。

2015-06-14(日)

[]Cardboardを組み立てた

簡単な気分転換としてCardboardを組み立てた。通販たまたま適度な薄さの段ボールを手に入れたのがきっかけ。

f:id:LaclefYoshi:20150614201900j:image

Google I/O 2015でボタン付きがリリースされたが、公開されているパーツPDFは2014のもの(2015/06/14現在)。レターサイズ印刷して、途切れている部分を糊付けし、山折りオンリーで組み合わせるだけ。Apple製品じゃないが、直感的だと思う。ボディの固定用に輪ゴム100円ショップで凸レンズ2枚、磁石2個、マジックテープの購入が必要

iPhone6で使えるアプリが、サードパーティのお試し版みたいなものしかなく、画像を頭を動かしながら見た。マグネットセンサが無いのか、磁石は効かなかった。なるほど没頭感はそこそこあるが、眼鏡を付けたままだとちょっと邪魔に感じる。

Google Glass以降片目端末が流行ったが、やはりゴーグル型こそ未来情報端末イメージがある。コンタクトレンズ型でもいいから視野全体に付加情報を表示しまくり、情報洪水を実感してみたいものだ。

2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2015 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2017 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |