在参考书目中打印引用的页码范围

在参考书目中打印引用的页码范围

我需要在参考书目中打印所引用书籍的实际引用页码范围。例子 后缀[10--20]应该压缩为10 f.10 ff.,但在打印的参考书目中,由于p. 10--20 我不知道如何实现,我搜索了命令但没有结果。 压缩页面范围仅给出如何压缩页面范围的10-19示例10-9

解决此问题的一条可能途径是通过此 MWE:

\documentclass{scrreprt}
\usepackage[latin1]{inputenc}
\usepackage[ 
bibstyle=test, citestyle=test 
]{biblatex}

\begin{filecontents*}{books.bib}
@BOOK{scrubs,
  author = {John Dorian},
  title = {How to endure girls names},
  year = {2009},
  edition = {8}
  publisher = {Cox publishing}
}

\end{filecontents*}

\bibliography{books.bib}

\begin{document}
\cite[10--20]{scrubs}

\printbibliography
\end{document}

和我的 bbx 文件

\newbibmacro*{begentry}{}
\newbibmacro*{finentry}{\finentry}

\DeclareBibliographyDriver{book}{%
  \usebibmacro{bibindex}%
  \usebibmacro{begentry}%
  \usebibmacro{author/editor+others/translator+others}%
  \setunit{\labelnamepunct}\newblock
  \usebibmacro{maintitle+title}%
  \newunit\newblock
  \usebibmacro{byauthor}%
  \newunit\newblock
  \usebibmacro{byeditor+others}%
  \newunit\newblock
  \printfield{edition}%
  \newunit
  \iffieldundef{maintitle}
    {\printfield{volume}%
     \printfield{part}}
    {}%
  \newunit
  \printfield{volumes}%
  \newunit\newblock
  \usebibmacro{series+number}%
  \newunit\newblock
  \printfield{note}%
  \newunit\newblock
  \usebibmacro{publisher+location}%
  \newunit\newblock
  \usebibmacro{p.}
  \usebibmacro{chapter+pages}%
  \newunit\newblock
  \usebibmacro{date}%
  \usebibmacro{addendum+pubstate}%
  \setunit{\bibpagerefpunct}\newblock
  \usebibmacro{pageref}%
  \usebibmacro{finentry}}



\newbibmacro*{maintitle+title}{%
  \iffieldsequal{maintitle}{title}
    {\clearfield{maintitle}%
     \clearfield{mainsubtitle}%
     \clearfield{maintitleaddon}}
    {\iffieldundef{maintitle}
       {}
       {\usebibmacro{maintitle}%
    \newunit\newblock
    \iffieldundef{volume}
      {}
      {\printfield{volume}%
           \printfield{part}%
           \setunit{\addcolon\space}}}}%
  \usebibmacro{title}%
  \newunit}

\newbibmacro*{maintitle+booktitle}{%
  \iffieldundef{maintitle}
    {}
    {\usebibmacro{maintitle}%
     \newunit\newblock
     \iffieldundef{volume}
       {}
       {\printfield{volume}%
        \printfield{part}%
        \setunit{\addcolon\space}}}%
  \usebibmacro{booktitle}%
  \newunit}

\newbibmacro*{volume}{%
  \printfield{volume}%
  \setunit*{\adddot}%
  }


\newbibmacro*{series+number}{%
  \printfield{series}%
  \setunit*{\addspace}%
  \printfield{number}%
  \newunit}

\newbibmacro*{publisher+location}{%
    \iflistundef{publisher}
    {}
  \printlist{publisher}%
  \setunit*{\addcomma\space}
  \printlist{location}%
  \setunit*{\addcomma\space}%
  \newunit}

\newbibmacro*{chapter+pages}{%
  \printfield{chapter}%
  \setunit{\bibpagespunct}%
  \printfield{pages}%
  \newunit}

\newbibmacro*{addendum+pubstate}{%
  \printfield{addendum}%
  \newunit\newblock
  \printfield{pubstate}}



\newbibmacro*{p.}{%
  \printtext{p. }}
\endinput

和我的 cbx 文件

% $Id: test.cbx,v 1.7 2011/11/13 19:09:07 lehman stable $

\ProvidesFile{test.cbx}
[\abx@cbxid $Id: verbose-inote.cbx,v 1.7 2011/11/13 19:09:07 lehman stable $]

\providebool{bbx:subentry}

\DeclareFieldFormat{entrysetcount}{\mknumalph{#1}}
\newbibmacro*{cite}{%
  \printtext[bibhyperref]{%
    \printfield{prefixnumber}%
    \printfield{labelnumber}%
    \ifbool{bbx:subentry}
      {\printfield{entrysetcount}}
      {}}}

\DeclareCiteCommand{\cite}[\mkbibbrackets]
  {\usebibmacro{prenote}}
  {\usebibmacro{citeindex}%
   \usebibmacro{cite}}
  {\multicitedelim}
  {\usebibmacro{postnote}}
\AtEveryBibitem{\clearfield{month}}
\endinput

答案1

您需要区分您从书中使用的页面(将打印在参考书目中)和您实际引用的页面。对于前者,请使用字段pages(在biblatex 手册,第 2.2.2 节),对于后者使用 的可选参数\cite

下面的代码

\documentclass{scrartcl}
\usepackage[latin1]{inputenc}
\usepackage{biblatex}

\begin{filecontents*}{books.bib}
@BOOK{scrubs,
  author = {John Dorian},
  title = {How to endure girls names},
  year = {2009},
  edition = {8},
  publisher = {Cox publishing},
  pages={10--20}
}

\end{filecontents*}

\bibliography{books.bib}

\begin{document}
\cite[10f.]{scrubs}

\printbibliography
\end{document}

结果是

编译代码摘录

答案2

如果你真的想要列出参考书目中引用的所有页面,您可以将它们全部收集到宏中,然后将其打印到参考书目中:

下面的代码

\documentclass{scrartcl}
\usepackage{biblatex}

\begin{filecontents*}{books.bib}
@BOOK{scrubs,
  author = {John Dorian},
  title = {How to endure girls names},
  year = {2009},
  edition = {8},
  publisher = {Cox publishing},
}
\end{filecontents*}

\makeatletter
\DeclareFieldFormat{postnote}{\mkfirstpage{#1}\ifnumeral{#1}{}{\ifnumerals{#1}{f.}{}}%
\expandafter\expandafter\expandafter\gappto\expandafter%
\csname pagelist@\csfield{fullhash}\endcsname%
{\printtext[pages]{#1}\setunit*{\addcomma\addspace}}}

\renewbibmacro*{chapter+pages}{%
  \printfield{chapter}%
  \setunit*{\bibpagespunct}%
  \expandafter\csname pagelist@\strfield{fullhash}\endcsname%
  \newunit}
\makeatother

\bibliography{books.bib}

\begin{document}

\cite[10--20]{scrubs} \cite[33]{scrubs}

\printbibliography
\end{document}

产量

编译后的代码的屏幕截图

据我了解,这就是您所寻找的。

首先要注意的是

\DeclareFieldFormat{postnote}{\mkfirstpage{#1}%
  \ifnumeral{#1}{}{\ifnumerals{#1}{f.}{}}}

丢弃除第一个指定的页码之外的所有页码,并测试是否给出了页码范围或单个页码(一开始我觉得这有点令人困惑:\ifnumerals检查数字或者提供了范围,因此检查“提供了单个页面”的情况\ifnumeral,如果不是这种情况,我们检查是否#1是数字范围或完全不同的东西)。

虽然我们可以访问该postnote字段,但是我们会将引用的页码存储在宏中。每个出现的页码都存储在宏中,\pagelist@<full hash>其中是参考书目条目所独有的<full hash>哈希值。biblatex

实际上,引用的页面与其格式信息一起存储,随时可以打印在参考书目中:对于每个引用,

\printtext[pages]{#1}\setunit*{\addcomma\addspace}

附加到宏中。请注意,可选参数[pages]\printtext前缀“p.”或“pp.”添加到数字中,并\setunit*确保标点符号符合biblatex标点符号跟踪器(即列表前有一个句号,末尾没有逗号)。

到目前为止,我们只影响了postnote打印字段时发生的情况。下一步是将我们的宏插入参考书目。

standard.bbx的样式中biblatexpages字段在 的过程中打印(如果您编写自己的参考书目驱动程序或使用不同的样式,则应进行调整!)。在这种情况下,我们只需用宏bibmacro chapter+pages替换字段的打印即可。pages

这种方法有一些缺点:

  1. 没有排序。页码已列出按引用顺序

  2. 不检查重复项。

这两个问题都不容易解决(据我所知……),因为在 LaTeX 中处理列表至少可以说很困难,因此结果可能非常不令人满意。例如

\cite[10--20]{scrubs} \cite[33]{scrubs} \cite[11]{scrubs}, \cite[2--3]{scrubs}

\printbibliography

结果是

编译后的代码的屏幕截图

这至少是令人困惑的!

因此,上述“解决方案”可能被视为向宏附加值的有趣练习,但我绝对建议使用pages。如果你想强调书中的哪些部分实际上在我看来,这个backref选项是一个更好的方法。

相关内容