我需要在参考书目中打印所引用书籍的实际引用页码范围。
后缀[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
的样式中biblatex
,pages
字段在 的过程中打印(如果您编写自己的参考书目驱动程序或使用不同的样式,则应进行调整!)。在这种情况下,我们只需用宏bibmacro
chapter+pages
替换字段的打印即可。pages
这种方法有一些缺点:
没有排序。页码已列出按引用顺序。
不检查重复项。
这两个问题都不容易解决(据我所知……),因为在 LaTeX 中处理列表至少可以说很困难,因此结果可能非常不令人满意。例如
\cite[10--20]{scrubs} \cite[33]{scrubs} \cite[11]{scrubs}, \cite[2--3]{scrubs}
\printbibliography
结果是
这至少是令人困惑的!
因此,上述“解决方案”可能被视为向宏附加值的有趣练习,但我绝对建议使用pages
。如果你想强调书中的哪些部分实际上在我看来,这个backref
选项是一个更好的方法。