Biblatex: twee bibliografieën met verschillende stijlen en sorteringen

MWE voor het probleem dat ik tegenkwam:

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

Het probleem: ik heb twee bibliografieën nodig, de eerste met alfabetische stijl en gesorteerd op auteursnaam. De tweede in numerieke stijl gesorteerd op citaatvolgorde. Beide hebben geen gemeenschappelijke referenties. Op de een of andere manier zoek ik naar zoiets in biblatex:

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

Ik dacht dat biblatex speciaal is geschreven om met meerdere bibliografieën te werken, maar ik heb er geen gevonden op een andere manier dan die getoond in de MWE (wat duidelijk een hack is). Eigenlijk werkt het best goed totdat ik de andere sortering wil. Wanneer ik

\newrefcontext[sorting=none] 

gebruik, veranderen de citaatnummers in nul.

Opmerkingen

  • biblatex is geschreven om gesplitste / meervoudige bibliografieën te ondersteunen (naast vele andere functies), maar ‘ ondersteunt het niet officieel om verschillende bibliografieën te combineren stijlen in één document.

Antwoord

Als u de optie labelnumber naar biblatex kunt u numerieke citaten gebruiken, zelfs met style=alphabetic.

Het cite-commando kan wisselen op basis van trefwoorden, dus u kunt \cite gebruiken voor alle vermeldingen, ongeacht keyword.

Voor de numerieke bibliografie hebben we om een nieuwe bibliografieomgeving te definiëren die numerieke citaten afdrukt. bibliographyNUM wordt rechtstreeks gekopieerd van numeric.bbx. Om de sortering voor de bibliografie in te stellen, zegt u gewoon

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

vóór de numerieke bibliografie. De vorige bibliografie gebruikt het globale sorteringsschema anyt dat geschikt is voor bibliografie in alfastijl. Als het nodig is om de toewijzing van het sorteerschema lokaal te houden (omdat de numerieke bibliografie voor de alfabibliografie komt), zou u

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

voorbeelduitvoer

Reacties

  • Werkt prima en ziet er elegant uit nadat ik het biblatex + biber-pakket opnieuw heb geïnstalleerd (MikTex-gebruiker). Ik wilde dit gewoon laten staan als iemand zich afvraagt over ” niet-geïnitialiseerde waarde ” fouten. Zorg er ook voor dat u alle bestanden verwijdert behalve .tex, aangezien deze ook proplems kunnen veroorzaken. Goede oplossing, bedankt.
  • @Jannik Met een up-to-date versie van zowel biblatex als BIber zou er geen ” niet-geïnitialiseerde waarden ” vliegen rond. Als de versies echter ouder zijn of niet ‘ overeenkomen, zal het bovenstaande niet werken. Na een update doet het zelden pijn om de tijdelijke bestanden te verwijderen om er zeker van te zijn dat er geen oude dingen blijven hangen en problemen veroorzaken.
  • Als je \newcommand{\letbibmacro}[2]{% \csletcs{abx@macro@#1}{abx@macro@#2}% } \letbibmacro{original-cite}{cite} toevoegt, kun je \usebibmacro{original-cite} in uw nieuwe \cite -definitie om elke stijl in te voegen die u bij het laden hebt geselecteerd (bijv. authoryear, …) (vervangt \printfield{labelalpha}\printfield{extraalpha}).
  • @opatut Leuk idee. In sommige situaties is de plaatsing van de code echter cruciaal. Het is misschien ook niet altijd een goed idee om de standaardmacro helemaal niet aan te roepen (vooral als deze ingewikkelder wordt en opruimwerkzaamheden uitvoert, denk ik ‘ aan -icomp stijlen hier). Hier zou er geen probleem zijn, ik zou alleen een regel kunnen opslaan door de \if... rond te verplaatsen, maar je zou dat weer kunnen scheiden.
  • @GandalfLechner Als je wilt om uw oorspronkelijke zoekwoorden te behouden, kunt u het iets beter doen. Zie het bewerkte antwoord, alstublieft.

Antwoord

Heel erg bedankt. Ik wilde mijn aangepaste versie van het probleem delen. Ik heb mijn Bib in categorieën verdeeld door verschillende citaatwoorden te definiëren. Het was gekopieerde vaste drijfnetbronnen, vooral biblatex: meerdere bibliografieën gecategoriseerd door verschillende .bib-bestanden , dus het is niet de beste praktijk, maar het werkt. Hopelijk ondersteunt biblatex in de toekomst gemengde bibliografiestijlen.

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

Antwoord

Doe wat @moewe zegt om numerieke citaten te gebruiken, zelfs met style=alphabetic.

Voor verschillende sorteervolgorden is er “een veel eenvoudigere manier, de refcontext -omgeving, die een sorteeroptie. Gebruik eerst Biblatex om uw hoofdbibliografie te genereren:

\printbibliography[title=Bibliography, keyword=primary] 

Maak vervolgens uw tweede met verschillende soorten, filters en stijlen door deze in de refcontext met deze als parameters.

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

De lege {} als de laatste parameter van refcontext laat je een ad-hocomgeving creëren zonder ergens anders iets op te geven.

Ik gebruikte dit toen mijn school me verplichtte om een cv aan het einde van mijn proefschrift toe te voegen, dus ik moest een bibliografie van mijn werken in omgekeerde volgorde genereren chronologische volgorde naast de gebruikelijke AZ-bibliografie voor de paper. Het was veel schoner dan wat ik had gehad.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *