我已编辑此问题以在下面添加 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}
答案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}}{}%
}