Biblatex: Två bibliografier med olika stilar och sorteringar

MWE för det problem jag stötte på:

\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: Jag behöver två bibliografier, den första med alfabetisk stil och sorterad efter författarnamn. Den andra i numerisk stil sorterad efter citatordning. Båda har inga gemensamma referenser. På något sätt letar jag efter något liknande i biblatex:

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

Jag trodde att biblatex är speciellt skrivet för att fungera med flera bibliografier, men jag har inte hittat någon på annat sätt än den som visas i MWE (som uppenbarligen är ett hack). Egentligen fungerar det ganska bra tills jag vill ha den andra sorteringen. När jag använder

\newrefcontext[sorting=none] 

Citren blir noll.

Kommentarer

  • biblatex är skrivet för att stödja split / multipla bibliografier (bland många andra funktioner), men det

t officiellt stöd blandar olika bibliografi stilar i ett dokument.

Svar

Om du passerar alternativet labelnumber till biblatex kan du använda numeriska citat även med style=alphabetic.

Citat-kommandot kan växla baserat på nyckelord så att du kan använda \cite för alla poster oavsett keyword.

För den numeriska bibliografin har vi för att definiera en ny bibliografimiljö som skriver ut numeriska citat. bibliographyNUM kopieras direkt från numeric.bbx. För att ställa in sorteringen för bibliografin, säg bara

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

före den numeriska bibliografin. Den tidigare bibliografin använder det globala sorteringsschemat anyt som är lämpligt för alfabetisk bibliografi. Om det är nödvändigt att hålla tilldelningen av sorteringsschema lokalt (eftersom den numeriska bibliografin kommer före alfabibliografin) skulle du använda

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

exempelutdata

Kommentarer

  • Fungerar perfekt och ser elegant ut efter att jag installerat om biblatex + biber-paketet (MikTex-användare). Ville bara lämna detta om någon undrar om ” oinitialiserat värde ” fel också. Se också till att ta bort alla filer utom .tex eftersom de också kan orsaka problem. Trevlig lösning, tack.
  • @Jannik Med en uppdaterad version av både biblatex och BIber borde det inte finnas någon ” oinitialiserade värden ” flyger runt. Om versionerna är äldre eller ’ inte matchar fungerar inte ovanstående. Efter en uppdatering gör det sällan ont att ta bort tillfälliga filer för att se till att inga gamla saker klibbar och orsakar problem.
  • Om du lägger till \newcommand{\letbibmacro}[2]{% \csletcs{abx@macro@#1}{abx@macro@#2}% } \letbibmacro{original-cite}{cite} kan du använda \usebibmacro{original-cite} inuti din nya \cite -definition för att infoga vilken stil du valt vid inläsning (t.ex. autentik, …) (ersätter \printfield{labelalpha}\printfield{extraalpha}).
  • @opatut Bra idé. I vissa situationer är dock placeringen av koden avgörande. Det kanske inte alltid är en bra idé att helt enkelt inte ringa standardmakronet alls (speciellt om det blir mer komplicerat och utför rengöringsarbete, jag ’ tänker på -icomp stilar här). Här skulle det inte vara något problem, jag kunde bara spara en rad genom att flytta \if..., men du kunde skilja det igen.
  • @GandalfLechner Om du vill för att behålla dina ursprungliga sökord kan du göra det lite bättre. Se det redigerade svaret tack.

Svar

Tack så mycket. Jag ville dela min anpassade version av problemet. Jag delade min haklapp i kategorier genom att definiera olika citatord. Det kopierades fasta drivnätkällor, särskilt biblatex: flera bibliografier kategoriserade efter olika .bib-filer så det är inte den bästa metoden men det fungerar. Förhoppningsvis kommer biblatex att stödja blandade bibliografistilar i framtiden.

\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

Gör vad @moewe säger för att använda numeriska citat även med style=alphabetic.

För olika sorteringsordrar finns det ett mycket enklare sätt, refcontext -miljön, som tar en sorteringsalternativ. Använd först Biblatex för att skapa din huvudbibliografi:

\printbibliography[title=Bibliography, keyword=primary] 

Skapa sedan din andra med olika sorter, filter och stilar genom att bifoga den i refcontext med de som parametrar.

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

Den tomma {} som den sista parametern för refcontext låter dig skapa en ad hoc-miljö utan att förklara någonting någon annanstans.

Jag använde det här när min skola krävde att jag inkluderade ett CV i slutet av min avhandling, så jag behövde skapa en bibliografi över mina verk omvänd kronologisk ordning utöver den vanliga AZ-bibliografin för uppsatsen. Det var mycket renare än vad jag hade.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *