Many of the plugins locate in github.com, replace
github.com
withhub.nuaa.cf
to download them. OR go tto https://zotero-chinese.github.io/zotero-plugins/#/ to download plugins for zotero 7.
Automatically tags items with keywords and subject headings
Sync automatically
, Sync full-text context
, Disable File syncing.D:\Qsync\dosbin\Refs4Mu\Pdfs
Updation May lead to compatibility problems.
extension.zotero.automaticSnapshots
to false.app.update.auto
and app.update.enabled
to false.auth.fold + shortyear.default("0") + journal.abbr.upper.default(P)
, Automaatically pin citation key after 30 secondes
, Force citation keys to plain text
, keeping keys unique across all libraries
, postfixed for conflict keys
,add item to lib from aux scanner
.Add URLs to Bibtex export: no
, keep doi rather than url
, discard abstract, URL,month,langid,copyright,groups
, select Cite Keys
for quickcopy format, auto abbreviate journal titles
.keep updated
,abbreviated journal
Apply titel-casing to titles
, for this option will lead to wrong casing and wrong greek symbols. Also Uncheck Aplly case-protection to capitalized words by enclosing them with braces
. You can set the title-casing in zotero.D:\Qsync\dosbin\Refs4Mu\Pdfs
{%b}
, replace blanks
Always rename
& uncheck Ask user when attaching new files
; Only work with the following filetypes: pdf,doc,docx,txt,rtf,djvu,md,epub
Ctrl+/
Esc
Shift+Enter
/api https://api.chatanywhere.com.cn
/secretkey sk-xxxxxx
建议注册彩云小译或ChatGPT Anywhere.
如果安装了zotero-gpt,可以使用zotero-gpt的翻译功能,而不必安装Translate for Zotero。
Open web page based on DOI
OpenDOI
None
Script
Alt+d
OpenDOI
/// Open DOI by caesarmu
if (!item) {
return;
}const itemdoi = Zotero.Items.getTopLevel([item])[0].getField("DOI");
.launchURL(`https://www.doi.org/${itemdoi}`) Zotero
Copy Item link and show citation counts
Name: CopyLink
Event: None
Operation: Script
ShortCut: Alt+l
Menu: CopyLink
Data:
// Copy item link
// @author windingwind
// @link https://github.com/windingwind/zotero-actions-tags/discussions/115
// @usage Select an item in the library and press the assigned shortcut keys
// add citatin counts by ywmu
if (!item) {
return "[Copy Item Link] item is empty";
}
= Zotero.Items.getTopLevel([item])[0]
myitem const libraryType = myitem.library.libraryType;
const key = myitem.key;
let uri;
if (libraryType === "user") {
= "zotero://select/library/items/" + key;
uri else {
} const groupID = Zotero.Libraries.get(myitem.libraryID).groupID;
= "zotero://select/groups/" + groupID + "/items/" + key;
uri
}
const clipboard = new Zotero.ActionsTags.api.utils.ClipboardHelper();
let linkText;
// Use title
// linkText = item.getField("title");
// Use citation key
= myitem.getField("citationKey");
linkText = myitem.getField("DOI");
mydoi
let plainText;
// Use plain-text
= uri;
plainText // Use MarkDown
// plainURI = `[${linkText}](${uri})`
let mytags;
let mylabel;
= myitem.getTags();
mytag if(mytag.find(t => t.tag === "🚩")) {
="🚩";
mylabelelse if(mytag.find(t => t.tag === "⭐")){
} ="⭐"
mylabelelse {
} ="";
mylabel
}
clipboard.addText(plainText, "text/unicode")
.addText(`<a href="${uri}">${mylabel}\[@${linkText}\]</a>`, "text/html")
.copy();
= doi2field(mydoi,'is-referenced-by-count');
count
///// added by ywmu
function doi2field(doi,myfield) {
fetch('https://api.crossref.org/works/'+doi)
.then(res => res.json())
.then(data => {
// console.log('Output: ', data);
// console.log('status: ', data.status);
try {
= data.message[myfield];
count catch(e){
} = 0
count
}
}).catch(err => console.error(err));
return count;
}///// added by ywmu
return `[Item link] for ${linkText} (cited by ${count}) copied.`
P.S. Auto add tags based on titles
Name: Autotag
Event: New Item
Operation: Script
ShortCut: Alt+g
Menu: Autotag
Data:
// Auto-tag based on specific keywords in the title and abstract
// @author windingwind
// @link https://github.com/windingwind/zotero-actions-tags/discussions/119
// @usage Replace the `KEYWORDS_AND_TAGS` array with your own keywords and corresponding tags.
// @see https://github.com/windingwind/zotero-actions-tags/issues/77
// @see https://github.com/windingwind/zotero-actions-tags/issues/85
/**
* Add `/unread` tag to new items (support multi-device syncing)
* @author windingwind
* @usage See below
* @link https://github.com/windingwind/zotero-actions-tags/discussions/202
* @see https://github.com/windingwind/zotero-actions-tags/discussions/202
*/
// modified by caesarmu
if (!item) {
return "[Conditional Tag] item is empty";
}
const KEYWORDS_AND_TAGS = [
keyword: "superconductor", tag: "💫" },
{ keyword: "superconductivity", tag: "💫" },
{ keyword: "superconducting", tag: "💫" },
{ keyword: "kagome", tag: "💫" },
{ keyword: "growth", tag: "🧊" },
{ keyword: "negf", tag: "⚡" },
{ keyword: "device", tag: "⚡" },
{ keyword: "device", tag: "Device" },
{ keyword: "electrode", tag: "⚡" },
{ keyword: "electrode", tag: "Electrode" },
{ keyword: "junction", tag: "⚡" },
{ keyword: "junction", tag: "Junction" },
{ keyword: "rectifier", tag: "⚡" },
{ keyword: "rectifier", tag: "Rectifier" },
{ keyword: "rectifying", tag: "⚡" },
{ keyword: "rectifying", tag: "Rectifier" },
{ keyword: "rectification", tag: "Rectifier" },
{ keyword: "rectification", tag: "⚡" },
{ keyword: "sensor", tag: "⚡" },
{ keyword: "sensor", tag: "Sensor" },
{ keyword: "sensing", tag: "⚡" },
{ keyword: "sensing", tag: "Sensor" },
{ keyword: "transport", tag: "⚡" },
{ keyword: "Transistor", tag: "⚡" },
{ keyword: "Transistor", tag: "Transistor" },
{ keyword: "machine", tag: "💻" },
{ keyword: "thermoelectric", tag: "🌡️" },
{ keyword: "thermal", tag: "🌡️" },
{ keyword: "review", tag: "Review" },
{ keyword: "nanotube", tag: "_1D" },
{ keyword: "fullerene", tag: "_0D" },
{ keyword: "fullerene", tag: "_Carbon" },
{ keyword: "c60", tag: "_0D" },
{ keyword: "c60", tag: "_Carbon" },
{ keyword: "graphene", tag: "_2D" },
{ keyword: "graphene", tag: "_Carbon" },
{ keyword: "graphyne", tag: "_2D" },
{ keyword: "graphyne", tag: "_Carbon" },
{ keyword: "biphenylene", tag: "_2D" },
{ keyword: "biphenylene", tag: "_Carbon" },
{ keyword: "borophene", tag: "_2D" },
{ keyword: "borophene", tag: "_Boron" },
{ keyword: "monolayer", tag: "_2D" },
{ keyword: "bilayer", tag: "_2D" },
{ keyword: "cluster", tag: "_0D" },
{ keyword: "cage", tag: "_0D" },
{ keyword: "superatom", tag: "_0D" },
{ keyword: "synthesis", tag: "_Synthesis" },
{ keyword: "hetero", tag: "Hetero" },
{ keyword: "two-dimensional", tag: "_2D" },
{ keyword: "2d", tag: "_2D" },
{ keyword: "one-dimensional", tag: "_1D" },
{ keyword: "1d", tag: "_1D" },
{ keyword: "reduction", tag: "Reduction" },
{ // You can add more keyword-tag pairs as needed
;
]
const title = item.getField("title").toLowerCase();
const abstract = item.getField("abstract").toLowerCase();
let itemkey;
= item.getField("citationKey");
itemkey let tagged = false;
var itemTags = item.getTags();
if (itemTags.length < 1 ) {
.addTag("💭", 1);
item
}
let alltag = "";
for (const pair of KEYWORDS_AND_TAGS) {
const { keyword, tag } = pair;
if (title.includes(keyword) || (abstract && abstract.includes(keyword))) {
.addTag(tag, 1);
item= true;
tagged if(alltag.length === 0){
= `${tag}`
alltag else {
} = `${alltag}/${tag}`
alltag
}
}
}
if (tagged) {
return `Tags \(${alltag}\) added to ${itemkey}.`;
else {
} return `No tag added to ${itemkey}.`;
}
Add another two setting:
P.S. Preview for Item
Name: PreviewItem
Event: None
Operation: Script
ShortCut: Alt+p
Menu: PreviewItem
Data:
// Creat preview for the Item
// @author caesarmu
if (!item) {
return "[Preview] item is empty";
}= Zotero.Items.getTopLevel([item])[0]
myitem const libraryType = myitem.library.libraryType;
const key = myitem.key;
const clipboard = new Zotero.ActionsTags.api.utils.ClipboardHelper();
let itemtitle;
= myitem.getField("title");
itemtitle let itemcreator;
= myitem.getCreator(0).lastName;
itemcreator let itemjournal;
= myitem.getField("journalAbbreviation");
itemjournal let itemyear;
= myitem.getField("date").split("-",1);
itemyear let itemvol;
= myitem.getField("volume");
itemvol let itempage;
= myitem.getField("pages");
itempage // Use citation key
let itemkey;
= myitem.getField("citationKey");
itemkey
clipboard.addText(`${itemcreator} et al. ${itemtitle}. ${itemjournal} ${itemyear}, ${itemvol}, ${itempage}.`, "text/unicode")
.copy();
return `[Item Preview] for ${itemkey} copied.`
P.S. Copy Notes for Items, You’d better use Typora Markdown editor
CopyNote
None
Script
Ctrl+Alt+n
CopyNote
// Copy Note for sevetal items
// @author caesarmu
const Zotero = require("Zotero");
if (items?.length === 0 || item) {
return;
}const clipboard = new Zotero.ActionsTags.api.utils.ClipboardHelper();
const zitems = items.filter(_item => _item.isRegularItem());
if (zitems.length < 1) {
return "Must select 1 or more items";
}
let notestr = "";
var notenum = 0;
for (let zitem of zitems) {
let myitem = Zotero.Items.getTopLevel([zitem])[0];
let mykey = myitem.key;
let myuri = "zotero://select/library/items/" + mykey;
let mytitle = myitem.getField("title");
let mybibkey = myitem.getField("citationKey");
let noteID = myitem.getNotes()[0];
let mytags;
let mylabel;
= myitem.getTags();
mytag if(mytag.find(t => t.tag === "🚩")) {
="🚩";
mylabelelse if(mytag.find(t => t.tag === "⭐")){
} ="⭐"
mylabelelse {
} ="";
mylabel
}if ( noteID > 1){
let noteHtml = Zotero.Items.get(noteID).getNote().replace(/<\/div>/g, '').replace(/<div[^>]+>/g, '').replace(/<span[^>]+>/g, '');
= noteHtml.replace(/<p>/g, '').replace(/<\/span>/g, '').replace(/<\/p>/g, '').replace(/<br>/g, '').replace(/[\r\n]/gm, '')
noteHtml = noteHtml.replace(/<img alt=\"\" data-attachment-key=\"/gm,'\n!\[\[@'+mybibkey+'\]\]\(C:\\Users\\Caesar\\Zotero\\storage\\').replace(/\" width=\"[^>]+>/gm, '\\image.png\)')
noteHtml // To use right path for zotero storage, maybe %USERPROFILE%\Zotero\storage
= `${notestr}\n* \[${mylabel}\[@${mybibkey}\]\(${myuri} "${mytitle}"\)\] ${noteHtml}`
notestr = notenum + 1;
notenum
}
}
clipboard.addText(`${notestr}`, "text/unicode")
.copy();
return `Notes for ${notenum} items copied.`;
P.S. Translate abstract and add it to Note
P.S. plugin Translate for Zotero needed.
Abs2Note
None
Script
Alt+a
Abs2Note
// Add Translated item abstract to Note
// @author caearmu
const Zotero = require("Zotero");
if (!Zotero.PDFTranslate) {
return "[Translate Abstract] Translate for Zotero is not installed or disabled.";
}if (!item) {
return "[Translate Abstract] Target item is empty";
}
let mydoi;
= item.getField("DOI");
mydoi // Use citation key
let itemkey ;
= item.getField("citationKey");
itemkey
let abstract = item.getField("abstractNote");
if (abstract) {
= doi2field(mydoi,'abstract');
abstract
}if (abstract.length < 2) {
return `No abstract found for ${itemkey}!`
}
///// added by ywmu
function doi2field(doi,myfield) {
fetch('https://api.crossref.org/works/'+doi)
.then(res => res.json())
.then(data => {
// console.log('Output: ', data);
// console.log('status: ', data.status);
= data.message[myfield];
count
}).catch(err => console.error(err));
return count;
}///// added by ywmu
let abstractResult = "";
if (abstract) {
let myabstract = abstract.replace(/<[^>]+>/g, '');
= (await Zotero.PDFTranslate.api.translate(myabstract)).result;
abstractResult
} if (abstractResult) {
const parentItem = Zotero.Items.getTopLevel([item])[0];
const noteItem = new Zotero.Item("note");
.libraryID = parentItem.libraryID;
noteItem.parentID = parentItem.id;
noteItem//noteItem.addTag("auto", 0);
.setNote(abstractResult);
noteItemawait noteItem.saveTx();
.setField('abstractNote','');
item
}
return `Translated Abstract for ${itemkey} added to Note!`;
annotations.noteTemplates
, set extensions.zotero.annotations.noteTemplates.highlight
to <p>{{highlight quotes='false'}}</p>
(Original: <p>{{highlight}} {{citation}} {{comment}}</p>
)D:\Refs4Mu\Pdfs
, move it to D:\Refs4Mu\Pdfs2
D:\Refs4Mu\Pdfs2
, restart Jabref.jab.bib
).pdf:
with .pdf:D\:\\Refs4Mu\\Pdfs2\\
, and then replace :D\:\\Refs4Mu\\Pdfs2\\application
with :application
.Zotero support MS office,Libreoffice and Onlyoffice, however it does not support WPS office free personal version, which does not has VBA. However, the security of the VBA from the internet is unsure.
C:\Users\xxxxxx\AppData\Local\Kingsoft\WPS Office\yyyyyy\office6\mui
of WPS free personal version to another place.mui
with the mui
from WPS free personal version.P.S. It works for WPS International version before
11.2.0.11191
.
Solve (From https://zhuanlan.zhihu.com/p/579975093):
文件
⇒加密
⇒属性
⇒自定义
, Add ZOTERO_PREF_1
and ZOTERO_PREF_2
with values of 1
. It will not work if adding them to Normal.domt
.Refs | Zotero | Mendeley | Jabref |
---|---|---|---|
Mian Language | Javascript | QT | Java |
Extension | Several | No | No |
Sync | Zotero (100 MB)/WebDav, fast, Zotfile (Extension) + cloud drive needed for Attachments | Mendeley (2 GB), slow, maybe fail | No, but cloud drive like dropbox can be used |
Data File | SQLITE, very robust | SQLITE, very robust | bib (like txt), very robust |
BIB | Better Bibtex (Extension) | Inherent | Inherent |
Bibtex Key | Customizable by Better Bibtex | Not Customizable | Customizable |
File Rename | Customizable by Zotfile | Customizable but limited | Customizable |
Direcory Watch | Yes | Yes | No |
Import item from browser | Zotero Connector | Mendeley Web Importer | JabRef Browser Extension, broken sometimes |
Fetch metadata | By DOI/pubmed…, accurate | Not accurate | By DOI/pubmed…, accurate |
Fetch DOI | Zotero DOI magnager (Extension) | Inherent | Inherent |
Shortcuts Customization | Zutilo (Extension) | Not Customizable | Customizable |
Metadata Update | Zotero format Metadata (Extension) | Yes | Yes |
Pdf Preview | Inherent | Inherent | External |
Item Preview | Zotero Preview(Extension) Inherent | Inherent | Inherent |
Fulltext Download | Yes | Yes | Yes, but fail more often |
Integration with Word | MS Word/Libre Word | MS Word | Libre Word, bibtex4word needed for MS word |
Group Share | Yes | Yes | No |
Times Cited | Scite (Extension) | None | None |
Group or Tag | Tag | Tag | Multi-Level groups, not as convenient as tags |
Mobile | No | Yes | No |
Drawback | No Portable version, some bugs in Better bibtex occasionally, some character via Better Bibtex not wright (e.g., in title), Plugins may be not compatible with new version of Zotero | Web Importer import PDF to online library, but the storage is limited, Not Customizable Bibtex Key (bibtexkey with space, not recognized by pandoc), limited Customizable File name, new version is rabbish. | large memory needed, and sometimes stuck when search, Good performance never expected for this java based app, Portable very convenient |
Visit https://kill-the-newsletter.com/,Enter MyRSS
, and create inbox
. You will get an email and a RSS address, like XXXXXXXXXXXX@kill-the-newsletter.com
and https://kill-the-newsletter.com/feeds/XXXXXXXXXXXX.xml.
Register on https://www.storkapp.me/ with your email like xxxxx@qq.com
.
Forward your email from storkapp.me
to XXXXXXXXXXXX@kill-the-newsletter.com
.
Google Scholar
to XXXXXXXXXXXX@kill-the-newsletter.com
.Web of Science
to XXXXXXXXXXXX@kill-the-newsletter.com
.Registrate on https://werss.app/, buy one-year service (65 RMB for 16 feeds), convert WeChat public accounts to RSS.
Registrate on https://www.innoreader.com/
Add the RSS URLs to feeds.
Open https://reabble.cn/app#/, login with innoreader account.