Biblatex: Două bibliografii cu stiluri și sortări diferite

MWE pentru problema întâmpinată:

\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} 

Problema: am nevoie de două bibliografii, prima cu stil alfabetic și sortată după numele autorului. Al doilea în stil numeric sortat după ordinea de citare. Ambele nu au referințe comune. Cumva „caut ceva de genul acesta în biblatex:

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

Am crezut că biblatex este scris în special pentru a lucra cu mai multe bibliografii, dar nu am găsit altfel decât cel arătat în MWE (care este evident un hack). De fapt, funcționează destul de bine până când vreau cealaltă sortare. Când folosesc

\newrefcontext[sorting=none] 

Numerele citate devin zero.

Comentarii

  • biblatex este scris pentru a suporta bibliografii divizate / multiple (printre multe alte caracteristici), dar nu ‘ suport oficial amestecând bibliografie diferită stiluri într-un singur document.

Răspuns

Dacă treceți opțiunea labelnumber la biblatex puteți utiliza citate numerice chiar și cu style=alphabetic.

Comanda cite poate comuta pe cuvinte cheie, astfel încât să puteți utiliza \cite pentru toate intrările indiferent de keyword.

Pentru bibliografia numerică vom avea pentru a defini un nou mediu bibliografic care tipărește citate numerice. bibliographyNUM este copiat direct din numeric.bbx. Pentru a seta sortarea bibliografiei, spuneți

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

înainte de bibliografia numerică. Bibliografia anterioară va utiliza schema globală de sortare anyt adecvată pentru bibliografia în stil alfa. În cazul în care este necesar să păstrați atribuirea schemei de sortare la nivel local (deoarece bibliografia numerică este înaintea bibliografiei alfa), veți utiliza

\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} 

exemplu de ieșire

Comentarii

  • Funcționează perfect și arată elegant după ce am reinstalat pachetul biblatex + biber (utilizator MikTex). Am vrut doar să părăsesc acest lucru dacă cineva se întreabă și despre erorile ” valoare neinițializată „. De asemenea, asigurați-vă că ștergeți toate fișierele, cu excepția .tex, deoarece acestea pot provoca, de asemenea, propleme. Soluție minunată, mulțumesc.
  • @Jannik Cu o versiune actualizată atât a biblatex, cât și a BIber, nu ar trebui să existe ” valori neinitializate ” care zboară. Dacă versiunile sunt mai vechi sau nu se potrivesc, cu toate acestea, cele de mai sus nu vor funcționa. După o actualizare, rar doare să ștergeți fișierele temporare pentru a vă asigura că nu se lipesc lucruri vechi și cauzează probleme.
  • Dacă adăugați \newcommand{\letbibmacro}[2]{% \csletcs{abx@macro@#1}{abx@macro@#2}% } \letbibmacro{original-cite}{cite} puteți utiliza \usebibmacro{original-cite} în noua dvs. definiție \cite pentru a insera orice stil ați selectat la încărcare (de exemplu, autorizat, …) (înlocuiește \printfield{labelalpha}\printfield{extraalpha}).
  • @opatut O idee frumoasă. În unele situații, plasarea codului este însă crucială. De asemenea, s-ar putea să nu fie întotdeauna o idee grozavă să nu apelați macrocomanda standard deloc (mai ales dacă devine mai complicată și efectuează lucrări de curățare, mă ‘ mă gândesc la -icomp stiluri aici). Aici nu ar exista o problemă, aș putea salva o linie doar mutând \if..., dar ați putea să o separați din nou.
  • @GandalfLechner Dacă doriți pentru a vă păstra cuvintele cheie originale, puteți face ceva mai bine. Vedeți răspunsul modificat, vă rog.

Răspuns

Mulțumesc mult. Am vrut să împărtășesc versiunea mea adaptată a problemei. Mi-am împărțit Bibul în categorii definind diferite cuvinte citate. S-au copiat surse de driftnet firme, în special biblatex: bibliografii multiple clasificate după diferite fișiere .bib , deci nu este cea mai bună practică, dar funcționează. Sperăm că biblatex va sprijini nativ stiluri mixte de bibliografie în viitor.

\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} 

Răspuns

Fă ceea ce spune @moewe pentru a utiliza citate numerice chiar și cu style=alphabetic.

Pentru diferite ordine de sortare, există un mod mult mai ușor, mediul refcontext, care necesită un opțiune de sortare. Mai întâi, utilizați Biblatex pentru a genera bibliografia principală:

\printbibliography[title=Bibliography, keyword=primary] 

Apoi, creați-vă al doilea cu diferite sorturi, filtre și stiluri, încadrându-l în refcontext cu acei parametri.

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

{} gol ca ultim parametru al refcontext vă permite să creați un mediu ad hoc fără să declarați nimic în altă parte.

Am folosit acest lucru atunci când școala mea mi-a cerut să includ un CV la sfârșitul tezei, așa că am avut nevoie să generez o bibliografie a lucrărilor mele în sens invers ordinea cronologică în plus față de bibliografia AZ obișnuită pentru lucrare. A fost mult mai curat decât ceea ce aveam.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *