![Группировка страниц в главы при использовании biblatex и backref=true](https://rvso.com/image/298812/%D0%93%D1%80%D1%83%D0%BF%D0%BF%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0%20%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%20%D0%B2%20%D0%B3%D0%BB%D0%B0%D0%B2%D1%8B%20%D0%BF%D1%80%D0%B8%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8%20biblatex%20%D0%B8%20backref%3Dtrue.png)
Раньше я etoolbox
сбрасывал счетчик страниц в каждой главе, не отмеченной звездочкой, и теперь \thepage
печатаю и номер главы, и номер страницы:
\pretocmd{\@chapter}{\setcounter{page}{1}}{}{}
\renewcommand*{\thepage}{\thechapter-\arabic{page}}
Кроме того, я использую biblatex
для печати частичных (в главе, если нужно) и глобальных библиографий (как chapter*
в конце). Когда ссылка цитируется на нескольких страницах главы и в разных главах, эта backref
опция выводит довольно уродливый результат из-за выбранного формата нумерации страниц (см. MWE). Я бы хотел:
Сгруппируйте
biblatex
страницы по главам в обратных ссылках, если[heading=bibliography]
используется опция печати.Сделайте так
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
.