Agrupando bibliografias classificadas por langid

Agrupando bibliografias classificadas por langid

Eu sei que posso agrupar bibliografias por palavra-chave. Mas este não é o caso, porque se eu não usar classificação alfabética e estilo numérico posso dividir a bibliografia por palavras-chave. Mas se eu quiser bibliografia ordenada e numeração numérica e tentar dividi-la, quebrarei a numeração. O que eu preciso é ter itens de babador de algum idioma antes de itens de outro idioma. Exemplo:

\documentclass[a4paper]{article}
\usepackage{fontspec}
\usepackage[english,greek,russian]{babel} % English please
\setmainfont[
BoldFont={DeJavu Serif Bold},
ItalicFont={DeJavu Serif Italic},
BoldItalicFont={DeJavu Serif BoldItalic}
]{DeJavu Serif}
\usepackage{filecontents}
\begin{filecontents*}{\jobname.bib}
@Book{AlKarapan,
author = {Καραπαναγοπούλου, Αλέξανδρος Κ.},
title = {Η Μεγάλη Σύνοδος της Ορθοδόξου Ανατολικής Εκκλησίας},
publisher = {auto-édition},
date = {1990/1998},
volumes = {6},
address = {Αθήνα},
langid={greek},
}
@Inbook{CypinIstorijaRPC,
author = {Владислав Цыпин},
title = {История Русской Церкви 1917--1997},
chapter = {VIII},
publisher = {Издательство Спасо-Преображенского Валаамского монастыря},
address = {Москва},
date = {1997},
urldate = {2010-10-25},
url = {http://old.pravoslavie.by/podpod.asp?id=135&Session=10},
langid={russian},
}
@Inbook{authorrus,
    author = {Другой Автор},
    title = {Название},
    chapter = {VIII},
    publisher = {Издательство},
    address = {Москва},
    date = {1997},
    urldate = {2010-10-25},
    langid={russian},
}
@article{baez/article,
    author       = {Baez, John C. and Lauda, Aaron D.},
    title        = {Higher-Dimensional Algebra {V}: 2-Groups},
    journaltitle = {Theory and Applications of Categories},
    date         = 2004,
    volume       = 12,
    pages        = {423-491},
    version      = 3,
    eprint       = {math/0307200v3},
    eprinttype   = {arxiv},
    langid       = {english},
    langidopts   = {variant=american},
    annotation   = {An \texttt{article} with \texttt{eprint} and
        \texttt{eprinttype} fields. Note that the arXiv reference is
        transformed into a clickable link if \texttt{hyperref} support
        has been enabled.  Compare \texttt{baez\slash online}, which
        is the same item given as an \texttt{online} entry},
    hyphenation={english},
}
@article{another,
    author       = {Another,Author and One more, Author},
    title        = {Title},
    journaltitle = {Journal},
    date         = 2004,
    volume       = 12,
    pages        = {423-491},
    version      = 3,
    eprint       = {math/0307200v3},
    eprinttype   = {arxiv},
    langid       = {english},
    langidopts   = {variant=american},
    hyphenation={english},
}
\end{filecontents*}

\usepackage[russian,greek,english]{babel}
\usepackage[natbib=true,
style=numeric,
isbn=true,
url=true,
defernumbers=false,
sorting=nyt, 
firstinits=true,
backend=biber,
language=auto,  
autolang=other]{biblatex}

\addbibresource{\jobname.bib}

\begin{document}
\cite{AlKarapan,CypinIstorijaRPC,baez/article}
\nocite{*}
\printbibliography
\end{document}

a saída será: itens em inglês, depois em grego e em russo. Se eu editar o arquivo bbl, apenas movendo as entradas em russo no início, depois as entradas em grego e a última entrada em inglês enão corra biberapenas cite as entradas e execute lualatex ou xelatex, tudo ficará bem.

Biblatex/Biber classifica a bibliografia e movo manualmente as entradas para um determinado idioma no arquivo bbl. Recebo entradas classificadas para um determinado idioma e ordem de idioma que desejo.

Pergunta: posso fazer esse tipo de pedido sem editar o arquivo bbl

é isso que estou tentando conseguir bibliografia após mover entradas

Não posso usar vários babadores porque preciso de numeração contínua

Responder1

É claro que podemos simplesmente colocar a \sort{\field{langid}}no procedimento de classificação, mas isso classificará os idiomas lexicograficamente, de modo que o inglês aparecerá primeiro, depois o grego e depois o russo, não exatamente o que você deseja.

Mas, aliás, se classificarmosdescendentelexicograficamente obtemos a ordem que você deseja no MWE.

\DeclareSortingScheme{lnyt}{
  \sort{
    \field{presort}
  }
  \sort[final]{
    \field{sortkey}
  }
  \sort[direction=descending]{\field{langid}}
  \sort{
    \field{sortname}
    \field{author}
    \field{editor}
    \field{translator}
    \field{sorttitle}
    \field{title}
  }
  \sort{
    \field{sortyear}
    \field{year}
  }
  \sort{
    \field{sorttitle}
    \field{title}
  }
  \sort{
    \field[padside=left,padwidth=4,padchar=0]{volume}
    \literal{0000}
  }
}

É claro que isso ocorre apenas porque a ordem de classificação desejada coincide com a ordem lexicográfica inversa dos nomes dos idiomas.

Use sorting=lnytagora.


Uma solução mais personalizável, mas um pouco mais complicada, usa o presortcampo e o recurso de mapeamento de origem do Biber.

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map{
      \step[fieldsource=langid, match=\regexp{\Arussian\Z}, final]
      \step[fieldset=presort, fieldvalue=1]
    }
    \map{
      \step[fieldsource=langid, match=\regexp{\Agreek\Z}, final]
      \step[fieldset=presort, fieldvalue=2]
    }
    \map{
      \step[fieldsource=langid, match=\regexp{\Aenglish\Z}, final]
      \step[fieldset=presort, fieldvalue=3]
    }
  }
}

Cada idioma é simplesmente mapeado para um número escrito no presortcampo. O presortcampo é considerado antes dos outros campos de classificação.

Isso permite ordens de classificação que não seguem nenhuma ordem lexicográfica.

MWE

\documentclass[a4paper]{article}
\usepackage{fontspec}
\usepackage[english,greek,russian]{babel} % English please
\setmainfont[
BoldFont={DeJavu Serif Bold},
ItalicFont={DeJavu Serif Italic},
BoldItalicFont={DeJavu Serif BoldItalic}
]{DeJavu Serif}
\usepackage{filecontents}
\begin{filecontents*}{\jobname.bib}
@Book{AlKarapan,
author = {Καραπαναγοπούλου, Αλέξανδρος Κ.},
title = {Η Μεγάλη Σύνοδος της Ορθοδόξου Ανατολικής Εκκλησίας},
publisher = {auto-édition},
date = {1990/1998},
volumes = {6},
address = {Αθήνα},
langid={greek},
}
@Inbook{CypinIstorijaRPC,
author = {Владислав Цыпин},
title = {История Русской Церкви 1917--1997},
chapter = {VIII},
publisher = {Издательство Спасо-Преображенского Валаамского монастыря},
address = {Москва},
date = {1997},
urldate = {2010-10-25},
url = {http://old.pravoslavie.by/podpod.asp?id=135&Session=10},
langid={russian},
}
@Inbook{authorrus,
    author = {Другой Автор},
    title = {Название},
    chapter = {VIII},
    publisher = {Издательство},
    address = {Москва},
    date = {1997},
    urldate = {2010-10-25},
    langid={russian},
}
@article{baez/article,
    author       = {Baez, John C. and Lauda, Aaron D.},
    title        = {Higher-Dimensional Algebra {V}: 2-Groups},
    journaltitle = {Theory and Applications of Categories},
    date         = 2004,
    volume       = 12,
    pages        = {423-491},
    version      = 3,
    eprint       = {math/0307200v3},
    eprinttype   = {arxiv},
    langid       = {english},
    langidopts   = {variant=american},
    annotation   = {An \texttt{article} with \texttt{eprint} and
        \texttt{eprinttype} fields. Note that the arXiv reference is
        transformed into a clickable link if \texttt{hyperref} support
        has been enabled.  Compare \texttt{baez\slash online}, which
        is the same item given as an \texttt{online} entry},
    hyphenation={english},
}
@article{another,
    author       = {Another,Author and One more, Author},
    title        = {Title},
    journaltitle = {Journal},
    date         = 2004,
    volume       = 12,
    pages        = {423-491},
    version      = 3,
    eprint       = {math/0307200v3},
    eprinttype   = {arxiv},
    langid       = {english},
    langidopts   = {variant=american},
    hyphenation={english},
}
\end{filecontents*}

\usepackage[russian,greek,english]{babel}
\usepackage[natbib=true,
style=numeric,
isbn=true,
url=true,
defernumbers=false,
sorting=nyt, 
firstinits=true,
backend=biber,
language=auto,  
autolang=other]{biblatex}

\addbibresource{\jobname.bib}

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map{
      \step[fieldsource=langid, match=\regexp{\Arussian\Z}, final]
      \step[fieldset=presort, fieldvalue=1]
    }
    \map{
      \step[fieldsource=langid, match=\regexp{\Agreek\Z}, final]
      \step[fieldset=presort, fieldvalue=2]
    }
    \map{
      \step[fieldsource=langid, match=\regexp{\Aenglish\Z}, final]
      \step[fieldset=presort, fieldvalue=3]
    }
  }
}

\begin{document}
\cite{AlKarapan,CypinIstorijaRPC,baez/article}
\nocite{*}
\printbibliography
\end{document}

insira a descrição da imagem aqui

Responder2

A seguir está uma versão simplificada da resposta de moewe.


Um arquivo fonte BibTeX

O seguinte arquivo BibTeX é salvo em formato ~/TestBib.bib.

@book{shakespeare,
   author = {William Shakespeare},
   title = {Hamlet},
   year = {1600},
   langid = {english}
}
@book{homer,
   author = {Homer},
   title = {Illiad \& Oddysey},
   year = {8th century BC},
   langid = {greek}
}
@book{tolstoy,
   author = {Leo Tolstoy},
   title = {War and Peace},
   year = {1869},
   langid = {russian}
}

Um documento LaTeX simples com uma bibliografia

\documentclass{article}
\usepackage{biblatex}
\addbibresource{TestBib.bib}
\begin{document}
\cite{shakespeare}\cite{homer}\cite{tolstoy}
\printbibliography
\end{document}

O resultado da corrida

> cd ~
> teste lualatex
> teste biber
> teste lualatex

é

Saída não adulterada


Inglês primeiro, os demais de acordo com a ordem padrão

\documentclass{article}
\usepackage{biblatex}
\DeclareSourcemap {
   \maps {
      \map {
         \step [
            fieldsource=langid,
            match=english,
            fieldset=presort,
            fieldvalue=a
         ]
      }
   }
}
\addbibresource{TestBib.bib}
\begin{document}
\cite{shakespeare}\cite{homer}\cite{tolstoy}
\printbibliography
\end{document}

Inglês primeiro


Primeiro inglês, segundo russo

Adicionaremos agora um mapa de origem para ordenar as entradas bibliográficas de tal forma que a entrada em inglês seja a primeira e a entrada em russo seja a segunda.

\documentclass{article}
\usepackage{biblatex}
\DeclareSourcemap {
   \maps {
      \map {
         \step [
            fieldsource=langid,
            match=english,
            fieldset=presort,
            fieldvalue=a
         ]
         \step [
            fieldsource=langid,
            match=russian,
            fieldset=presort,
            fieldvalue=b
         ]
      }
   }
}
\addbibresource{TestBib.bib}
\begin{document}
\cite{shakespeare}\cite{homer}\cite{tolstoy}
\printbibliography
\end{document}

A saída é:

Primeiro inglês, segundo russo


Notas

  1. Não há necessidade de passar a datatype=bibtexopção para \maps(como feito na resposta de moewe), pois bibtexé o valor padrão da datatypeopção. Veja pág. 199 do biblatexmanual, v. 3.18b, 12 de julho de 2022.

  2. Não há necessidade de agrupar regexps \regexp(como feito na resposta de moewe), a menos que contenham sequências de caracteres que também sejam comandos TEX válidos. Veja pág. 204 do manual.

  3. O tipo de dados do valor do presortcampo especial é interpretado biblatexcomo uma string, não como um número. (Veja a página 31 do manual.) A ordem que se aplica aos seus valores é, portanto, lexicográfica e não numérica. Portanto, na minha opinião, é melhor evitar atribuir números a este campo (como feito na resposta de moewe), para evitar consequências não intuitivas. Por exemplo, se no meu exemplo "Inglês primeiro, Russo depois" eu tivesse atribuído à entrada em inglês um presortvalor de 2e à entrada em russo um presortvalor de 10, a entrada em russo acabaria aparecendo antes da entrada em inglês na bibliografia.

  4. A menos que seja explicitamente especificado, o campo de uma entrada bibliográfica presorté automaticamente definido como mm. (Veja o segundo parágrafo da seção 3.6 'Opções de classificação' na página 83 do manual.) Portanto, se houver exatamente três valores diferentes pelos quais langidvocê deseja ordenar, você não precisa especificar explicitamente o presortvalor de todos os três. deles (como feito na resposta de moewe). Basta especificar o presortvalor explícito de apenas dois deles e garantir que ambos sejam lexicograficamente menores que mm.

    Esta também é uma informação útil para saber se você deseja que certas entradas apareçam no topo da bibliografia, mas não se importa em especificar a ordem relativa do restante das entradas, como fiz no meu " Inglês primeiro, os demais de acordo com o exemplo de ordenação padrão.

    Observe que os mapeamentos de origem acontecem antes de qualquer modelo de classificação, incluindo os padrões integrados, descritos nos apêndices C1-C3 do manual, serem aplicados. (Veja o segundo parágrafo da seção 4.5.3 'Modificação Dinâmica de Dados' na pág. 199 do manual.) Portanto, se você usar qualquer um dos modelos de classificação padrão, diga ntyqual é o modelo de classificação padrão usado, caso não o faça. especificar explicitamente qualquer modelo de classificação (veja seção 3.1.2.1 'Opções de pacote/Opções de preâmbulo/Geral' na pág. 48 do manual), a ordem das entradas dentro de cada presortgrupo será a esperada, ou seja, conforme prescrito pelo modelo.

  5. Se organizado criteriosamente, o número de steps e maps pode ser reduzido significativamente, e o número de finals pode ser reduzido ou mesmo eliminado. Compare a resposta de moewe com meu exemplo "primeiro inglês, segundo russo".

  6. Em relação à semântica da finalconsultaesta resposta de moewe, uma vez que o manual não é claro e até enganoso sobre o assunto.

informação relacionada