<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>ZoteroonDocs</title><link>https://hiraethecho.github.io/docs/tags/zotero/</link><description>Recent contentinZoteroonDocs</description><generator>Hugo --0.152.2</generator><language>en</language><managingEditor>wyz2016zxc@outlook.com(Hiraeth)</managingEditor><webMaster>wyz2016zxc@outlook.com(Hiraeth)</webMaster><lastBuildDate>Mon, 16 Mar 2026 15:39:39 +0800</lastBuildDate><atom:link href="https://hiraethecho.github.io/docs/tags/zotero/index.xml" rel="self" type="application/rss+xml"/><item><title>用mkdocs、obsidian、zotero搭建在线文献学习笔记</title><link>https://hiraethecho.github.io/docs/dev/3in1wiki/</link><pubDate>Tue, 15 Oct 2024 00:00:00 +0000</pubDate><author>wyz2016zxc@outlook.com(Hiraeth)</author><guid>https://hiraethecho.github.io/docs/dev/3in1wiki/</guid><description>&lt;h1 id="使用mkdocsobsidianzotero搭建在线文献学习笔记"&gt;
&lt;a class="anchor inpage" href="#%e4%bd%bf%e7%94%a8mkdocsobsidianzotero%e6%90%ad%e5%bb%ba%e5%9c%a8%e7%ba%bf%e6%96%87%e7%8c%ae%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0"&gt;#&lt;/a&gt;使用mkdocs、obsidian、zotero搭建在线文献学习笔记&lt;/h1&gt;
&lt;p&gt;工作流是，在zotero中阅读和标记。用zotero-better-notes插件把标记变成文本格式，并且导出到obsidian的库文件中，进一步编辑（或者用nvim编辑）。在obsidian中更方便笔记链接跳转，zotero只是文献管理和阅读。然后把笔记同步到mkdocs的git仓库（实际上是把mkdocs的文件夹软链接到obsidian库），用github pages搭建在线wiki。&lt;/p&gt;</description><content:encoded><![CDATA[<h1 id="使用mkdocsobsidianzotero搭建在线文献学习笔记">
  <a class="anchor inpage" href="#%e4%bd%bf%e7%94%a8mkdocsobsidianzotero%e6%90%ad%e5%bb%ba%e5%9c%a8%e7%ba%bf%e6%96%87%e7%8c%ae%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0">#</a>使用mkdocs、obsidian、zotero搭建在线文献学习笔记</h1>
<p>工作流是，在zotero中阅读和标记。用zotero-better-notes插件把标记变成文本格式，并且导出到obsidian的库文件中，进一步编辑（或者用nvim编辑）。在obsidian中更方便笔记链接跳转，zotero只是文献管理和阅读。然后把笔记同步到mkdocs的git仓库（实际上是把mkdocs的文件夹软链接到obsidian库），用github pages搭建在线wiki。</p>
<h2 id="设置">
  <a class="anchor inpage" href="#%e8%ae%be%e7%bd%ae">##</a>设置</h2>
<h3 id="zotero">
  <a class="anchor inpage" href="#zotero">###</a>Zotero</h3>
<p>关键是<code>zotero-better-note</code>插件的
：从注释创建笔记；将笔记插入到其他笔记；将笔记导出为markdown。</p>
<blockquote class="alert alert-important">
      <p class="alert-heading">IMPORTANT</p><p>导出路径和模板中链接路径有硬编码部分，需要根据具体情况手动修改。</p></blockquote><h3 id="obsidian">
  <a class="anchor inpage" href="#obsidian">###</a>obsidian</h3>
<p>需要在设置中选择使用<code>markdown</code>风格链接而不是<code>wiki</code>风格。根目录<code>/</code>是obsidian的库文件夹。</p>
<h3 id="mkdocs">
  <a class="anchor inpage" href="#mkdocs">###</a>mkdocs</h3>
<p>基本上就是直接使用模板。</p>
<h2 id="路径匹配">
  <a class="anchor inpage" href="#%e8%b7%af%e5%be%84%e5%8c%b9%e9%85%8d">##</a>路径匹配</h2>
<p>主要需要注意的，是文件名和链接格式，即<code>[markdown格式的链接](这里应该写什么路径)</code>，使得zotero、obsidian、在线网页的跳转都正常。实际上有两个跳转，一个是到md文件的跳转，另一个是到pdf的跳转。前者是obsidian或网页内的跳转，相对简单；后者是跳转到zotero中的pdf，这个实际上只有我能用，因为涉及到zotero的数据库。有多种选择：</p>
<h3 id="docs文件夹作为obsidian仓库">
  <a class="anchor inpage" href="#docs%e6%96%87%e4%bb%b6%e5%a4%b9%e4%bd%9c%e4%b8%baobsidian%e4%bb%93%e5%ba%93">###</a><code>docs</code>文件夹作为obsidian仓库</h3>
<p>创建仓库<code>username.github.io</code>（必须是这个格式），在线网页会是<code>https://&lt;username&gt;.github.io</code>，那么链接应该写成<code>[title](/filename)</code>，在网页端是<code>https://&lt;username&gt;.github.io/filename</code>。把<code>docs/</code>文件夹作为obsidian repo，用<code>.gitignore</code>忽略掉<code>docs/.obsidian</code>。</p>
<p>优点是简单，缺点文件直接在obsidian的根目录，不好管理其他内容了。</p>
<h3 id="docs文件夹作为obsidian仓库子文件夹">
  <a class="anchor inpage" href="#docs%e6%96%87%e4%bb%b6%e5%a4%b9%e4%bd%9c%e4%b8%baobsidian%e4%bb%93%e5%ba%93%e5%ad%90%e6%96%87%e4%bb%b6%e5%a4%b9">###</a><code>docs</code>文件夹作为obsidian仓库子文件夹</h3>
<p>使用二级域名的github pages，即创建仓库（例如<code>wiki</code>），在线网页会是<code>https://&lt;username&gt;.github.io/wiki</code>，那么链接应该写成<code>[title](/wiki/filename)</code>，在网页端是<code>https://&lt;username&gt;.github.io/wiki/filename</code></p>
<p>把<code>docs</code>变成obsidian的子文件夹，可以用软链接：</p>
<details open>
    <summary>sh</summary><pre
        class="chroma codeblock"
      ><code class="language-sh" data-lang="sh"
          ><span style="display:flex;"><span>ln -s /path/to/git/repo/docs /path/to/obsidian/repo/wiki</span></span></code
        ><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><p>或者用
</p>
<h2 id="总结">
  <a class="anchor inpage" href="#%e6%80%bb%e7%bb%93">##</a>总结</h2>
<blockquote class="alert alert-note">
      <p class="alert-heading">NOTE</p><p>似乎需要一个markdown和latex转换的脚本。其中markdown应该混写html比较好。似乎lua就可以，那么就可以做nvim插件。<br>
2025-05-21: 似乎latex转markdown+html比较好，用<code>&lt;ul&gt;</code> <code>&lt;ol&gt;</code> <code>&lt;detail&gt;</code>标签来处理latex环境<code>itemize</code> <code>enumerate</code> <code>Theorem</code></p></blockquote>]]></content:encoded></item><item><title>zotero</title><link>https://hiraethecho.github.io/docs/software/zotero/</link><pubDate>Mon, 13 Nov 2023 00:00:00 +0000</pubDate><author>wyz2016zxc@outlook.com(Hiraeth)</author><guid>https://hiraethecho.github.io/docs/software/zotero/</guid><description>&lt;h1 id="zotero"&gt;
&lt;a class="anchor inpage" href="#zotero"&gt;#&lt;/a&gt;Zotero&lt;/h1&gt;
&lt;h2 id="install-and-basic-setting"&gt;
&lt;a class="anchor inpage" href="#install-and-basic-setting"&gt;##&lt;/a&gt;Install and basic setting&lt;/h2&gt;
&lt;h2 id="plugins"&gt;
&lt;a class="anchor inpage" href="#plugins"&gt;##&lt;/a&gt;Plugins&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;zotero 7:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;常用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Zotero attanger&lt;/li&gt;
&lt;li&gt;Del item with Attachment&lt;/li&gt;
&lt;li&gt;Ethereal Reference&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;好用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;zotero better notes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;没必要但可以：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ethereal Style&lt;/li&gt;
&lt;li&gt;Attachment Scanner&lt;/li&gt;
&lt;li&gt;arXiv Workflow for zotero&lt;/li&gt;
&lt;li&gt;Zoplicate&lt;/li&gt;
&lt;li&gt;Linter for zotero&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="sync"&gt;
&lt;a class="anchor inpage" href="#sync"&gt;##&lt;/a&gt;Sync&lt;/h2&gt;
&lt;p&gt;using &lt;del&gt;zotmoov&lt;/del&gt; attanger to move files&lt;/p&gt;
&lt;p&gt;zotero 7 to rename:&lt;/p&gt;
&lt;details open&gt;
&lt;summary&gt;TEXT&lt;/summary&gt;&lt;pre
class="codeblock"
&gt;&lt;code class="language-" data-lang=""&gt;{{ title case=&amp;#34;snake&amp;#34; }}{{ creators case=&amp;#34;snake&amp;#34; prefix=&amp;#34;_&amp;#34; max=&amp;#34;1&amp;#34;}}{{ year prefix=&amp;#34;_&amp;#34; }}&lt;/code&gt;&lt;button onclick="copyCode(this)" class="copybtn"&gt;copy&lt;/button&gt;&lt;/pre&gt;&lt;/details&gt;
&lt;script&gt;
function copyCode(btn) {
const code = btn.previousElementSibling.textContent.trim();
navigator.clipboard.writeText(code).then(() =&gt; {
btn.innerText = "copied";
setTimeout(() =&gt; (btn.innerText = "copy"), 2000);
});
}
&lt;/script&gt;&lt;p&gt;use any cloud drive to sync. I&amp;rsquo;m using koofr.&lt;/p&gt;</description><content:encoded><![CDATA[<h1 id="zotero">
  <a class="anchor inpage" href="#zotero">#</a>Zotero</h1>
<h2 id="install-and-basic-setting">
  <a class="anchor inpage" href="#install-and-basic-setting">##</a>Install and basic setting</h2>
<h2 id="plugins">
  <a class="anchor inpage" href="#plugins">##</a>Plugins</h2>
<p><strong>zotero 7:</strong></p>
<p>常用：</p>
<ul>
<li>Zotero attanger</li>
<li>Del item with Attachment</li>
<li>Ethereal Reference</li>
</ul>
<p>好用：</p>
<ul>
<li>zotero better notes</li>
</ul>
<p>没必要但可以：</p>
<ul>
<li>Ethereal Style</li>
<li>Attachment Scanner</li>
<li>arXiv Workflow for zotero</li>
<li>Zoplicate</li>
<li>Linter for zotero</li>
</ul>
<h2 id="sync">
  <a class="anchor inpage" href="#sync">##</a>Sync</h2>
<p>using <del>zotmoov</del> attanger to move files</p>
<p>zotero 7 to rename:</p>
<details open>
    <summary>TEXT</summary><pre
        class="codeblock"
      ><code class="language-" data-lang="">{{ title case=&#34;snake&#34; }}{{ creators case=&#34;snake&#34; prefix=&#34;_&#34; max=&#34;1&#34;}}{{ year prefix=&#34;_&#34; }}</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><p>use any cloud drive to sync. I&rsquo;m using koofr.</p>
<h2 id="zotero-better-notes">
  <a class="anchor inpage" href="#zotero-better-notes">##</a>zotero better notes</h2>
<p>用来
</p>
<p><strong>templates:</strong> you can copy these:</p>
<details open>
    <summary>quickinsert</summary><pre
        class="codeblock"
      ><code class="language-quickinsert" data-lang="quickinsert"># This template is specifically for importing/sharing, using better
# notes &#39;import from clipboard&#39;: copy the content and
# goto Zotero menu bar, click Tools-&gt;New Template from Clipboard.
# Do not copy-paste this to better notes template editor directly.
name: &#34;[QuickInsertV2]&#34;
zoteroVersion: &#34;7.0.9.SOURCE.fadbf3d2d&#34;
pluginVersion: &#34;2.0.18&#34;
savedAt: &#34;2024-11-07T07:59:45.835Z&#34;
content: |-
  // @use-markdown
  &lt;a href=&#34;${link}&#34;&gt;${linkText}&lt;/a&gt; [md](/wiki/math/zotero/${subNoteItem.getNoteTitle ? subNoteItem.getNoteTitle().replace(/[/\\?%*:|&#34;&lt;&gt; ]/g, &#34;-&#34;) &#43; &#34;-&#34;:&#34;&#34;}${subNoteItem.key})</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><details open>
    <summary>quickimport</summary><pre
        class="codeblock"
      ><code class="language-quickimport" data-lang="quickimport"># This template is specifically for importing/sharing, using better
# notes &#39;import from clipboard&#39;: copy the content and
# goto Zotero menu bar, click Tools-&gt;New Template from Clipboard.
# Do not copy-paste this to better notes template editor directly.
name: &#34;[QuickImportV2]&#34;
zoteroVersion: &#34;7.0.9.SOURCE.fadbf3d2d&#34;
pluginVersion: &#34;2.0.18&#34;
savedAt: &#34;2024-11-07T05:54:37.696Z&#34;
content: |-
  &lt;blockquote&gt;
  ${{
    return await Zotero.BetterNotes.api.convert.link2html(link, {noteItem, dryRun: _env.dryRun});
  }}$
  &lt;/blockquote&gt;</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><details open>
    <summary>quicknote</summary><pre
        class="codeblock"
      ><code class="language-quicknote" data-lang="quicknote"># This template is specifically for importing/sharing, using better
# notes &#39;import from clipboard&#39;: copy the content and
# goto Zotero menu bar, click Tools-&gt;New Template from Clipboard.
# Do not copy-paste this to better notes template editor directly.
name: &#34;[QuickNoteV5]&#34;
zoteroVersion: &#34;7.0.9.SOURCE.fadbf3d2d&#34;
pluginVersion: &#34;2.0.18&#34;
savedAt: &#34;2024-11-07T05:54:55.255Z&#34;
content: |-
  ${{
    let res = &#34;&#34;;
    if (annotationItem.annotationComment) {
      res &#43;= await Zotero.BetterNotes.api.convert.md2html(
        annotationItem.annotationComment
      );
    } else {
  	res &#43;= &#34;No comment&#34;;
    }
    return res;
  }}$

  // @use-markdown
  ***
  ${{
  	let res = &#34;&#34;;
    res &#43;= await Zotero.BetterNotes.api.convert.annotations2html([annotationItem], {noteItem, ignoreComment: true});
    return res;
  }}$</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><details open>
    <summary>exportmdfilename</summary><pre
        class="codeblock"
      ><code class="language-exportmdfilename" data-lang="exportmdfilename"># This template is specifically for importing/sharing, using better
# notes &#39;import from clipboard&#39;: copy the content and
# goto Zotero menu bar, click Tools-&gt;New Template from Clipboard.
# Do not copy-paste this to better notes template editor directly.
name: &#34;[ExportMDFileNameV2]&#34;
zoteroVersion: &#34;7.0.9.SOURCE.fadbf3d2d&#34;
pluginVersion: &#34;2.0.18&#34;
savedAt: &#34;2024-11-07T05:55:24.890Z&#34;
content: |-
  ${(noteItem.getNoteTitle ? noteItem.getNoteTitle().replace(/[/\\?%*:|&#34;&lt;&gt; ]/g, &#34;-&#34;) &#43; &#34;-&#34; : &#34;&#34;)}${noteItem.key}.md</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><details open>
    <summary>exportmdfileheader</summary><pre
        class="codeblock"
      ><code class="language-exportmdfileheader" data-lang="exportmdfileheader"># This template is specifically for importing/sharing, using better
# notes &#39;import from clipboard&#39;: copy the content and
# goto Zotero menu bar, click Tools-&gt;New Template from Clipboard.
# Do not copy-paste this to better notes template editor directly.
name: &#34;[ExportMDFileHeaderV2]&#34;
zoteroVersion: &#34;7.0.9.SOURCE.fadbf3d2d&#34;
pluginVersion: &#34;2.0.18&#34;
savedAt: &#34;2024-11-07T05:55:34.047Z&#34;
content: |-
  ${{
    let header = {};
    header.tags = noteItem.getTags().map((_t) =&gt; _t.tag);
    header.parent = noteItem.parentItem
      ? noteItem.parentItem.getField(&#34;title&#34;)
      : &#34;&#34;;
    header.collections = (
      await Zotero.Collections.getCollectionsContainingItems([
        (noteItem.parentItem || noteItem).id,
      ])
    ).map((c) =&gt; c.name);
    return JSON.stringify(header);
  }}$</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><details open>
    <summary>exportmdfilecontent</summary><pre
        class="codeblock"
      ><code class="language-exportmdfilecontent" data-lang="exportmdfilecontent"># This template is specifically for importing/sharing, using better
# notes &#39;import from clipboard&#39;: copy the content and
# goto Zotero menu bar, click Tools-&gt;New Template from Clipboard.
# Do not copy-paste this to better notes template editor directly.
name: &#34;[ExportMDFileContent]&#34;
zoteroVersion: &#34;7.0.9.SOURCE.fadbf3d2d&#34;
pluginVersion: &#34;2.0.18&#34;
savedAt: &#34;2024-11-07T05:56:22.434Z&#34;
content: |-
  ${{
    let start = mdContent;
    let rmspan = start.replace(/&lt;\/?span.*?&gt;/g,&#39;&#39;);
    let pdflink = rmspan.replace(/(&lt;a .*?open.*?&gt;)“(.*?)”/g,&#39;$2 $1(pdf)&lt;/a&gt;&#39;);
    let dir2zotero = pdflink.replace(/&lt;a href.*?zhref=&#34;(.*?)&#34; ztype.*?&gt;/g,&#39;&lt;a href=&#34;$1&#34;&gt;&#39;);
    return dir2zotero;
  }}$</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><p>annotation will be exported as</p>
<details open>
    <summary>TEXT</summary><pre
        class="codeblock"
      ><code class="language-" data-lang="">&lt;span class=&#34;highlight&#34; data-annotation=&#34;&lt;data-annotation&gt;&#34; ztype=&#34;zhighlight&#34;&gt;&lt;a href=&#34;zotero://open/library/items/G4BKVA2X?page=2&amp;#x26;annotation=LZLEYYRJ&#34;&gt;“&lt;content&gt;”&lt;/a&gt;&lt;/span&gt; &lt;span class=&#34;citation&#34; data-citation=&#34;&lt;citation&gt;&#34; ztype=&#34;zcitation&#34;&gt;(&lt;span class=&#34;citation-item&#34;&gt;&lt;a href=&#34;zotero://select/library/items/GLXUZZJT&#34;&gt;&lt;/a&gt;&lt;/span&gt;)&lt;/span&gt;</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><p>the color of annotation is coded as <code>%23&lt;rgb&gt;</code> in <code>&lt;data-annotation&gt;</code>, for
example blue (#2ea8e5) annotation is <code>%232ea8e5</code></p>
]]></content:encoded></item></channel></rss>