如何消除 Biblatex 反向引用压缩页面范围中的最终页码?

如何消除 Biblatex 反向引用压缩页面范围中的最终页码?

我已编辑此问题以在下面添加 MWE。

我正在为一家学术出版社准备一本书的照相排版版,我必须遵守他们的内部风格。对于索引,他们规定页码范围必须缩减到最小格式,但小于 20 的数字除外。换句话说,范围 190-191 应缩减为 190-1,范围 156-163 变为 156-63,范围 42-49 变为 42-9,范围 11-17 保持不变。

我已经能够通过编写修改 .idx 文件、运行 makeindex 并修改生成的 .ind 文件的 Perl 脚本来实现我的两个索引的出版社规范。但是,省略压缩的 Biblatex 反向引用的页面范围将更加棘手,因为范围是由 Biblatex 从每次运行时都会更改的辅助文件生成的,而不是从 Latex 不会触及的 .ind 文件中外部生成的。

我查看了 Biblatex 代码,似乎我必须修改 pageref:comp 和 pageref:dump 宏,但这超出了我的能力范围。

因此,我尝试修改 .aux 文件,更改并删除以 \abx@aux@backref 开头的行。我可以删除给定页面范围的行,并将其替换为插入适当省略范围的行,如下所示:\abx@aux@backref{375}{Foobar:1967}{0}{84--5}{84--5}

快速手动测试表明此方法有效,但我担心自动化。.aux 文件中的条目是连续编号的,因此我担心删除某些条目可能会导致错误行为。此方法还需要在每次运行后运行 Perl 脚本来修改 .aux 文件,这很容易忘记。

任何建议都将不胜感激。我非常感谢本网站的贡献者;如果没有我在这里找到的信息,我将无法实现新闻规范的细节。

以下是 MWE:

\documentclass{article}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
  @book{Knu86,
    author = {Knuth, Donald E.},
    year = {1986},
    title = {The \TeX book},
  }
\end{filecontents}
\usepackage[style=authoryear,backref=true,backrefstyle=two]{biblatex}
\bibliography{\jobname}

\begin{document}

% We only want elision to happen after page 20
XXX\clearpage{}XXX\clearpage{}XXX\clearpage{}XXX\clearpage{}  
XXX\clearpage{}XXX\clearpage{}XXX\clearpage{}XXX\clearpage{}
XXX\clearpage{}XXX\clearpage{}XXX\clearpage{}XXX\clearpage{}
XXX\clearpage{}XXX\clearpage{}XXX\clearpage{}XXX\clearpage{}
XXX\clearpage{}XXX\clearpage{}XXX\clearpage{}

Page 20: \cite{Knu86}\clearpage
Page 21: \cite{Knu86}\clearpage
Page 22: \cite{Knu86}\clearpage

\printbibliography

\end{document}

这将为参考书目生成以下输出:Knuth, Donald E. (1986). The TEXbook (cit. on pp. 20–22).

我需要将反向引用的页码范围改为“(引自第 20-2 页)”。页码范围中的第二个数字从 22 缩写为 2。我希望这样可以让我的问题更加清楚。

答案1

您可以尝试以下方法。注意:这不是一个完全通用的解决方案。它做了一些假设,例如,您只有阿拉伯页码(例如,罗马数字会导致缺少数字错误),并且您不需要超链接。另外,我没有对其进行太多测试,因此我可能错过了一些细节。它使用的内部命令\mkcomprange,因此确切的压缩行为可能(可能)受到计数器mincomprange等的影响。

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[style=authoryear,backref=true]{biblatex}
\addbibresource{biblatex-examples.bib}

\newcommand\firstpagetemp{}
\newcommand\printsecondrangevalue{}
\def\printsecondrangevalue #1\bibrangedash #2{#2}
\makeatletter
\renewbibmacro*{pageref:dump}{%
  \ifnumgreater{\abx@range@diff}{0}
    {\edef\firstpagetemp{\the\numexpr\abx@range@hold-\abx@range@diff}%
     \bibrangedash
     \ifnum\firstpagetemp<20
      \abx@range@hold
     \else
      \def\blx@tempa{}%
      \protected\def\blx@range@out@value{\appto\blx@tempa}%
      \edef\next{\noexpand\blx@comprange@comp {\firstpagetemp}{\abx@range@hold}}%
      \next
      \expandafter\printsecondrangevalue\blx@tempa
    \fi%
    \def\abx@range@diff{0}}{}%
    }

\usepackage{pgffor}
\begin{document}
\setcounter{page}{10}
\foreach\x in {1,2,...,9}
{\cite{weinberg}\newpage}

blub \newpage blub

\foreach\x in {1,2,...,8}
{\cite{weinberg}\newpage}

blub \newpage blub
\setcounter{page}{100}

\foreach\x in {1,2,...,28}
{\cite{weinberg}\newpage}

blub \newpage blub

\cite{herrmann}\cite{weinberg}\clearpage
\cite{weinberg}\clearpage
\cite{herrmann}\cite{weinberg}\clearpage

\printbibliography

\end{document}

enter image description here

答案2

为了记录在案,我在这里发布了我对 Ulrike 代码的修改,以添加额外的测试,以免按出版社的要求省略十位数的页码。代码可能很难看,但我很高兴发现了 xstring 包,它允许我提取数字,而不必学习所有关于 TeX 中字符处理的知识。

\usepackage{xstring}
\newcommand\firstpagetemp{}
\newcommand\printsecondrangevalue{}
\newcommand\myfirstleft{}\newcommand\mysecondleft{}
\newcommand\mysecondright{}\newcommand\mysecondtens{}
\def\printsecondrangevalue #1\bibrangedash #2{#2}
\makeatletter
\renewbibmacro*{pageref:dump}{%
  \ifnumgreater{\abx@range@diff}{0}
  {\edef\firstpagetemp{\the\numexpr\abx@range@hold-\abx@range@diff}%
    \bibrangedash
    \StrGobbleRight{\firstpagetemp}{2}[\myfirstleft]%
    \ifdefempty{\myfirstleft}{\def\myfirstleft{0}}{}%
    \StrGobbleRight{\abx@range@hold}{2}[\mysecondleft]%
    \ifdefempty{\mysecondleft}{\def\mysecondleft{0}}{}%
    \StrRight{\abx@range@hold}{2}[\mysecondright]%
    \StrLeft{\mysecondright}{1}[\mysecondtens]%
    \ifthenelse{\myfirstleft=\mysecondleft \AND \mysecondtens=1}%
    {\mysecondright}%
    {%
    \def\blx@tempa{}%
    \protected\def\blx@range@out@value{\appto\blx@tempa}%
    \edef\next{\noexpand\blx@comprange@comp {\firstpagetemp}
    {\abx@range@hold}}%
    \next
    \expandafter\printsecondrangevalue\blx@tempa
    }%
    \def\abx@range@diff{0}}{}%
}

相关内容