Obsidian の Dataview プラグインは手軽に保管庫内のノートの目次を作成でき、「各ディレクトリ以下の最新ノート 5 件」なども表示できて便利です。ただし、表示対象が PDF の場合は、JavaScript クエリを使う必要があります。その方法を記します。
参考文献
Index with dataview for all pdf files? - #4 by mnvwvnm - Help - Obsidian Forum
https://forum.obsidian.md/t/index-with-dataview-for-all-pdf-files/43359/4
Dataview プラグイン が導入されていることを前提とします。
そもそも通常の Markdown ファイルの場合
例えば保管庫直下の qiita-drafts/ ディレクトリ直下にある Markdown ファイルであって、更新日時が新しい 5 件を表示するには、dataview ブロックに以下を書けば OK です。
- ただし、以下のクエリはフロントマターに title キーがあるノートに絞っているので、フロントマターがない場合は where 句の
and titleと table 句の, titleは除去します。 - また、以下のクエリはディレクトリ名をべた書きしていますが、このクエリを書いたノートと同じディレクトリのファイルを集めるなら
FROM this.file.folderともできます。 - 更新日時に年も必要なら
"yyyy/MM/dd HH:mm"などとします。
```dataview
table
dateformat(file.mtime, "MM/dd HH:mm") AS "更新日時",
title
from "qiita-drafts"
where file.folder = "qiita-drafts" and title
sort file.mtime desc
limit 5
```
そうすると、以下のように最新ノートが 5 件表示されます。私の場合は、保管庫直下の README に各サブディレクトリの最新ノートを 5 件だけ表示し、各サブディレクトリにそこにある全ノートの目次を表示しています。
PDF の場合
特定のディレクトリについては Markdown ファイルでなく PDF の一覧を表示したい場合もあると思います (例. LaTeX 文書を作成しているディレクトリなど)。が、PDF では先と同じ方法では表示できません。より柔軟な dataviewjs ブロックを使う必要があります。
例えば、保管庫直下の tex-factory/ ディレクトリ直下にある PDF ファイルであって、更新日時が新しい 5 件を表示するには、dataviewjs ブロックに以下を書けば OK です。
```dataviewjs
const pdfs = app.vault.getFiles()
.filter(f => f.parent.path === 'tex-factory' && f.extension === 'pdf')
.sort((a, b) => b.stat.mtime - a.stat.mtime)
.slice(0, 5);
dv.table(
['更新日時', 'File'],
pdfs.map(f => [
moment(f.stat.mtime).format('MM/DD HH:mm'),
dv.fileLink(f.path)
])
);
```
ただし、JavaScript クエリを許可していない場合は、この時点で「Javascript クエリを許可してください」といったメッセージが表示されるので、以下から許可します。
そうすると、以下のように最新 PDF が 5 件表示されます。
おまけ: PDF の説明も表示する方法例
目次にファイル名を表示するだけでは、何のファイルかわかりにくいかもしれません。そのような場合、Markdown ファイルでは、フロントマターにメタデータを書いておき、Dataview で取得・表示できました。が、PDF ファイルにフロントマターは書けません。
一つの方法として、各 PDF ファイルの説明を書く Markdown ファイルを以下のように用意します。全ての PDF ファイルの説明を書く必要はなく、必要なものだけで構いません。
---
items:
- filename: ABC.pdf
description: ABCの説明
- filename: DEF.pdf
description: DEFの説明
---
そして dataviewjs ブロックを以下のようにすれば、ファイル名と説明の対応を読み込み、説明があれば表示するようにできます。
```dataviewjs
const descriptions = new Map(
dv.page('tex-factory/descriptions').items.map(
x => [x.filename, x.description]
)
);
const pdfs = app.vault.getFiles()
.filter(
f => f.parent.path === 'tex-factory'
&& f.extension === 'pdf'
&& f.name.startsWith('Draft')
)
.sort((a, b) => b.stat.mtime - a.stat.mtime)
.slice(0, 5);
dv.table(
['File', '更新日時', '説明'],
pdfs.map(f => [
dv.fileLink(f.path),
moment(f.stat.mtime).format('MM/DD HH:mm'),
descriptions.get(f.name) ?? ''
])
);
```


