Biblatex: Dwie bibliografie o różnych stylach i sortowaniu

MWE dotyczące napotkanego problemu:

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

Problem: potrzebuję dwóch bibliografii, pierwszej w stylu alfabetycznym i posortowanej według nazwiska autora. Drugi w stylu numerycznym posortowany według kolejności cytowań. Oba nie mają wspólnych odniesień. W jakiś sposób szukam czegoś takiego w biblatex:

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

Myślałem, że biblatex jest specjalnie napisany do pracy z wieloma bibliografiami, ale nie znalazłem żadnej inny sposób niż ten pokazany w MWE (co jest oczywiście hackem). Właściwie działa całkiem nieźle, dopóki nie chcę innego sortowania. Kiedy używam

\newrefcontext[sorting=none] 

Liczby cytowań spadają do zera.

Komentarze

  • biblatex został napisany w celu obsługi podzielonych / wielu bibliografii (wśród wielu innych funkcji), ale nie ' t oficjalne wsparcie mieszania różnych bibliografii style w jednym dokumencie.

Odpowiedź

Jeśli zdasz opcję labelnumber do biblatex możesz używać cytatów numerycznych nawet z style=alphabetic.

Polecenie cite może się przełączać w zależności od słów kluczowych, więc możesz użyć \cite dla wszystkich wpisów, niezależnie od keyword.

W przypadku bibliografii numerycznej będziemy mieć aby zdefiniować nowe środowisko bibliograficzne, które drukuje cytaty numeryczne. bibliographyNUM jest bezpośrednio kopiowany z numeric.bbx. Aby ustawić sortowanie bibliografii, po prostu powiedz

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

przed numeryczną bibliografią. Poprzednia bibliografia będzie używać globalnego schematu sortowania anyt, który jest odpowiedni dla bibliografii w stylu alfa. W przypadku, gdy konieczne jest zachowanie lokalnego przypisania schematu sortowania (ponieważ bibliografia numeryczna znajduje się przed bibliografią alfa), użyłbyś

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

przykładowe dane wyjściowe

Komentarze

  • Działa doskonale i wygląda elegancko po ponownej instalacji pakietu biblatex + biber (użytkownik MikTex). Chciałem to zostawić, jeśli ktoś zastanawia się nad błędami ” wartości niezainicjowanej „. Upewnij się również, że usunąłeś wszystkie pliki z wyjątkiem .tex, ponieważ mogą one również powodować problemy. Niezłe obejście, dziękuję.
  • @Jannik Przy aktualnej wersji obu biblatex i BIber nie powinno być ” niezainicjalizowane wartości ” latające. Jeśli jednak wersje są starsze lub nie ' nie pasują, powyższe nie będzie działać. Po aktualizacji rzadko boli usunięcie plików tymczasowych, aby upewnić się, że żadne stare rzeczy nie przyklejają się i nie powodują problemów.
  • Jeśli dodasz \newcommand{\letbibmacro}[2]{% \csletcs{abx@macro@#1}{abx@macro@#2}% } \letbibmacro{original-cite}{cite}, możesz użyć \usebibmacro{original-cite} wewnątrz nowej \cite definicji, aby wstawić dowolny styl wybrany podczas ładowania (np. authoryear, …) (zastępuje \printfield{labelalpha}\printfield{extraalpha}).
  • @opatut Niezły pomysł. W niektórych sytuacjach kluczowe jest jednak umieszczenie kodu. Nie zawsze też dobrym pomysłem może być po prostu nie wywoływanie standardowego makra w ogóle (zwłaszcza jeśli robi się bardziej skomplikowane i wykonuje porządki, ' myślę o -icomp style). Tutaj nie byłoby problemu, mógłbym tylko zapisać linię, przesuwając \if... dookoła, ale możesz to ponownie oddzielić.
  • @GandalfLechner Jeśli chcesz aby zachować oryginalne słowa kluczowe, możesz zrobić to nieco lepiej. Zobacz zredagowaną odpowiedź.

Odpowiedź

Wielkie dzięki. Chciałem podzielić się moją dostosowaną wersją problemu. Podzieliłem mój śliniak na kategorie, definiując różne cytowane słowa. Został skopiowany z firmowych źródeł Driftnet, zwłaszcza biblatex: wiele bibliografii podzielonych na kategorie według różnych plików .bib , więc nie jest to najlepsza praktyka, ale działa. Miejmy nadzieję, że biblatex w przyszłości będzie obsługiwał mieszane style bibliografii.

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

Odpowiedź

Rób to, co mówi @moewe, aby używać cytatów numerycznych nawet z style=alphabetic.

W przypadku różnych porządków sortowania istnieje znacznie łatwiejszy sposób – środowisko refcontext, które wymaga opcję sortowania. Najpierw użyj Biblatex, aby wygenerować swoją główną bibliografię:

\printbibliography[title=Bibliography, keyword=primary] 

Następnie utwórz drugą z różnymi rodzajami, filtrami i stylami, umieszczając ją w refcontext z tymi jako parametrami.

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

Puste {} jako ostatni parametr refcontext pozwala stworzyć środowisko ad hoc bez deklarowania czegokolwiek gdzie indziej.

Użyłem tego, gdy moja szkoła wymagała ode mnie dołączenia CV na końcu mojej pracy, więc musiałem wygenerować bibliografię moich prac w odwrotnej kolejności porządek chronologiczny, oprócz zwykłej bibliografii AZ dla artykułu. Był znacznie czystszy niż to, co miałem.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *