テキストの前後にテキストを挿入したい時
ヘッダーと本体を分けて管理したい
MarkdownをPandocで整形して文書を作成するのは楽ですが、 微妙なバージョンの違いがめんどくさかったり、 言語学あるある例文形式1をsedで作ったりする際は MarkdownをLaTeXに整形してからsedでリストを言語学式に整形してコンパイルをしています。
通常のMarkdown->PDF変換の際はMarkdownの最初にyamlヘッダーを書いて
title
やdate
,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 output
とcat
の意味が出てきます。
ファイルの中身を見るのにcat
を使っていたため
“cat”が “concatenate”の略だと完全に忘れてたというか知らなかった。
なので、”header.yml”と保存していたファイルを “report.md”の前に挿入(結合)したファイルをパイプで標準出力に渡すなら 以下でいいのです。
cat header.yml report.md |
名前を意識してコマンドを使っていきたい
ちなみにこんな簡単な話にハマってしまっているケースは 某質問共有サイトとか知識共有サイトとかブログとかでも結構な割合で見かけます。 というか、自分も以前はなんとかしてsedを駆使して頑張った記憶があります3。
最初の頃に学んだ単語とかコマンドって刷り込みみたいなもので、 改めてhelpとかmanしてみると発見があります。 問題は「そんなのしってるよ」と思っている部分に なかなか意識が届かない点でしょうか。精進します。