ヘッダーと本体を分けて管理したい

MarkdownをPandocで整形して文書を作成するのは楽ですが、 微妙なバージョンの違いがめんどくさかったり、 言語学あるある例文形式1をsedで作ったりする際は MarkdownをLaTeXに整形してからsedでリストを言語学式に整形してコンパイルをしています。

通常のMarkdown->PDF変換の際はMarkdownの最初にyamlヘッダーを書いて titledate,authorなどの変数を埋めています。 他方、Markdown->LaTeXと一度変換する目的は \mainmatterの部分のみのLaTeXファイルの取得です。 しかしながら、 変換前のMarkdownにyamlヘッダーがあるとタイトルなども変換してしまい プリアンブルもろもろ出力され\mainmatterのみとはいきません。

これを解決するためには普段から処理を場合分け、 つまりヘッダーと本体を分けて管理します。

そしてMarkdown->PDFの際はヘッダーを本体の前に挿入してPandocを呼びます。 他方、Markdown->TeX->sed->Tex->PDFの際は、 ヘッダーを読み込まずにMarkdownのみ変換してsedなどをすれば良いのです。 このエントリーはヘッダーと本体の分け方の説明でもあります。

sedではなくcatを使う

さて、上でも編集にsedを使っている通り、 テキスト編集にはsedが便利です。 なので、ファイルの最初や最後に他のファイルを追加しようとする際にも sedを使いたくなります 典型的なマズローのハンマーですね…。 悔い改めて cat を使います2

なぜcatを使うかの前に、 catは「ファイルの中身を見るためのコマンド」ではないことを再認せねばなりません。 man cat をすると cat - concatenate files and print on the standard outputcatの意味が出てきます。

ファイルの中身を見るのにcatを使っていたため “cat”が “concatenate”の略だと完全に忘れてたというか知らなかった。

なので、”header.yml”と保存していたファイルを “report.md”の前に挿入(結合)したファイルをパイプで標準出力に渡すなら 以下でいいのです。

cat header.yml report.md |

名前を意識してコマンドを使っていきたい

ちなみにこんな簡単な話にハマってしまっているケースは 某質問共有サイトとか知識共有サイトとかブログとかでも結構な割合で見かけます。 というか、自分も以前はなんとかしてsedを駆使して頑張った記憶があります3

最初の頃に学んだ単語とかコマンドって刷り込みみたいなもので、 改めてhelpとかmanしてみると発見があります。 問題は「そんなのしってるよ」と思っている部分に なかなか意識が届かない点でしょうか。精進します。


  1. 言語学では数字のリスト内にアルファベットのリストをネストする記法が存在しており、高度なWord技術が無いと辛いのです。ただ最近はTeX Live 2016 などに言語学徒御用達のパッケージが標準でインストールされているので割と楽な環境になっている気もしますが。 

  2. 最初は「何で猫…」と思っていた。 

  3. sed奥深い。行の編集なのですが万能すぎて行にも適用しようとしてしまうところがハマりポイントでしょうか。