Jazzと読書の日々

iPadを筆記具として使う方法を模索します

Obsidianで小説や論文をマージする方法

ObsidianはPKM。 つまり「知識 Knowledge」のネットワークを構築するツールなので、実は「執筆 Writing」に弱い。 大リーグボール2号が水に弱いくらい弱い。

それでPWM(Personal Writing Management)には一工夫必要となります。

分割執筆

章立てをファイルに分けて書き、あとから連結する方法。 ScrivenerやUlyssesでお馴染みですが、これをObsidianでもやってしまおう、という作戦です。

TemplaterとDataviewプラグインを使っています。

Playlist.md

下記スクリプトをTemplaterのHotkeyに登録してください。 個人的にはCommanderでTab Barのボタンにしています。 ここが呼び出しやすい。

Import Obsidian: Playlist

<%*
const PLAY = "playlist"
const MERGE = "merge"

p = tp.file.folder(true) + "/"
q = PLAY
const t = tp.file.title
if(t == PLAY){
  s = tp.file.content
  if(/^\- /m.test(s)){
    if(/\- \[x\]/.test(s)){
      q = MERGE
      const a = s.split("\n")
      s = ""
      for(i=0; i<a.length; i++){
        if(/- \[x\] /.test(a[i])){
          const m = a[i].split("- [x] ")
          s+= m[0].replace(/\t/g, "    ").replace(/\s{4}/g, "#").replace(/\s+/g, "#") + "## "
          f = m[1].replace(/.*\[\[(.+?)\]\].*/, "$1")
          s+= f + "\n\n"
          f = p + f + ".md"
          b = app.vault.getAbstractFileByPath(f)
          if(b){
            const c = await app.vault.read(b)
            s+= c.replace(/([^!])\[\[(.+?)\]\]/mg, "$1$2") + "\n"
          }
        }
      }
    }else{
      s = s.replace(/\t/mg, "    ")
      s = s.replace(/^ {4} +- /mg, "#### ")
      s = s.replace(/^ +- /mg, "### ")
      s = s.replace(/^- /mg, "## ")
    }
  }else{
    s = s.replace(/^#{4} /mg, "        - ")
    s = s.replace(/^#{3} /mg, "    - ")
    s = s.replace(/^#{2} /mg, "- ")
    s = s.replace(/\n+/g, "\n")
    s = s.replace(/\n/, "\n\n")
  }
}else{
  const d = DataviewAPI.pages('')
   .filter(x => p == (x.file.folder + "/"))
   .filter(x => !x.file.name.includes(q))
   .filter(x => !x.file.name.includes(MERGE))
   .sort(x => x.file.name)
   .map(x => `- [ ] [[${x.file.name}]] `)
  s = `[${p}](obsidian://new?file=${encodeURI(p)}) \n\n`
  s+= d.join("\n")
}
f = p + q + ".md"
p = app.vault.getAbstractFileByPath(f)
if(p){
  if(t != PLAY && q == PLAY){
    s = await app.vault.read(p)
    if(t != MERGE && s.indexOf(`[[${t}]]`) < 0) s+= `\n- [ ] [[${t}]] `
  }
  await app.vault.modify(p, s)
}else{
  p = await app.vault.create(f, s)
}
app.workspace.activeLeaf.openFile(p)
%>

不具合を修正しているので、このバージョンをお使いください。

使い方

連結したいファイルをフォルダにまとめます。 その中のファイルを開きPlaylistを実行してください。 するとplaylist.mdという名のフォルダ内リストが作成されます。

リストの順番は並べ替えて構いません。 ファイル名をタップすれば元のファイルが開きます。 そのファイルでPlaylistを実行すればplaylist.mdに戻ります。

チェックボックスをチェックし再度Playlistを実行すると、チェックされたファイルがマージされmerge.mdになります。 このmerge.mdをPDFにすれば一丁上がり。

新規作成

同じフォルダにファイルを作るときは、1行目のフォルダ名をタップしてください。 新規ファイルが開きます。

タイトルを書いてからPlaylistを実行するとplaylist.mdに追加されます。

並べ替え

チェックのないplaylist.mdでPlaylistを実行すると、並べ替えモードになります。

サイドパネルの「アウトライン」で項目をドラッグし、順番を入れ替えることができます。 階層構造をつけても大丈夫。

再度Playlistを実行すると元の状態に戻ります。

まとめ

PWMってコンセプトが今回の発見。 従来「コンポーザー」と呼んでたけど、これからはこっちを使おう。