Группировка страниц в главы при использовании biblatex и backref=true

Группировка страниц в главы при использовании biblatex и backref=true

Раньше я etoolboxсбрасывал счетчик страниц в каждой главе, не отмеченной звездочкой, и теперь \thepageпечатаю и номер главы, и номер страницы:

\pretocmd{\@chapter}{\setcounter{page}{1}}{}{}
\renewcommand*{\thepage}{\thechapter-\arabic{page}}

Кроме того, я использую biblatexдля печати частичных (в главе, если нужно) и глобальных библиографий (как chapter*в конце). Когда ссылка цитируется на нескольких страницах главы и в разных главах, эта backrefопция выводит довольно уродливый результат из-за выбранного формата нумерации страниц (см. MWE). Я бы хотел:

  1. Сгруппируйте biblatexстраницы по главам в обратных ссылках, если [heading=bibliography]используется опция печати.

  2. Сделайте так biblatex, чтобы в backref отображались только страницы списка (без номера главы), если [heading=subbibliography]используется опция для его печати.

В MWE backref [ODO95]мы показываем следующие обратные ссылки:

  • В page I:[cit. on chapters 1 (pp. 1, 3), 2 (p. 1)]

  • В page 1-3: [cit. on pp. 1, 3];

  • В page 2-1: [cit. on p. 1].

Когда цитирование делается из любой главы, обратная ссылка в глобальной библиографии должна также показывать страницы. Допустим, мы раскомментируем три строки после \begin{document}в MWE, обратная ссылка в page Iбудет [cit. on chapters 1 (pp. 1, 3), 2 (p. 1); and page i].

МВЭ:

\documentclass[a4paper,titlepage,10pt,twoside,openright]{report}

\usepackage[backend=biber,style=ieee-alphabetic,natbib=true,backref=true]{biblatex}
\addbibresource{IEEEfull.bib}
\addbibresource{IEEEexample.bib}
\usepackage{lipsum}
\usepackage{etoolbox}
\makeatletter
\pretocmd{\@chapter}{\setcounter{page}{1}}{}{}
\makeatother

\begin{document}

%\renewcommand*{\thepage}{\roman{page}}
%\cite{IEEEexample:articledualmonths}
%\clearpage
\renewcommand*{\thepage}{\thechapter-\arabic{page}}

 \chapter{Introduction}
  \begin{refsegment}
   \cite{IEEEexample:articledualmonths} \lipsum[1-10] \cite{IEEEexample:articledualmonths}
  \printbibliography[segment=\therefsegment,heading=subbibliography]
  \end{refsegment}

 \chapter{Second chapter}
  \begin{refsegment}
   \cite{IEEEexample:articledualmonths}
   \cite{IEEEexample:IEEEwebsite}
   \nocite{IEEEexample:book_typical,IEEEexample:article_typical}  
  \printbibliography[segment=\therefsegment,heading=subbibliography]
  \end{refsegment}

\cleardoublepage
\setcounter{page}{1}
\renewcommand*{\thepage}{\Roman{page}}
\printbibliography[heading=bibliography]

\end{document}

Я прочитал несколько вопросов о форматировании обратных ссылок с помощью biblatex[а,б], но они не нацелены на изменение "содержания" списка, а только на формат. Однако я взял один из этих ответов в качестве справочного материала для достижения этого формата:

\newbibmacro*{pageref}{\iflistundef{pageref}{}
 {\finentrypunct\addspace\renewcommand\finentrypunct{}%
  \printtext[parens]{%
   \ifnumgreater{\value{pageref}}{1}%
    {\bibstring{backrefpages}\ppspace}%
    {\bibstring{backrefpage}\ppspace}%
   \printlist[pageref][-\value{listtotal}]{pageref}}}}

Я считаю, что содержимое отображается с помощью \printlist[pageref][-\value{listtotal}]{pageref}. Я читал об этом и о \DeclareListFormatв документации biblatex. Я чувствую, что должен объявить новый формат списка, но я не знаю, как это сделать, и как содержимое подается в него pagerefили считывается из него.


Я спросил другоговопросчтобы знать, как отображать только обратные ссылки внутри сегмента при [heading=subbibliography]использовании вместо отображения вхождений во всем документе.

Однако если \DeclareListFormatнеобходимо описать что-то новое, оба ответа можно объединить.

решение1

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

Код - это комментарии. Прочтите его, пожалуйста.

МВЭ:

\documentclass[a4paper,titlepage,10pt,twoside,openright]{report}

\begin{filecontents}{IEEEexample.bib}
@inBook{Wolff1962,
  Title                    = {Philosophia prima sive Ontologia},
  Author                   = {Wolff, Christian von},
  Editor                   = {Jean Ecole},
  Publisher                = {Olms},
  Address                  = {Hildesheim},
  Year                     = {1962},
  Part                     = {Abt. 2: Lateinische Schriften},
  Maintitle                = {Gesammelte Werke},
  Volume                   = {3},
  langid                   = {german}
}

@inBook{other1999,
  Title                    = {The title in english},
  Author                   = {Last, Name},
  Editor                   = {Editor Name},
  Publisher                = {Springer},
  Address                  = {New York},
  Year                     = {1999},
  Part                     = {1},
  Maintitle                = {The Maintitle},
  Volume                   = {3},
}

@techreport{Natarajan2011,
author = {Natarajan, Nagarajan and Singh-Blom, Ulf Martin and Tewari, Ambuj and Woods, John O and Dhillon, Inderjit S and Marcotte, Edward M},
file = {:Users/jwoods/Downloads/Papers/Natarajan2011.pdf:pdf},
journal = {UTCS Technical Report},
title = {{Predicting gene\textendash disease associations using multiple species data.}},
volume = {TR-11-37},
year = {2011},
type = {techreport},
keywords = {Technical Report}}

@phdthesis{thesis000,
author = {Author Name},
title = {Title of the thesis},
type= {phdthesis},
year = {2011}}
\end{filecontents}

\usepackage[backend=biber,style=ieee-alphabetic,natbib=true,backref=true]{biblatex}
\addbibresource{IEEEexample.bib}
\usepackage{lipsum}
\makeatletter
\pretocmd{\@chapter}{\setcounter{page}{1}}{}{}
\makeatother

\DeclareListParser*{\forpageref}{-} %A parser for the newpage X-x X:chapter and x:the real page

\newcounter{cbcrfpg}%        Counter for how many times is cited by chapter
\providetoggle{chorpg}%      True: Chapter part (X). False: Page part (x) (chapter or page)
\providetoggle{ifbrefcchap}% if backref is into currentchapter
\togglefalse{ifbrefcchap}%

\newcounter{lastchap}%       It is used in the whole bibliograpy. save the last chapter. 
\setcounter{lastchap}{0}


\newcommand{\onlycurrentchapter}[1]{%
  \iftoggle{chorpg}%                    %If is chapter part. (X)
    {\ifnumequal{#1}{\value{chapter}}      % if chapter part is equal to current chapter.
      {\toggletrue{ifbrefcchap}%                % True the backref into currentpage
       \togglefalse{chorpg}}%                   % The next part will be page part (x)
      {\togglefalse{ifbrefcchap}}%         % else: False the backref into currentpage
    }
    {\iftoggle{ifbrefcchap}             %If is page part and backref into currentpage
       {\stepcounter{cbcrfpg}%             % +1 counter of how many times is cited by chapter
        \listgadd{\mylistofpages}{#1}}%    % Add the page into a internal list.
       {}}} 

\DeclareListFormat{selectitemsforprint}{%  A format for manage every element of backref list.
\toggletrue{chorpg}%                       This is used for select only the elements into current 
\forpageref{\onlycurrentchapter}{#1}} %    chapter.

\DeclareListFormat{printallitems}{%  A format for manage every element of backref list.
  \toggletrue{chorpg}%            %  This is used to classify the backref by chapters and print the
  \forpageref{\printallitems}{#1}%%  of the n-1 of total chapters (n).
}

\newcommand{\printallitems}[1]{%
  \iftoggle{chorpg}%                                         %If chapter part (X)    
     {\ifnumequal{\value{lastchap}}{#1}%                       %If the last chapter is equal to current chapter **
         {}%                                                      %nothing
         {\ifnumequal{\value{cbcrfpg}}{0}                      %if the last chapter is different to current chapter and
             {}                                                     % if counter is zero: Nothing
             {\printtext{\addspace\thelastchap\addspace}%           % if different to zero: Prints!! 1. The chapter numbers
              \usebibmacro{printitems}{parens}{pages}{page}%                             % And the items: it means page of the backref.
              \setcounter{cbcrfpg}{0}\undef{\mylistofpages}}%       % And restart the list of pages and counter
         }%seimprimen
      \setcounter{lastchap}{#1}%                               %Save the last chapter**
     }
     {\stepcounter{cbcrfpg}\listgadd{\mylistofpages}{#1}}%     %If is page part: +1 counter and add to list of pages.
      \togglefalse{chorpg}}%

%**(into backref list: exaple [1-1, 1-2] equals chapters)

\renewbibmacro*{pageref}{\iflistundef{pageref}{}                         %The new pageref bibmacro
 {\setcounter{cbcrfpg}{0}\undef{\mylistofpages}\setcounter{lastchap}{0}  % start list of pages, cunters and last chapter
  \printunit{\adddot\space}                                              % Print a dot
  \ifnumequal{\value{refsegment}}{0}                                     % If refsegment is zero, this means global bibliography
     {\printtext[brackets]{\printtext{cite on \chaptername}%             % Print the part: cite on chapter
      \printlist[printallitems][-\value{listtotal}]{pageref}%            % Find and Print the backref of all n-1 chapters
      \printtext{\addspace\thelastchap\addspace}%                        % Print the backref of only n chapter***
      \usebibmacro{printitems}{parens}{pages}{page}%                                          %*** (not print fortwo below line)
     }}
     {\printlist[selectitemsforprint]{pageref}                           % If refsegment different to zero, is a internal bibliography
      \usebibmacro{printitems}{brackets}{backrefpages}{backrefpage}}%                 
     }}

\newbibmacro*{printitems}[3]{%
  \printtext[#1]{%                                                        % Print into brackets
  \ifnumgreater{\value{cbcrfpg}}{1}%                                      % If counter greater to 1
    {\bibstring{#2}}                                                            %Print cite #2 bibstring 
    {\bibstring{#3}}                                                      % else: %Print cite #2 bibstring 
  \forlistloop{\printtext\newunit}{\mylistofpages}}}                      %Print the listofpages items.using \printtext{\newunit\thepagepart}


\begin{document}
\renewcommand*{\thepage}{\thechapter-\arabic{page}}
 \chapter{Introduction}
  \begin{refsegment}
   \cite{Wolff1962} \lipsum[1-10]
    \cite{Wolff1962}
  \printbibliography[segment=\therefsegment,heading=subbibliography]
  \end{refsegment}

 \chapter{Second chapter}
  \begin{refsegment}
   \cite{Wolff1962}
   \cite{other1999}
   \nocite{Natarajan2011,thesis000}  
  \printbibliography[segment=\therefsegment,heading=subbibliography]
  \end{refsegment}


\cleardoublepage
\setcounter{page}{1}
\renewcommand*{\thepage}{\Roman{page}}
\printbibliography[heading=bibliography]

\end{document}

ИЗОБРАЖЕНИЙ

page 1-3.

введите описание изображения здесь

page 2-1.

введите описание изображения здесь

page I.

введите описание изображения здесь

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