使用 biblatex 和 backref=true 时按章节对页面进行分组

使用 biblatex 和 backref=true 时按章节对页面进行分组

我曾经etoolbox在每个非星号章节中重置页码计数器,并且我已将其改为\thepage同时打印章节号和页码:

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

除此之外,我还用它biblatex来打印部分(如果需要,可以在一章中打印)和全局书目(作为chapter*末尾的)。当在一章的几页和不同的章节中引用参考文献时,backref由于所选的页码格式(请参阅 MWE),该选项打印的结果相当丑陋。我想:

  1. 当使用该选项打印时,将biblatex页面分组为 backrefs 中的章节。[heading=bibliography]

  2. 当使用选项打印时,只显示biblatexbackref 中的列表页面(不包含章节号) 。[heading=subbibliography]

在 MWE 中,[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[格式化反向引用的问题Ab],但它们的目标不是改变列表的“内容”,而只是改变格式。不过,我参考了其中一个答案来实现这种格式:

\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}读到了关于它的内容。我觉得我应该声明一种新的列表格式,但我不知道该怎么做,也不知道如何将内容输入其中或从中读取内容。\DeclareListFormatbiblatexpageref


我问了另一个问题知道如何在[heading=subbibliography]使用时仅显示段内的反向引用,而不是显示整个文档中的出现情况。

然而,如果\DeclareListFormat必须描述新的内容,则两个答案可能会合并。

答案1

这很可能不是最好的形式,但这在问题所建议的形式下是可行的。 bibentries 是泛型

代码是注释。请阅读。

梅威瑟:

\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

在此处输入图片描述

相关内容