我使用的是classicthesis
4.1 版软件包。其手册中写道:
如果您想要从引文中使用对其被引用页面的反向引用,请将以下行更改为:
\setboolean{enable-backrefs}{false} % true false
到
\setboolean{enable-backrefs}{true} % true false
不幸的是,编译器不喜欢设置enable-backrefs
,true
并通过输出有关该文件的以下错误消息来抱怨.bbl
:
Paragraph ended before \BR@@lbibitem was complete
Illegal parameter number in definition of \Hy@tempa You meant to type ## instead of #, right?
我正在使用以下版本hyperref
和backref
包:
hyperref.sty 2012/11/06 v6.83m Hypertext links for LaTeX
backref.sty 2012/07/25 v1.38 Bibliographical back referencing
有人能帮我解决这个问题吗?
答案1
URL 中那些特殊字符不起作用的原因在于backref
工作方式。引用手册中的一段话:
有时将条目作为参数读取并不合适。例如,逐字内容的 catcode 更改没有达到预期的效果。因此,
\par
可以通过\backrefparscanfalse
before禁用对标记的扫描\bibitem
,并通过 after 启用\backrefparscantrue
。
如果禁用对条目末尾的扫描,则包backref
不知道将后引用列表放在哪里。列表由宏打印\backrefprint
,因此只需在正确的位置调用它即可。
事实上,url
和hyperref
包使用了大量 catcode 操作来逐字打印 URL,而当backref
接管时此功能会被禁用thebibliography
。
egreg 的解决方案是将所需的 catcode 放#
回去,但可能会产生负面影响。所以我的解决方案遵循了backref
手册中的建议。我们需要为此更改书目样式文件。但无论如何,这是一种自制的样式,所以我希望你不介意进一步修改它。
在函数中fin.entry
添加一行:
FUNCTION {fin.entry}
{ add.period$
write$
newline$ "\backrefprint\backrefparscantrue" write$ %% added
newline$
}
在函数中output.bibitem
添加一行:
FUNCTION {output.bibitem}
{ newline$
"\backrefparscanfalse" write$ newline$ %% added
"\bibitem[" write$
label write$
")" make.full.names duplicate$ short.list =
{ pop$ }
{ * }
if$
"]{" * write$
cite$ write$
"}" write$
newline$
""
before.all 'output.state :=
}
为了使这种风格即使在backref
没有加载的情况下也能发挥作用,我们backref
通过向函数中添加以下内容,将宏的虚拟规范添加到前言中begin.bib
:
FUNCTION {begin.bib}
{ preamble$ empty$
'skip$
{ preamble$ write$ newline$ }
if$
"\begin{thebibliography}{" number.label int.to.str$ * "}" *
write$ newline$
"\providecommand{\natexlab}[1]{#1}"
write$ newline$
"\providecommand{\url}[1]{\texttt{#1}}"
write$ newline$
"\expandafter\ifx\csname urlstyle\endcsname\relax"
write$ newline$
" \providecommand{\doi}[1]{doi: #1}\else"
write$ newline$
" \providecommand{\doi}{doi: \begingroup \urlstyle{rm}\Url}\fi"
write$ newline$
" \providecommand\backrefparscanfalse{}" %% added
write$ newline$ %% added
" \providecommand\backrefparscantrue{}" %% added
write$ newline$ %% added
" \providecommand\backrefprint{}" %% added
write$ newline$ %% added
}
仅使用修改后的样式,而不改变任何bib
条目。
答案2
我可以提出这个建议:添加
\usepackage{etoolbox}
\makeatletter
\preto{\BR@bibitem}{\catcode`\#=12 }
\makeatother
在加载hyperref
并将选项添加到之后backref
。但是,它可能会产生不良的副作用,因为做这种把戏通常很危险。
然而,最好的方法是切换到biblatex
以不同方式进行反向引用。
答案3
提示此链接解决了我的问题。似乎与包含或的backref
URL 冲突。使用 tinyURL 可以解决问题。但是,这不是一个完整的解决方案,因为有人可能希望在引用中使用实际的 URL。我应该说它没有修复正确的反向引用。%
#
如果有人能解决我们如何在使用反向引用的同时在参考书目中找到%
和的问题,那就太好了。#
这里有一个MWE
\documentclass[
openright,
titlepage, numbers=noenddot, headinclude,%1headlines,
footinclude=true, cleardoublepage=empty,
BCOR=30mm, paper=letter, fontsize=11pt, % Binding correction, paper type and font size
ngerman, american, % Languages
]{scrreprt}
\PassOptionsToPackage{%
eulerchapternumbers,
listings,
pdfspacing,
subfig,
beramono,
parts}{classicthesis}
\PassOptionsToPackage{square,numbers,sort&compress}{natbib}
\usepackage{natbib}
\usepackage[position=t,singlelinecheck=off,font={it}]{subfig}
\PassOptionsToPackage{pdftex,hyperfootnotes=false,pdfpagelabels}{hyperref}
\usepackage{hyperref} % backref linktocpage pagebackref
\pdfcompresslevel=9
\pdfadjustspacing=1
\hypersetup{
colorlinks=true, linktocpage=true, pdfstartpage=1, pdfstartview=FitV,
breaklinks=true, pdfpagemode=UseNone, pageanchor=true, pdfpagemode=UseOutlines,
plainpages=false, bookmarksnumbered, bookmarksopen=true, bookmarksopenlevel=1,
hypertexnames=true, pdfhighlight=/O, %
}
\usepackage{ifthen} % Allows the user of the \ifthenelse command
\newboolean{enable-backrefs} % Variable to enable backrefs in the bibliography
\setboolean{enable-backrefs}{true} % Variable value: true or false
% ---------------------------------------------------------------------------------------
\newcommand{\backrefnotcitedstring}{\relax} % (Not cited.)
\newcommand{\backrefcitedsinglestring}[1]{(Cited on page~#1.)}
\newcommand{\backrefcitedmultistring}[1]{(Cited on pages~#1.)}
\ifthenelse{\boolean{enable-backrefs}} % If backrefs were enabled
{
\PassOptionsToPackage{hyperpageref}{backref}
\usepackage{backref} % to be loaded after hyperref package
\renewcommand{\backreftwosep}{ and~} % separate 2 pages
\renewcommand{\backreflastsep}{, and~} % separate last of longer list
\renewcommand*{\backref}[1]{} % disable standard
\renewcommand*{\backrefalt}[4]{% detailed backref
\ifcase #1
\backrefnotcitedstring
\or
\backrefcitedsinglestring{#2}
\else
\backrefcitedmultistring{#2}
\fi}
}{\relax}
\usepackage{classicthesis}
\begin{document}
This is test for back-referencing. \citep{chdkiller}.
\bibliographystyle{abbrvunsrtnat}
\bibliography{Bibliography}
\end{document}
这是书目文件的文件内容。
@misc{chdkiller,
author = {},
title = {{Centers for Disease Control and Prevention. Vital Statistics Public Use
Data Files - 2008 Mortality Multiple Cause Files}},
howpublished = "\url{http://www.cdc.gov/nchs/data_access/Vitalstatsonline.htm#Mortality_Multiple}",
year = {2012},
note = "[Online; accessed March 7, 2012]"
}
如果我#
从书目文件中的 URL 中删除,它就会起作用。我正在使用书目样式文件,,abbrvunsrtnat.bst
发布这里。看来包与网址backref
不符。%
#