Biblatex: Duas bibliografias com estilos e classificações diferentes

MWE para o problema que encontrei:

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

O problema: preciso de duas bibliografias, a primeira com estilo alfabético e classificada por nome do autor. O segundo em estilo numérico classificado por ordem de citação. Ambos não têm referências comuns. De alguma forma, estou procurando algo assim no biblatex:

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

Achei que o biblatex foi escrito especialmente para trabalhar com várias bibliografias, mas não encontrei nenhuma diferente da mostrada no MWE (que obviamente é um hack). Na verdade, funciona muito bem até que eu queira a outra classificação. Quando eu uso

\newrefcontext[sorting=none] 

Os números das citações tornam-se zero.

Comentários

  • biblatex foi escrito para oferecer suporte a bibliografias divididas / múltiplas (entre muitos outros recursos), mas não ‘ suporta oficialmente a mistura de bibliografias diferentes estilos em um documento.

Resposta

Se você passar a opção labelnumber para biblatex você pode usar citações numéricas mesmo com style=alphabetic.

O comando cite pode alternar com base em palavras-chave, para que você possa usar \cite para todas as entradas, independentemente de keyword.

Para a bibliografia numérica, teremos para definir um novo ambiente de bibliografia que imprima citações numéricas. bibliographyNUM é copiado diretamente de numeric.bbx. Para definir a classificação da bibliografia, basta dizer

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

antes da bibliografia numérica. A bibliografia anterior usará o esquema de classificação global anyt que é apropriado para bibliografia de estilo alfa. Caso seja necessário manter a atribuição do esquema de classificação local (porque a bibliografia numérica vem antes da bibliografia alfa), você usaria

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

exemplo de saída

Comentários

  • Funciona perfeitamente bem e parece elegante depois de reinstalar o pacote biblatex + biber (usuário MikTex). Queria apenas deixar isto se alguém questionar sobre ” valor não inicializado ” erros também. Certifique-se também de excluir todos os arquivos, exceto .tex, pois eles também podem causar problemas. Boa solução, obrigado.
  • @Jannik Com uma versão atualizada de biblatex e BIber, não deve haver ” valores não inicializados ” voando. Se as versões forem mais antigas ou ‘ não corresponder, no entanto, o acima não funcionará. Após uma atualização, raramente custa excluir os arquivos temporários para garantir que nenhum material antigo grude e cause problemas.
  • Se você adicionar \newcommand{\letbibmacro}[2]{% \csletcs{abx@macro@#1}{abx@macro@#2}% } \letbibmacro{original-cite}{cite}, poderá usar \usebibmacro{original-cite} dentro de sua nova \cite definição para inserir qualquer estilo que você selecionou no carregamento (por exemplo, autoria, …) (substitui \printfield{labelalpha}\printfield{extraalpha}).
  • @opatut Boa ideia. Em algumas situações, o posicionamento do código é crucial. Também pode não ser sempre uma boa ideia simplesmente não chamar a macro padrão (especialmente se ficar mais complicada e realizar um trabalho de limpeza, eu ‘ estou pensando em -icomp estilos aqui). Aqui não haveria um problema, eu só poderia salvar uma linha movendo o \if... ao redor, mas você poderia separar isso novamente.
  • @GandalfLechner Se desejar para reter suas palavras-chave originais, você pode fazer um pouco melhor. Veja a resposta editada, por favor.

Resposta

Muito obrigado. Eu queria compartilhar minha versão adaptada do problema. Eu dividi meu Bib em categorias, definindo palavras de citação diferentes. Foram copiadas fontes firmes de driftnet, especialmente biblatex: múltiplas bibliografias categorizadas por diferentes arquivos .bib , portanto, não é a melhor prática, mas funciona. Esperançosamente, o biblatex oferecerá suporte nativo a estilos bibliográficos mistos no futuro.

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

Resposta

Faça o que @moewe diz para usar citações numéricas mesmo com style=alphabetic.

Para diferentes ordens de classificação, há uma maneira muito mais fácil, o ambiente refcontext, que usa um opção de classificação. Primeiro, use o Biblatex para gerar sua bibliografia principal:

\printbibliography[title=Bibliography, keyword=primary] 

Em seguida, crie seu segundo com diferentes classificações, filtros e estilos, incluindo-o o refcontext com aqueles como parâmetros.

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

O {} vazio como o último parâmetro de refcontext permite criar um ambiente ad hoc sem declarar nada em outro lugar.

Usei isso quando minha escola exigiu que eu incluísse um currículo no final da minha tese, então precisei gerar uma bibliografia de meus trabalhos ao contrário ordem cronológica, além da bibliografia usual de AZ para o artigo. Era muito mais limpo do que o que eu tinha.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *