在 classisthesis 包中启用反向引用时出现问题

在 classisthesis 包中启用反向引用时出现问题

我使用的是classicthesis4.1 版软件包。其手册中写道:

如果您想要从引文中使用对其被引用页面的反向引用,请将以下行更改为:

\setboolean{enable-backrefs}{false} % true false

\setboolean{enable-backrefs}{true} % true false

不幸的是,编译器不喜欢设置enable-backrefstrue并通过输出有关该文件的以下错误消息来抱怨.bbl

Paragraph ended before \BR@@lbibitem was complete
Illegal parameter number in definition of \Hy@tempa You meant to type ## instead of #, right?

我正在使用以下版本hyperrefbackref包:

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可以通过 \backrefparscanfalsebefore禁用对标记的扫描\bibitem,并通过 after 启用 \backrefparscantrue
如果禁用对条目末尾的扫描,则包backref不知道将后引用列表放在哪里。列表由宏打印\backrefprint,因此只需在正确的位置调用它即可。

事实上,urlhyperref包使用了大量 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

提示此链接解决了我的问题。似乎与包含或的backrefURL 冲突。使用 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不符。%#

相关内容