![\cite 包含大量 citekeys](https://linux22.com/image/251543/%5Ccite%20%E5%8C%85%E5%90%AB%E5%A4%A7%E9%87%8F%20citekeys.png)
我的 latex 文档有一个 .sty 文件,我在其中创建了参考书目类别(见下文 [1])。我的文档中有以下几行,它起作用了:
\addtocategory{papers}{sushil}
但这样一来,我必须手动为大量文章添加 citekey。因此,有人建议我使用这个:
\AtEveryCitekey{%
\ifentrytype{article}{%
\iffieldundef{journaltitle}{%
\addtocategory{subpapers}{\thefield{entrykey}}%
}{%
\addtocategory{papers}{\thefield{entrykey}}%
}{%
}%
}
}
我猜想这是一样的,但会自动执行。但如果我不使用,这种情况就不会起作用,\cite{sushil}
这又让我想到了我必须手动为大量文章添加 citekeys 的同一点。我以为这可以工作,但我的文件中\nocite{*}
已经有了。\nocite{*}
.sty
有人知道如何解决这个问题吗?我不想手动添加那么多 citekey,因为这很耗时。
[1]
来自我的.sty文件:
% Bibliography categories
\def\makebibcategory#1#2{\DeclareBibliographyCategory{#1}\defbibheading{#1}{\section*{#2}}}
\makebibcategory{papers}{Refereed Research Papers}
\makebibcategory{subpapers}{Submitted Papers to Journals and arXiv}
\setlength{\bibitemsep}{2.65pt}
\setlength{\bibhang}{.8cm}
\renewcommand{\bibfont}{\small}
\renewcommand*{\bibitem}{\addtocounter{papers}{1}\item \mbox{}\hskip-0.85cm\hbox to 0.85cm{\hfill\arabic{papers}.~~}}
\defbibenvironment{bibliography}
{\list{}
{\setlength{\leftmargin}{\bibhang}%
\setlength{\itemsep}{\bibitemsep}%
\setlength{\parsep}{\bibparsep}}}
{\endlist}
{\bibitem}
\newenvironment{publications}{\section{\LARGE Publications}\label{papersstart}\vspace*{0.2cm}\small
\titlespacing{\section}{0pt}{1.5ex}{1ex}\itemsep=0.00cm
}{\label{papersend}\addtocounter{sumpapers}{-1}\refstepcounter{sumpapers}\label{sumpapers}}
\def\printbib#1{\printbibliography[category=#1,heading=#1]\lastref{sumpapers}}
答案1
确保您使用 biber 作为后端,然后您可以通过将其放入 biber.cfg 中来自动添加它,因为 biber 会读取您的 .bib 文件:
<sourcemap>
<maps datatype="bibtex">
<map final="true">
<per_type>ARTICLE</per_type>
<map_step map_field_source="JOURNAL/>
<map_step map_field_set="KEYWORDS" map_field_value="subpapers"/>
</map>
<map>
<per_type>ARTICLE</per_type>
<map_step map_field_set="KEYWORDS" map_field_value="subpapers"/>
</map>
</maps>
</sourcemap>
或者,如果您使用的是 biblatex 2.0 和 biber 1.0 betas,您也可以在序言中针对每个文档执行此操作:
\DeclareSourcemap{
\maps[datatype=bibtex]{
\map{
\pertype{article}
\step[fieldsource=journal, final=true]
\step[fieldset=keywords, fieldvalue={papers}]
}
\map{
\pertype{article}
\step[fieldset=keywords, fieldvalue={subpapers}]
}
}
}
\printbibliography[keyword=papers]
然后您可以简单地使用“等”来过滤关键字。
答案2
如果你愿意向 bib 文件添加一些额外的信息,你可以添加一个entrysubtype
带有 papers\subpapers 的字段。然后\nocite{*}
加上\printbibliography[subtype=papers]
或可能更容易\printbibliography[notsubtype=subpapers]
答案3
不,我有这个例子,我想以自动方式将 citekeys 添加到 \cite{} 命令中,而不是手动输入。因为我正在处理 bib 文件中的 500 多个条目,手动添加它们很困难。
\documentclass{article}
\usepackage[defernumbers=true]{biblatex}
\DeclareBibliographyCategory{articlepublished}
\DeclareBibliographyCategory{articleunpublished}
\AtEveryCitekey{%
\ifentrytype{article}{%
\iffieldundef{journaltitle}{%
\addtocategory{articleunpublished}{\thefield{entrykey}}%
}{%
\addtocategory{articlepublished}{\thefield{entrykey}}%
}%
}{%
}%
}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@article{AX12,
author = "Authors1",
title = "{Ttile of articles}",
collaboration = "Collaboration",
year = "2012",
}
@article{AY11,
author = "Authors2",
title = "{Ttile of articles}",
collaboration = "Collaboration",
year = "2011",
journal = "Phys.Lett.",
}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
\cite{AX12,AY11}
\printbibliography[category=articlepublished,title={Published Articles}]
\printbibliography[category=articleunpublished,title={Unpublished Articles}]
\end{document}