Biblatex: To bibliografier med forskjellige stiler og sorteringer

MWE for problemet jeg opplevde:

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

Problemet: Jeg trenger to bibliografier, den første med alfabetisk stil og sortert etter forfatternavn. Den andre i numerisk stil sortert etter sitatrekkefølge. Begge har ingen vanlige referanser. På en eller annen måte søker jeg etter noe slikt i biblatex:

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

Jeg trodde biblatex er spesielt skrevet for å jobbe med flere bibliografier, men jeg har ikke funnet noen annen måte enn den som vises i MWE (som åpenbart er et hack). Egentlig fungerer det ganske bra til jeg vil ha den andre sorteringen. Når jeg bruker

\newrefcontext[sorting=none] 

Sitatetallene blir null.

Kommentarer

  • biblatex er skrevet for å støtte splittede / flere bibliografier (blant mange andre funksjoner), men det ‘ t offisiell støtte for å blande forskjellige bibliografier stiler i ett dokument.

Svar

Hvis du klarer alternativet labelnumber til biblatex kan du bruke numeriske sitater selv med style=alphabetic.

Sitatkommandoen kan byttes basert på nøkkelord, slik at du kan bruke \cite for alle oppføringer uavhengig av keyword.

For den numeriske bibliografien vil vi ha å definere et nytt bibliografimiljø som skriver ut numeriske sitater. bibliographyNUM kopieres direkte fra numeric.bbx. For å stille inn sorteringen for bibliografien, bare si

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

før den numeriske bibliografien. Den forrige bibliografien vil bruke det globale sorteringsskjemaet anyt som er passende for alfabetisk bibliografi. I tilfelle det er nødvendig å holde sorteringsskjemaoppgaven lokal (fordi den numeriske bibliografien kommer før alfabibliografien), bruker du

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

eksempelutdata

Kommentarer

  • Fungerer helt fint og ser elegant ut etter at jeg har installert biblatex + biber-pakken på nytt (MikTex-bruker). Ville bare forlate dette hvis noen lurer på » ikke-initialiserte verdi » feil også. Sørg også for å slette alle filer unntatt .tex, da de også kan forårsake problemer. Fin løsning, takk.
  • @Jannik Med en oppdatert versjon av både biblatex og BIber burde det ikke være » ikke-initialiserte verdier » som flyr rundt. Hvis versjonene er eldre eller ikke ‘ ikke stemmer overens, fungerer ikke ovenstående. Etter en oppdatering er det sjelden vondt å slette de midlertidige filene for å sikre at ingen gamle ting henger fast og forårsaker problemer.
  • Hvis du legger til \newcommand{\letbibmacro}[2]{% \csletcs{abx@macro@#1}{abx@macro@#2}% } \letbibmacro{original-cite}{cite}, kan du bruke \usebibmacro{original-cite} inne i den nye \cite -definisjonen din for å sette inn hvilken stil du valgte under belastning (f.eks. autentisk år, …) (erstatter \printfield{labelalpha}\printfield{extraalpha}).
  • @opatut Fin idé. I noen situasjoner er det imidlertid viktig med plassering av koden. Det kan heller ikke alltid være en god ide å ikke bare kalle standardmakroen i det hele tatt (spesielt hvis det blir mer komplisert og utfører opprydningsarbeid, tenker jeg ‘ id = «dc68719597»>

stiler her). Her ville det ikke være noe problem, jeg kunne bare lagre en linje ved å flytte\if..., men du kan skille den igjen.

  • @GandalfLechner Hvis du vil for å beholde de originale søkeordene, kan du gjøre det litt bedre. Se det redigerte svaret.
  • Svar

    Tusen takk. Jeg ønsket å dele min tilpassede versjon av problemet. Jeg delte smekken min i kategorier ved å definere forskjellige sitatord. Det ble kopiert faste drivnettkilder, spesielt biblatex: flere bibliografier kategorisert etter forskjellige .bib-filer , så det er ikke den beste fremgangsmåten, men det fungerer. Forhåpentligvis vil biblatex innfødt støtte blandede bibliografistiler i fremtiden.

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

    Svar

    Gjør hva @moewe sier for å bruke numeriske sitater selv med style=alphabetic.

    For forskjellige sorteringsordrer er det en mye enklere måte, refcontext -miljøet, som tar et sorteringsalternativ. Bruk først Biblatex til å generere hovedbibliografien din:

    \printbibliography[title=Bibliography, keyword=primary] 

    Lag deretter den andre med forskjellige sorter, filtre og stiler ved å legge den i refcontext med de som parametere.

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

    Den tomme {} som siste parameter for refcontext lar deg opprette et ad hoc-miljø uten å erklære noe annet sted.

    Jeg brukte dette da skolen min krevde at jeg inkluderte en CV på slutten av oppgaven, så jeg trengte å lage en bibliografi over verkene mine i omvendt retning. kronologisk rekkefølge i tillegg til den vanlige AZ-bibliografien for papiret. Det var mye renere enn det jeg hadde.

    Legg igjen en kommentar

    Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *