Biblatex: Dvě bibliografie s různými styly a řazení

MWE pro problém, se kterým jsem se setkal:

\documentclass{article} \usepackage{filecontents} \begin{filecontents}{biblatextest1.bib} @BOOK{BookA03, author = {Author Aaa}, title = {Some Title}, publisher = {Some Publisher}, year = 2003 } @BOOK{BookB02, author = {Author Bbb}, title = {Some Title}, publisher = {Some Publisher}, year = 2002 } \end{filecontents} \begin{filecontents}{biblatextest2.bib} @MISC{LinkC04, author = {Author Ccc}, title = {Some Title}, year = 2004, url = www.test1.com/bild.jpg, } @MISC{LinkD01, author = {Author Ddd}, title = {Some Title}, year = 2001, url = www.test2.com/bild.jpg } \end{filecontents} \usepackage[backend = biber, defernumbers = true, style = alphabetic]{biblatex} \addbibresource{biblatextest1.bib} \addbibresource{biblatextest2.bib} %Append keywords to identify different bibliography entries. \DeclareSourcemap{ \maps[datatype=bibtex, overwrite]{ \map{ \perdatasource{biblatextest1.bib} \step[fieldset=KEYWORDS, fieldvalue=primary, append] } \map{ \perdatasource{biblatextest2.bib} \step[fieldset=KEYWORDS, fieldvalue=secondary, append] } } } %Declare new sorting scheme for refernence bibliography. \DeclareSortingScheme{appearance}{ \sort{\citeorder} } %Copied from numeric.cbx to imitate numerical citations. \providebool{bbx:subentry} \newbibmacro*{citenum}{%Note: the original macro was called "cite". I did not redefine "cite", but instead defined a new macro "citenum", because the author-year citations use the "cite" macro too. "\renewbibmacro*{cite}" would have caused all the author-year citations to become numeric too. \printtext[bibhyperref]{%If you ever want to use hyperref \printfield{prefixnumber}% \printfield{labelnumber}% \ifbool{bbx:subentry} {\printfield{entrysetcount}} {}}} %Copied from numeric.cbx to define a new numeric citation command for @online entries. \DeclareCiteCommand{\cnume}[\mkbibbrackets] {\usebibmacro{prenote}} {\usebibmacro{citeindex}% \usebibmacro{citenum}}%Note: this was originally "cite" but I changed it to "citenum" to avoid clashes with the author-year style. {\multicitedelim} {\usebibmacro{postnote}} \begin{document} The first two citations \cnume{LinkD01} and \cite{BookB02}. The others are \cnume{LinkC04} and \cite{BookA03}. \printbibliography[title=Bibliography, keyword=primary] %Redefine the bibliography environment to imitate the numeric citation style \defbibenvironment{bibliographyNUM} {\list {\printfield[labelnumberwidth]{labelnumber}} {\setlength{\labelwidth}{\labelnumberwidth}% \setlength{\leftmargin}{\labelwidth}% \setlength{\labelsep}{\biblabelsep}% \addtolength{\labelsep}{1em} \addtolength{\leftmargin}{\labelsep}% \setlength{\itemsep}{\bibitemsep}% \setlength{\parsep}{\bibparsep}}% \renewcommand*{\makelabel}[1]{\hss##1}} {\endlist} {\item} \DeclareFieldFormat{labelnumberwidth}{\mkbibbrackets{#1}\hspace{-1.1em}} \newrefcontext[sorting=none] \printbibliography[env=bibliographyNUM,title=References, keyword=secondary, resetnumbers] \end{document} 

Problém: Potřebuji dvě bibliografie, první s abecedním stylem a seřazené podle jména autora. Druhý v číselném stylu seřazený podle pořadí citací. Oba nemají společné odkazy. Něco takového v biblatexu hledám:

\bibliographystyle{style = alphabetic} \printbibliography{books.bib} \bibliographystyle{style = numerical, sorting = none} \printbibliography{links.bib} 

Myslel jsem, že biblatex je speciálně napsán pro práci s více bibliografiemi, ale nenašel jsem žádné jiným způsobem, než který je uveden na MWE (což je zjevně hack). Ve skutečnosti to funguje docela dobře, dokud nechci další třídění. Když použiji

\newrefcontext[sorting=none] 

Čísla citací se změní na nulu.

Komentáře

  • biblatex je napsáno tak, aby podporovalo rozdělené / více bibliografií (kromě mnoha dalších funkcí), ale ‚ oficiální podpora kombinující různou bibliografii styly v jednom dokumentu.

Odpovědět

Pokud předáte možnost labelnumber to biblatex můžete používat číselné citace iu style=alphabetic.

Příkaz cite lze přepínat na základě klíčová slova, takže můžete použít \cite pro všechny položky bez ohledu na keyword.

Pro číselnou bibliografii budeme mít definovat nové prostředí bibliografie, které tiskne číselné citace. bibliographyNUM je přímo zkopírován z numeric.bbx. Chcete-li nastavit řazení bibliografie, stačí říci

\newrefcontext[sorting=none] \printbibliography[env=bibliographyNUM, title=References, keyword=secondary, resetnumbers] 

před číselnou bibliografií. Předchozí bibliografie bude používat globální schéma třídění anyt, které je vhodné pro bibliografii ve stylu alfa. V případě, že je nutné zachovat přiřazení schématu třídění lokálně (protože numerická bibliografie přichází před alfa bibliografií), použijete

\begin{refcontext}[sorting=none] \printbibliography[env=bibliographyNUM, title=References, keyword=secondary, resetnumbers] \end{refcontext} 

MWE

\documentclass{article} \usepackage[style=alphabetic, labelnumber, defernumbers=true, backend=biber]{biblatex} \usepackage{hyperref} % Append keywords to identify different bibliography entries. % appendstrict only appends if the field is nonempty, % we use that to add a comma to avoid mushing together two keywords \DeclareSourcemap{ \maps[datatype=bibtex, overwrite]{ \map{ \perdatasource{biblatextest1.bib} \step[fieldset=KEYWORDS, fieldvalue={, }, appendstrict] \step[fieldset=KEYWORDS, fieldvalue=primary, append] } \map{ \perdatasource{biblatextest2.bib} \step[fieldset=KEYWORDS, fieldvalue={, }, appendstrict] \step[fieldset=KEYWORDS, fieldvalue=secondary, append] } } } \DeclareFieldFormat{labelnumberwidth}{\mkbibbrackets{#1}} \renewbibmacro*{cite}{% \printtext[bibhyperref]{% \printfield{labelprefix}% \ifkeyword{secondary} {\printfield{labelnumber}} {\printfield{labelalpha}% \printfield{extraalpha}}}} \defbibenvironment{bibliographyNUM} {\list {\printtext[labelnumberwidth]{% \printfield{labelprefix}% \printfield{labelnumber}}} {\setlength{\labelwidth}{\labelnumberwidth}% \setlength{\leftmargin}{\labelwidth}% \setlength{\labelsep}{\biblabelsep}% \addtolength{\leftmargin}{\labelsep}% \setlength{\itemsep}{\bibitemsep}% \setlength{\parsep}{\bibparsep}}% \renewcommand*{\makelabel}[1]{\hss##1}} {\endlist} {\item} \begin{filecontents}{biblatextest1.bib} @BOOK{BookA03, author = {Author Aaa}, title = {Some Title}, publisher = {Some Publisher}, year = 2003, keywords = {hello}, } @BOOK{BookB02, author = {Author Bbb}, title = {Some Title}, publisher = {Some Publisher}, year = 2002, } \end{filecontents} \begin{filecontents}{biblatextest2.bib} @MISC{LinkC04, author = {Author Ccc}, title = {Some Title}, year = 2004, url = {www.test1.com/bild.jpg}, keywords = {bye}, } @MISC{LinkD01, author = {Author Ddd}, title = {Some Title}, year = 2001, url = {www.test2.com/bild.jpg}, } \end{filecontents} \addbibresource{biblatextest1.bib} \addbibresource{biblatextest2.bib} \begin{document} The first two citations \cite{LinkD01} and \cite{BookB02}. The others are \cite{LinkC04} and \cite{BookA03}. \printbibliography[title=Bibliography, keyword=primary] \newrefcontext[sorting=none] \printbibliography[env=bibliographyNUM, title=References, keyword=secondary, resetnumbers] \end{document} 

ukázkový výstup

Komentáře

  • Funguje perfektně a vypadá elegantně po opětovné instalaci balíčku biblatex + biber (uživatel MikTex). Chtěl jsem to jen opustit, pokud se někdo diví také o “ neinicializované hodnotě “ chyb. Nezapomeňte také smazat všechny soubory kromě .tex, protože mohou také způsobit proplémy. Pěkné řešení, děkuji.
  • @Jannik S aktuální verzí biblatex a BIber by neměly existovat žádné “ neinicializované hodnoty “ létající kolem. Pokud jsou verze starší nebo se ‚ t neshodují, výše uvedené nebude fungovat. Po aktualizaci zřídka bolí odstranit dočasné soubory, aby se ujistil, že se žádné staré věci nelepí a nezpůsobí problémy.
  • Pokud přidáte \newcommand{\letbibmacro}[2]{% \csletcs{abx@macro@#1}{abx@macro@#2}% } \letbibmacro{original-cite}{cite}, můžete použít \usebibmacro{original-cite} uvnitř vaší nové \cite definice pro vložení libovolného stylu, který jste vybrali při načítání (např. authoryear, …) (nahradí \printfield{labelalpha}\printfield{extraalpha}).
  • @opatut Skvělý nápad. V některých situacích je však umístění kódu zásadní. Rovněž nemusí být vždy skvělý nápad jednoduše standardní makro vůbec nevolat (zvláště pokud se to zkomplikuje a provede úklidové práce, přemýšlím o -icomp styly zde). Tady by problém nebyl, mohl bych jen uložit řádek přesunutím \if..., ale můžete to znovu oddělit.
  • @GandalfLechner Pokud chcete chcete-li zachovat původní klíčová slova, můžete si udělat o něco lépe. Přečtěte si upravenou odpověď.

Odpovědět

Mnohokrát děkujeme. Chtěl jsem se podělit o svoji upravenou verzi problému. Rozdělil jsem Bib do kategorií definováním různých citovaných slov. Byly zkopírovány pevné zdroje driftnetu, zejména biblatex: více bibliografií kategorizovaných podle různých souborů .bib , takže to není nejlepší praxe, ale funguje to. Doufejme, že biblatex bude v budoucnu nativní podporovat smíšené styly bibliografie.

\documentclass[fontsize=11pt,a4paper,bibliography=totoc]{scrbook} \usepackage[style=alphabetic,backend=biber,defernumbers = true]{biblatex} \addbibresource{bib/references.bib} \DeclareBibliographyCategory{pubA} \DeclareBibliographyCategory{contA} \DeclareBibliographyCategory{refs} \DeclareBibliographyCategory{relT} \defbibheading{pubA}{\section*{Publications of the Author}} \defbibheading{contA}{\section*{Contributions of the Author}} \defbibheading{refs}{\section*{References}} \defbibheading{relT}{\section*{Related Theses}} \newcommand*{\citeA}[2][]{\addtocategory{pubA}{#2}\cite[#1]{#2}} \newcommand*{\citeC}[2][]{\addtocategory{contA}{#2}\cite[#1]{#2}} \newcommand*{\citeR}[2][]{\addtocategory{refs}{#2}\cite[#1]{#2}} \renewbibmacro*{cite}{% \printtext[bibhyperref]{% \printfield{labelprefix}% \ifcategory{refs} {\printfield{labelnumber}} {\printfield{labelalpha}% \printfield{extraalpha}}}} \newcommand*{\citeT}[2][]{\addtocategory{relT}{#2}\cite[#1]{#2}} \DeclareFieldFormat{labelnumberwidth}{\mkbibbrackets{#1}} % important to get [] in bib \defbibenvironment{refsEnv} {\list {\printtext[labelnumberwidth]{% \printfield{prefixnumber}% \printfield{labelnumber}}} {\setlength{\labelwidth}{\labelnumberwidth}% \setlength{\leftmargin}{\labelwidth}% \setlength{\labelsep}{\biblabelsep}% \addtolength{\leftmargin}{\labelsep}% \setlength{\itemsep}{\bibitemsep}% \setlength{\parsep}{\bibparsep}}% \renewcommand*{\makelabel}[1]{\hss##1}} {\endlist} {\item} \begin{document} some text \citeR{<citekey>} \citeT{<citekey>}... \printbibheading[heading=bibintoc] \printbibliography[heading=subbibliography,title={Publications of the Author},category=pubA] \printbibliography[heading=subbibliography,title={Contributions of the Author},category=contA] \newrefcontext[sorting=none] \printbibliography[heading=subbibliography,title={References},category=refs,env=refsEnv,resetnumbers] \printbibliography[heading=subbibliography,title={Related Theses},category=relT] \end{document} 

Odpověď

Udělejte to, co říká @moewe, abyste mohli používat číselné citace i při style=alphabetic.

U různých objednávek je mnohem jednodušší prostředí refcontext, které vyžaduje možnost třídění. Nejprve použijte Biblatex ke generování hlavní bibliografie:

\printbibliography[title=Bibliography, keyword=primary] 

Poté vytvořte druhou s různými druhy, filtry a styly tak, že ji uzavřete do refcontext s těmito parametry.

\begin{refcontext}[sorting=ydnt]{} % sort chronologically \printbibliography[title=References, keyword=secondary, resetnumbers] \end{refcontext} 

Prázdný {} jako poslední parametr refcontext umožňuje vám vytvořit prostředí ad hoc, aniž byste deklarovali cokoli jinde.

Použil jsem to, když moje škola vyžadovala, abych na konci mé práce zahrnul životopis, takže jsem potřeboval vygenerovat bibliografii svých prací obráceně chronologické pořadí kromě obvyklé AZ bibliografie pro příspěvek. Bylo to mnohem čistší než to, co jsem měl.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *