TransWikia.com

Biblatex: Two bibliographies with different styles and sortings

TeX - LaTeX Asked by Jannik on August 20, 2020

MWE for the problem I encountered:

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}

The problem:
I need two bibliographies, the first one with alphabetic style and sorted by author name. The second in numeric style sorted by cite order. Both have no common references. Somehow I’m searching for something like this in biblatex:

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

I thought biblatex is especially written to work with multiple bibliographies, but I haven’t found any other way than the one shown in the MWE (which is obviously a hack).
Actually it works pretty good until I want the other sorting. When I use

newrefcontext[sorting=none]

The cite numbers turn to zero.

3 Answers

If you pass the option labelnumber to biblatex you can use numeric citations even with style=alphabetic.

The cite command can switch based on keywords, so you can use cite for all entries regardless of keyword.

For the numeric bibliography we will have to define a new bibliography environment that prints numeric citations. bibliographyNUM is directly copied from numeric.bbx. To set the sorting for the bibliography, just say

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

before the numeric bibliography. The previous bibliography will use the global sorting scheme anyt that is appropriate for alpha-style bibliography. In case it is necessary to keep the sorting scheme assignment local (because the numeric bibliography comes before the alpha bibliography), you would use

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}

example output

Correct answer by moewe on August 20, 2020

Thanks a lot. I wanted to share my adapted version of the problem. I divided my Bib in categories by defining different cite words. It was copied firm driftnet sources especially biblatex: multiple bibliographies categorised by different .bib files so it is not the best practice but it works. Hopefully biblatex will native support mixed bibliography styles in the future.

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}

Answered by Gražvi on August 20, 2020

Do what @moewe says to use numeric citations even with style=alphabetic.

For different sort orders, there's a much easier way, the refcontext environment, which takes a sorting option. First, use Biblatex to generate your main bibliography:

printbibliography[title=Bibliography, keyword=primary]

Then, create your second one with different sorts, filters, and styles by enclosing it in the refcontext with those as parameters.

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

The empty {} as the last parameter of refcontext lets you create an ad hoc environment without declaring anything elsewhere.

I used this when my school required me to include a CV at the end of my thesis, so I needed to generate a bibliography of my works in reverse chronological order in addition to the usual A-Z bibliography for the paper. It was much cleaner than what I'd had.

Answered by Merchako on August 20, 2020

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP