Biblatex: due bibliografie con stili e ordinamenti diversi

MWE per il problema che ho riscontrato:

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

Il problema: mi servono due bibliografie, la prima con stile alfabetico e ordinata per nome dellautore. Il secondo in stile numerico ordinato per ordine di citazione. Entrambi non hanno riferimenti comuni. In qualche modo sto cercando qualcosa di simile in biblatex:

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

Pensavo che biblatex fosse scritto specialmente per funzionare con più bibliografie, ma non ne ho trovati diverso da quello mostrato nel MWE (che è ovviamente un hack). In realtà funziona abbastanza bene finché non voglio laltro smistamento. Quando uso

\newrefcontext[sorting=none] 

i numeri delle citazioni diventano zero.

Commenti

  • biblatex è scritto per supportare bibliografie suddivise / multiple (tra molte altre caratteristiche), ma non ‘ t supporta ufficialmente la miscelazione di bibliografia diversa stili in un documento.

Risposta

Se passi lopzione labelnumber a biblatex puoi utilizzare citazioni numeriche anche con style=alphabetic.

Il comando cite può cambiare in base a parole chiave, quindi puoi utilizzare \cite per tutte le voci indipendentemente da keyword.

Per la bibliografia numerica avremo definire un nuovo ambiente bibliografico che stampi citazioni numeriche. bibliographyNUM viene copiato direttamente da numeric.bbx. Per impostare lordinamento della bibliografia, basta dire

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

prima della bibliografia numerica. La bibliografia precedente utilizzerà lo schema di ordinamento globale anyt appropriato per la bibliografia in stile alfa. Nel caso in cui sia necessario mantenere lassegnazione dello schema di ordinamento locale (perché la bibliografia numerica viene prima della bibliografia alfa), dovresti utilizzare

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

output di esempio

Commenti

  • Funziona perfettamente e sembra elegante dopo aver reinstallato il pacchetto biblatex + biber (utente MikTex). Volevo solo lasciarlo se qualcuno si interroga sugli errori del ” valore non inizializzato “. Assicurati anche di eliminare tutti i file eccetto .tex in quanto possono causare problemi. Bella soluzione alternativa, grazie.
  • @Jannik Con una versione aggiornata di biblatex e BIber non dovrebbero esserci ” valori non inizializzati ” in volo. Se le versioni sono precedenti o non ‘ corrispondono, tuttavia, quanto sopra non funzionerà. Dopo un aggiornamento, raramente fa male eliminare i file temporanei per assicurarti che non ci siano vecchie cose e causare problemi.
  • Se aggiungi \newcommand{\letbibmacro}[2]{% \csletcs{abx@macro@#1}{abx@macro@#2}% } \letbibmacro{original-cite}{cite} puoi usare \usebibmacro{original-cite} allinterno della tua nuova definizione \cite per inserire lo stile selezionato al caricamento (ad es. authoryear, …) (sostituisce \printfield{labelalpha}\printfield{extraalpha}).
  • @opatut Bella idea. In alcune situazioni, tuttavia, il posizionamento del codice è fondamentale. Potrebbe anche non essere sempre una buona idea semplicemente non chiamare affatto la macro standard (specialmente se diventa più complicata ed esegue un lavoro di pulizia, ‘ sto pensando a -icomp stili qui). Qui non ci sarebbero problemi, potrei solo salvare una riga spostando \if..., ma potresti separarla di nuovo.
  • @GandalfLechner Se vuoi per mantenere le parole chiave originali, puoi fare di meglio. Vedi la risposta modificata, per favore.

Risposta

Grazie mille. Volevo condividere la mia versione adattata del problema. Ho diviso il mio pettorale in categorie definendo diverse parole di citazione. È stato copiato da fonti aziendali di reti derivanti in particolare biblatex: più bibliografie classificate da diversi file .bib quindi non è la migliore pratica ma funziona. Si spera che biblatex supporterà in futuro stili di bibliografia mista.

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

Risposta

Fai quello che dice @moewe per usare citazioni numeriche anche con style=alphabetic.

Per diversi ordinamenti, esiste “un modo molto più semplice, lambiente refcontext, che accetta un opzione di ordinamento. Innanzitutto, utilizza Biblatex per generare la tua bibliografia principale:

\printbibliography[title=Bibliography, keyword=primary] 

Quindi, crea la tua seconda con diversi tipi, filtri e stili racchiudendola tra refcontext con quelli come parametri.

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

Il vuoto {} come ultimo parametro di refcontext ti permette di creare un ambiente ad hoc senza dichiarare altrove.

Lho usato quando la mia scuola mi richiedeva di includere un CV alla fine della mia tesi, quindi dovevo generare una bibliografia dei miei lavori al contrario ordine cronologico oltre alla solita bibliografia AZ per larticolo. Era molto più pulito di quello che avevo.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *