Biblatex: To bibliografier med forskellige stilarter og sorteringer

MWE for det problem, jeg stødte 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: Jeg har brug for to bibliografier, den første med alfabetisk stil og sorteret efter forfatternavn. Den anden i numerisk stil sorteret efter citeret rækkefølge. Begge har ingen fælles referencer. På en eller anden måde søger jeg efter noget som dette i biblatex:

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

Jeg troede, at biblatex er specielt skrevet til at arbejde med flere bibliografier, men jeg har ikke fundet nogen anden måde end den, der vises i MWE (som naturligvis er et hack). Faktisk fungerer det ret godt, indtil jeg vil have den anden sortering. Når jeg bruger

\newrefcontext[sorting=none] 

Citeringsnumrene bliver nul.

Kommentarer

  • biblatex er skrevet til at understøtte split / multiple bibliografier (blandt mange andre funktioner), men det

t officiel støtte, der blander forskellige bibliografier stilarter i et dokument.

Svar

Hvis du passerer indstillingen labelnumber til biblatex kan du bruge numeriske citater, selv med style=alphabetic.

Cite-kommandoen kan skifte baseret på nøgleord, så du kan bruge \cite til alle poster uanset keyword.

For den numeriske bibliografi har vi at definere et nyt bibliografimiljø, der udskriver numeriske citater. bibliographyNUM kopieres direkte fra numeric.bbx. For at indstille sorteringen for bibliografien skal du bare sige

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

før den numeriske bibliografi. Den tidligere bibliografi bruger det globale sorteringsskema anyt, der er passende til alfabetisk bibliografi. Hvis det er nødvendigt at holde sorteringsskemaetildelingen lokal (fordi den numeriske bibliografi kommer før alfabibliografien), bruger 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} 

eksempeloutput

Kommentarer

  • Fungerer fint og ser elegant ud, efter at jeg geninstallerede biblatex + biber-pakke (MikTex-bruger). Ville bare lade dette være, hvis nogen undrer sig over ” ikke-initialiseret værdi ” fejl også. Sørg også for at slette alle filer undtagen .tex, da de også kan forårsage problemer. God løsning, tak.
  • @Jannik Med en opdateret version af både biblatex og BIber skulle der ikke være nogen ” ikke-initialiserede værdier ” flyver omkring. Hvis versionerne er ældre eller

ikke stemmer overens, fungerer ovenstående dog ikke. Efter en opdatering gør det sjældent ondt at slette de midlertidige filer for at sikre, at ingen gamle ting sidder fast og forårsager problemer.

  • Hvis du tilføjer \newcommand{\letbibmacro}[2]{% \csletcs{abx@macro@#1}{abx@macro@#2}% } \letbibmacro{original-cite}{cite}, kan du bruge \usebibmacro{original-cite} inde i din nye \cite definition for at indsætte den stil, du valgte ved indlæsning (f.eks. autentisk år, …) (erstatter \printfield{labelalpha}\printfield{extraalpha}).
  • @opatut Dejlig idé. I nogle situationer er placeringen af koden dog afgørende. Det er måske ikke altid en god ide at slet ikke kalde standardmakroen overhovedet (især hvis det bliver mere kompliceret og udfører oprydningsarbejde, tænker jeg ‘ id = “dc68719597”> stilarter her). Her ville der ikke være et problem, jeg kunne kun gemme en linje ved at flytte \if... rundt, men du kunne adskille den igen.
  • @GandalfLechner Hvis du vil for at bevare dine originale søgeord kan du gøre det lidt bedre. Se det redigerede svar tak.
  • Svar

    Mange tak. Jeg ville dele min tilpassede version af problemet. Jeg delte min Bib i kategorier ved at definere forskellige citatord. Det blev kopieret faste drivnetkilder, især biblatex: flere bibliografier kategoriseret efter forskellige .bib-filer , så det er ikke den bedste praksis, men det fungerer. Forhåbentlig vil biblatex oprindeligt understøtte blandede bibliografistile 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

    Gør hvad @moewe siger for at bruge numeriske citater, selv med style=alphabetic.

    For forskellige sorteringsordrer er der en meget lettere måde, refcontext -miljøet, der tager en sorteringsmulighed. Brug først Biblatex til at generere din hovedbibliografi:

    \printbibliography[title=Bibliography, keyword=primary] 

    Opret derefter din anden med forskellige slags, filtre og stilarter ved at omslutte den i refcontext med dem som parametre.

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

    Den tomme {} som den sidste parameter i refcontext lader dig oprette et ad hoc-miljø uden at erklære noget andetsteds.

    Jeg brugte dette, da min skole krævede, at jeg inkluderede et CV i slutningen af min afhandling, så jeg havde brug for at generere en bibliografi over mine værker omvendt kronologisk rækkefølge ud over den sædvanlige AZ-bibliografi for papiret. Det var meget renere end hvad jeg havde.

    Skriv et svar

    Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *