Biblatex: отображение библиографической группировки по типу при сортировке по году в порядке убывания

Biblatex: отображение библиографической группировки по типу при сортировке по году в порядке убывания

Я пытаюсь сделать свое резюме и хотел бы создать библиографию с помощью Biblatex. В резюме у меня есть различные разделы для перечисления моих опубликованных книг и журнальных статей, при этом в каждом разделе я хочу отсортировать все пункты по году, начиная с самого последнего.

Мне удалось отсортировать записи по году в порядке убывания после ответа @moewe:https://tex.stackexchange.com/a/434393/173148. Однако при печати библиографии по разделам были показаны годы всех публикаций, а не только годы текущего раздела.

Редактировать: Кроме того, поскольку это есть в резюме, мне нужно распечатать библиографию для разных типов в разных местах, а не распечатывать все сразу.

пример изображения

Код, который я использовал для получения этого результата:

\documentclass{article}
\usepackage[style=authoryear,sorting=ydnt]{biblatex}
\usepackage{filecontents}

\begin{filecontents}{\jobname.bib}
@book{book1,
  author = {author1},
  date = {1862},
  title = {Book1},
}
@book{book2,
  author = {author1 and author2},
  date = {1831},
  title = {Book2},
}
@article{article1,
  title={title1},
  author={author1 and author2},
  journal={journal1},
  volume={1},
  number={1},
  pages={1},
  year={1841}
}
@article{article2,
  title={title2},
  author={author2},
  journal={journal2},
  volume={2},
  number={2},
  pages={2},
  year={1842}
}
\end{filecontents}

\addbibresource{\jobname.bib}

\usepackage{xparse}

\ExplSyntaxOn
\seq_new:N \g__blxbibbyyear_yearlist_seq

\cs_new:Npn \__blxbibbyyear_seq_gput_right_once:Nn #1 #2
  {
    \seq_if_in:NnF #1 {#2}
      { \seq_gput_right:Nn #1 {#2} }
  }

\cs_generate_variant:Nn \__blxbibbyyear_seq_gput_right_once:Nn { NV, Nx }


\prg_new_conditional:Nnn \blx_field_if_undef:n { p, T, F , TF }
  {
    \use:c { iffieldundef } { #1 } { \prg_return_true: } { \prg_return_false: }
  }

% unfortunately, \iffieldint is not expandable, so no p version for us, boo
\prg_new_protected_conditional:Nnn \blx_field_if_int:n { T, F , TF }
  {
    \iffieldint { #1 } { \prg_return_true: } { \prg_return_false: }
  }

\AtDataInput
  {
    \blx_field_if_undef:nF { labeldatesource }
      { 
        \blx_field_if_undef:nTF { \thefield{labeldatesource}year }
          {
            \blx_field_if_undef:nF { \thefield{labeldatesource} }
              {
                \blx_field_if_int:nT { \thefield{labeldatesource} }
                  {
                    \__blxbibbyyear_seq_gput_right_once:Nx \g__blxbibbyyear_yearlist_seq
                      { \thefield{\thefield{labeldatesource}} }
                  }
              }
          }
          {
            \__blxbibbyyear_seq_gput_right_once:Nx \g__blxbibbyyear_yearlist_seq
              { \thefield{\thefield{labeldatesource}year} }
          }
      }
  }

\cs_new:Npn \blxbibbyyear_seq_sort_bydirection:NN #1 #2
  {
    \seq_sort:Nn #2
      {
         \int_compare:nNnTF { ##1 } #1 { ##2 }
          { \sort_return_swapped: }
          { \sort_return_same: }
      }
  }

\cs_new:Nn \blxbibbyyear_seq_sort_descending:N
  {
    \blxbibbyyear_seq_sort_bydirection:NN < #1
  }

\cs_new_nopar:Npn \blxbibbyyear_print_yearbib:nn #1 #2
  {
    \defbibcheck{thisyear}
      {
        \blx_field_if_int:nTF { labelyear }
          {
            \int_compare:nNnF { \thefield{labelyear} } = { #1 }
              { \skipentry }
          }
          { \skipentry }
      }
    \printbibliography[heading=subbibliography, title=#1, check=thisyear, #2]
  }


\DeclareDocumentCommand{\printbibbyyear}{O{}}
  {
    \blxbibbyyear_seq_sort_descending:N \g__blxbibbyyear_yearlist_seq
    \seq_map_inline:Nn \g__blxbibbyyear_yearlist_seq
      { \blxbibbyyear_print_yearbib:nn {##1} {#1} }
  }
\ExplSyntaxOff

\begin{document}
\section{Books}
\nocite{*}
\printbibbyyear[type=book]
\section{Articles}
\nocite{*}
\printbibbyyear[type=article]
\end{document}

решение1

Коду нужно несколько модификаций, чтобы также разделить по типу. По сути, вместо одного списка, который собирает годы публикаций ( \g__blxbibbyyear_yearlist_seq), нам нужен один список для каждого типа ( g__bblxbibbyyear_yearlist_<type>_seq, и список типов). Общая идея кода может остаться, и большинство вещей можно просто переключить с аргументов типа N/ nна c.

Теперь есть две команды. \printbibbytypeyearразбивает всю библиографию по типу и году. \printbibtypebyyear{<type>}разбивает только записи типа <type>по году.

\documentclass{article}
\usepackage[style=authoryear,sorting=ydnt]{biblatex}

\usepackage{xparse}

\ExplSyntaxOn
\seq_new:N \g__blxbibbyyear_typelist_seq

\cs_new:Npn \__blxbibbyyear_seq_gput_right_once:Nn #1 #2
  {
    \seq_if_in:NnF #1 {#2}
      { \seq_gput_right:Nn #1 {#2} }
  }

\cs_generate_variant:Nn \__blxbibbyyear_seq_gput_right_once:Nn { NV, Nx, cV, cx }


\prg_new_conditional:Npnn \blx_field_if_undef:n #1 { p, T, F , TF }
  {
    \use:c { iffieldundef } { #1 } { \prg_return_true: } { \prg_return_false: }
  }

% unfortunately, \iffieldint is not expandable, so no p version for us, boo
\prg_new_protected_conditional:Npnn \blx_field_if_int:n #1 { T, F , TF }
  {
    \iffieldint { #1 } { \prg_return_true: } { \prg_return_false: }
  }
\prg_new_protected_conditional:Npnn \blx_field_if_eq_str:nn #1 #2 { T, F , TF }
  {
    \iffieldequalstr { #1 } { #2 } { \prg_return_true: } { \prg_return_false: }
  }

\AtDataInput
  {
    \seq_if_exist:cF { g__bblxbibbyyear_yearlist_\thefield{entrytype}_seq }
      {
        \seq_new:c { g__bblxbibbyyear_yearlist_\thefield{entrytype}_seq }
        \__blxbibbyyear_seq_gput_right_once:Nx \g__blxbibbyyear_typelist_seq
          { \thefield{entrytype} }
      }  
    \blx_field_if_undef:nF { labeldatesource }
      { 
        \blx_field_if_undef:nTF { \thefield{labeldatesource}year }
          {
            \blx_field_if_undef:nF { \thefield{labeldatesource} }
              {
                \blx_field_if_int:nT { \thefield{labeldatesource} }
                  {
                    \__blxbibbyyear_seq_gput_right_once:cx
                      { g__bblxbibbyyear_yearlist_\thefield{entrytype}_seq }
                      { \thefield{\thefield{labeldatesource}} }
                  }
              }
          }
          {
            \__blxbibbyyear_seq_gput_right_once:cx
              { g__bblxbibbyyear_yearlist_\thefield{entrytype}_seq }
              { \thefield{\thefield{labeldatesource}year} }
          }
      }
  }

\cs_new:Npn \blxbibbyyear_seq_sort_bydirection:NN #1 #2
  {
    \seq_gsort:Nn #2
      {
         \int_compare:nNnTF { ##1 } #1 { ##2 }
          { \sort_return_swapped: }
          { \sort_return_same: }
      }
  }

\cs_new:Nn \blxbibbyyear_seq_sort_descending:N
  {
    \blxbibbyyear_seq_sort_bydirection:NN < #1
  }

\cs_generate_variant:Nn \blxbibbyyear_seq_sort_descending:N { c }

\cs_new_nopar:Npn \blxbibbyyear_print_yeartypebib:nnn #1 #2 #3 #4
  {
    \defbibcheck{thisyear}
      {
        \blx_field_if_int:nTF { labelyear }
          {
            \int_compare:nNnF { \thefield{labelyear} } = { #2 }
              { \skipentry }
          }
          { \skipentry }
      }
    \printbibliography[heading=subbibliography, title=#3, type=#1, check=thisyear, #4]
  }


\DeclareDocumentCommand{\printbibbytypeyear}{O{}}
  {
    \seq_map_inline:Nn \g__blxbibbyyear_typelist_seq
      { 
        \blxbibbyyear_seq_sort_descending:c { g__bblxbibbyyear_yearlist_##1_seq }
        \seq_map_inline:cn { g__bblxbibbyyear_yearlist_##1_seq }
          {
            \blxbibbyyear_print_yeartypebib:nnn { ##1 } { ####1 } { ##1~from~####1 } { #1 }
          }
      }
  }

\DeclareDocumentCommand{\printbibtypebyyear}{O{}m}
  {
    \blxbibbyyear_seq_sort_descending:c { g__bblxbibbyyear_yearlist_#2_seq }
    \seq_map_inline:cn { g__bblxbibbyyear_yearlist_#2_seq }
      {
        \blxbibbyyear_print_yeartypebib:nnn { #2 } { ##1 } { ##1 } { #1 }
      }
  }
\ExplSyntaxOff


\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@book{book1,
  author = {author1},
  date = {1862},
  title = {Book1},
}
@book{book2,
  author = {author1 and author2},
  date = {1831},
  title = {Book2},
}
@book{book3,
  author = {author1 and author2},
  date = {1842},
  title = {Book2},
}
@article{article1,
  title={title1},
  author={author1 and author2},
  journal={journal1},
  volume={1},
  number={1},
  pages={1},
  year={1841}
}
@article{article2,
  title={title2},
  author={author2},
  journal={journal2},
  volume={2},
  number={2},
  pages={2},
  year={1842}
}
@article{article3,
  title={title2},
  author={author2},
  journal={journal2},
  volume={2},
  number={2},
  pages={2},
  year={1842}
}
\end{filecontents}
\addbibresource{\jobname.bib}

\begin{document}
\nocite{*}

\printbibtypebyyear{book}

\printbibtypebyyear{article}

\printbibbytypeyear
\end{document}

Раздельные библиографии по типу и году

Связанный контент