Biblatex: Deux bibliographies avec des styles et des classements différents

MWE pour le problème que jai rencontré:

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

Le problème: jai besoin de deux bibliographies, la première avec un style alphabétique et triée par nom dauteur. Le second en style numérique trié par ordre de citation. Les deux nont pas de références communes. Dune manière ou dune autre, je « cherche quelque chose comme ça dans biblatex:

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

Je pensais que biblatex est spécialement écrit pour travailler avec plusieurs bibliographies, mais je nen ai trouvé aucune autre manière que celle indiquée dans le MWE (qui est évidemment un hack). En fait, cela fonctionne plutôt bien jusquà ce que je veuille lautre tri. Quand jutilise

\newrefcontext[sorting=none] 

Les numéros de citation deviennent zéro.

Commentaires

  • biblatex est écrit pour prendre en charge les bibliographies fractionnées / multiples (parmi de nombreuses autres fonctionnalités), mais il ne prend pas ‘ t officiellement le mélange de bibliographies différentes styles dans un document.

Réponse

Si vous passez loption labelnumber à biblatex vous pouvez utiliser des citations numériques même avec style=alphabetic.

La commande cite peut basculer en fonction mots clés, vous pouvez donc utiliser \cite pour toutes les entrées indépendamment de keyword.

Pour la bibliographie numérique, nous aurons pour définir un nouvel environnement de bibliographie qui imprime les citations numériques. bibliographyNUM est directement copié de numeric.bbx. Pour définir le tri de la bibliographie, dites simplement

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

avant la bibliographie numérique. La bibliographie précédente utilisera le schéma de tri global anyt qui est approprié pour la bibliographie de style alpha. Dans le cas où il est nécessaire de garder lattribution du schéma de tri locale (car la bibliographie numérique précède la bibliographie alpha), vous utiliseriez

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

exemple de sortie

Commentaires

  • Fonctionne parfaitement bien et semble élégant après avoir réinstallé le package biblatex + biber (utilisateur MikTex). Je voulais juste laisser ceci si quelquun sinterroge sur les erreurs  » valeur non initialisée  » également. Assurez-vous également de supprimer tous les fichiers à lexception de .tex car ils peuvent également provoquer des proplems. Belle solution de contournement, merci.
  • @Jannik Avec une version à jour de biblatex et de BIber, il ne devrait pas y avoir de  » valeurs non initialisées  » volant. Si les versions sont plus anciennes ou ne correspondent pas ‘, cependant, ce qui précède ne fonctionnera pas. Après une mise à jour, il est rare de supprimer les fichiers temporaires pour s’assurer qu’aucun ancien élément ne colle et ne pose problème.
  • Si vous ajoutez \newcommand{\letbibmacro}[2]{% \csletcs{abx@macro@#1}{abx@macro@#2}% } \letbibmacro{original-cite}{cite}, vous pouvez utiliser \usebibmacro{original-cite} dans votre nouvelle définition \cite pour insérer le style que vous avez sélectionné lors du chargement (par exemple, authoryear, …) (remplace \printfield{labelalpha}\printfield{extraalpha}).
  • @opatut Bonne idée. Dans certaines situations, lemplacement du code est cependant crucial. Ce nest peut-être pas toujours une bonne idée de ne pas appeler du tout la macro standard (surtout si cela devient plus compliqué et effectue un travail de nettoyage, je ‘ je pense à -icomp styles ici). Ici, il ny aurait pas de problème, je ne pourrais enregistrer une ligne quen déplaçant le \if..., mais vous pouvez le séparer à nouveau.
  • @GandalfLechner Si vous le souhaitez pour conserver vos mots clés dorigine, vous pouvez faire un peu mieux. Consultez la réponse modifiée, sil vous plaît.

Réponse

Merci beaucoup. Je voulais partager ma version adaptée du problème. Jai divisé mon dossard en catégories en définissant différents mots de citation. Il a été copié des sources de driftnet dentreprise, en particulier biblatex: plusieurs bibliographies classées par différents fichiers .bib donc ce nest pas la meilleure pratique, mais cela fonctionne. Espérons que biblatex supportera nativement les styles de bibliographie mixtes à lavenir.

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

Réponse

Faites ce que @moewe dit dutiliser des citations numériques même avec style=alphabetic.

Pour différents ordres de tri, il existe « un moyen beaucoup plus simple, lenvironnement refcontext, qui prend un option de tri. Dabord, utilisez Biblatex pour générer votre bibliographie principale:

\printbibliography[title=Bibliography, keyword=primary] 

Ensuite, créez votre deuxième avec différents types, filtres et styles en lenfermant dans le refcontext avec ceux-ci comme paramètres.

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

Le {} vide comme dernier paramètre de refcontext vous permet de créer un environnement ad hoc sans rien déclarer ailleurs.

Je lai utilisé lorsque mon école mobligeait à inclure un CV à la fin de ma thèse, donc javais besoin de générer une bibliographie de mes travaux à lenvers ordre chronologique en plus de la bibliographie AZ habituelle de larticle. Cétait beaucoup plus propre que ce que jaurais eu.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *