Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

参考文件超链接问题 #145

Closed
Phoenix1327 opened this issue Apr 7, 2019 · 11 comments
Closed

参考文件超链接问题 #145

Phoenix1327 opened this issue Apr 7, 2019 · 11 comments
Labels

Comments

@Phoenix1327
Copy link

您好,
按照wiki中描述

如果想点击参考文献列表的某个文献可以跳回文档内的引用页,可以在 artracom.sty 添加如下命令即可:
\RequirePackage[hyperpageref]{backref}
然后每个文献后就会有链回文本页的页码

请问这条语句应该放在artracom.sty的哪里?我在artracom.sty最后,\endinput 之前加入这条语句
,提示错误:
! Illegal parameter number in definition of \Hy@tempa.

然后在Theis.tex导言区,使用\usepackage[pagebackref]{hyperref}(https://tex.stackexchange.com/questions/99615/backref-package-for-page-reference),提示错误:
option clash for package hyperref

最后在artratex.sty中,把line 455 "pagebackref=true"的注释去掉,编译没有错误但是参考文献未能添加超链接。

@muzimuzhi
Copy link
Contributor

两种解决方案,任选其一即可:

  • Thesis.tex 导言区添加 \usepackage[pagebackref]{hyperref},注意一定要添加在 artratex 之前
  • artratex.sty\RequirePackage{hyperref} 这一行修改为 \RequirePackage[hyperpageref]{hyperref}

你的提问里,描述了三种尝试,三种尝试都失败了

  • A. 在 artracom.sty 里添加 \RequirePackage[hyperpageref]{backref},得到错误 ! Illegal parameter number in definition of \Hy@tempa.
  • B. 在 Thesis.tex 导言区添加 \usepackage[pagebackref]{hyperref},得到错误 option clash for package hyperref
  • C. 在 artratex.sty 里给 pagebackref=true 一行解注释,没有得到错误,但 PDF 中仍然无效果。

详细解释

  1. pagebackrefhyperref 宏包提供的选项。

  2. 部分 hyperref 宏包的选项,只能作为宏包选项传入,无法通过 \hypersetup{} 设置。pagebackref 就是一个这样的选项。我提供的第二种解决方案就对应这一点。

    这解释了尝试 C 失败的原因。如果观察仔细,可以看到尝试 C 生成的 log 包含如下警告,提醒用户「你在 \hypersetup{} 里开启的 pagebackref 选项是无效的」。

    Package hyperref Warning: Option `pagebackref' has already been used,
    (hyperref)                setting the option has no effect on input line 463.
    
  3. 每个宏包只在用户初次尝试加载时,实际得到加载。用户可以多次尝试加载同一个宏包,但如果后续尝试时使用了第一次时没有使用的宏包选项,就会报 option clash 的错误。

    这解释了尝试 B 失败的原因。在这个模板里,hyperref 是在 artratex.sty 里以无宏包选项的方式加载的。任何晚于这个位置、且使用了宏包选项的 hyperref 加载尝试,都会触发 option clash 错误。

    如果把带选项的加载提前,就能避开 option clash,我提供的第一种解决方案就对应这一点。

  4. 至于你的尝试 A,我没有做实际的测试。backref 宏包会被 hyperref 加载,一般不需要也不建议用户手动加载它。你在 artracom.sty 里尝试加载它,位置也太靠后了。

@mohuangrui 建议修改 wiki 里的对应内容

@Phoenix1327
Copy link
Author

两种解决方案,任选其一即可:

  • Thesis.tex 导言区添加 \usepackage[pagebackref]{hyperref},注意一定要添加在 artratex 之前
  • artratex.sty\RequirePackage{hyperref} 这一行修改为 \RequirePackage[hyperpageref]{hyperref}

你的提问里,描述了三种尝试,三种尝试都失败了

  • A. 在 artracom.sty 里添加 \RequirePackage[hyperpageref]{backref},得到错误 ! Illegal parameter number in definition of \Hy@tempa.
  • B. 在 Thesis.tex 导言区添加 \usepackage[pagebackref]{hyperref},得到错误 option clash for package hyperref
  • C. 在 artratex.sty 里给 pagebackref=true 一行解注释,没有得到错误,但 PDF 中仍然无效果。

详细解释

  1. pagebackrefhyperref 宏包提供的选项。
  2. 部分 hyperref 宏包的选项,只能作为宏包选项传入,无法通过 \hypersetup{} 设置。pagebackref 就是一个这样的选项。我提供的第二种解决方案就对应这一点。
    这解释了尝试 C 失败的原因。如果观察仔细,可以看到尝试 C 生成的 log 包含如下警告,提醒用户「你在 \hypersetup{} 里开启的 pagebackref 选项是无效的」。
    Package hyperref Warning: Option `pagebackref' has already been used,
    (hyperref)                setting the option has no effect on input line 463.
    
  3. 每个宏包只在用户初次尝试加载时,实际得到加载。用户可以多次尝试加载同一个宏包,但如果后续尝试时使用了第一次时没有使用的宏包选项,就会报 option clash 的错误。
    这解释了尝试 B 失败的原因。在这个模板里,hyperref 是在 artratex.sty 里以无宏包选项的方式加载的。任何晚于这个位置、且使用了宏包选项的 hyperref 加载尝试,都会触发 option clash 错误。
    如果把带选项的加载提前,就能避开 option clash,我提供的第一种解决方案就对应这一点。
  4. 至于你的尝试 A,我没有做实际的测试。backref 宏包会被 hyperref 加载,一般不需要也不建议用户手动加载它。你在 artracom.sty 里尝试加载它,位置也太靠后了。

@mohuangrui 建议修改 wiki 里的对应内容

十分感谢!!

@Phoenix1327
Copy link
Author

Phoenix1327 commented Apr 8, 2019

  1. 经过测试,按照wiki所述,在artracom.sty中尝试加载backref失败,出现! Illegal parameter number in definition of \Hy@tempa.错误提示,这样的原因是ref.bib中,使用urlpackage对website进行引用时出现的问题。
    ref.bib中,我的论文存在以下引用:
    @online{nms-wiki,
    title = {Non-maximum Suppression},
    url = {https://en.wikipedia.org/wiki/Canny_edge_detector#Non-maximum_suppression}
    }
    url一栏中的#,就是造成出现! Illegal parameter number in definition of \Hy@tempa.错误的原因。至于为什么只有在加载backref后才会出现错误提示,我对latex了解有限,不得而知。

  2. Google之后,部分回答指出,可以使用\#替代#来解决问题https://tex.stackexchange.com/questions/267145/redefining-url-disallows-in-url。但经过尝试后没有成功,依然报错,遂放弃。

  3. 当放弃url中的#号,将上述引用改为
    @online{nms-wiki,
    title = {Non-maximum Suppression},
    url = {https://en.wikipedia.org/wiki/Canny_edge_detector}
    }
    后,按照wiki所述办法,在artracom.sty中尝试加载backref,编译成功。但nms-wiki条目没能成功显示参考文献超链接,不能正确地链接回原始page;其余参考文献可以正常链接回page。

  4. 不使用online格式,使用Misc格式时,按照wiki所述办法,也可以编译成功。但nms-wiki条目依然没能显示超链接;其余文献正常显示超链接。
    @Misc{nms-wiki,
    title = {Non-maximum Suppression},
    howpublished = {\url{https://en.wikipedia.org/wiki/Canny_edge_detector}}
    }

  5. 注意到模板中给的例子,用book格式引用url
    @book{wikibook2014latex,
    title={http://en.wikibooks.org/wiki/LaTeX},
    author={Wikibook},
    year={2014},
    publisher={On-line Resources}
    }
    按照wiki所述办法,这样得到的url引用能够显示超链接;其余文献也能正常显示超链接。

  6. 但是使用book格式引用url时,当url中出现underscore符号,_时,又会出现新的问题。比如5wikibook引用变为
    @book{wikibook2014latex,
    title={http://en.wikibooks.org/wiki_test/LaTeX},
    author={Wikibook},
    year={2014},
    publisher={On-line Resources}
    }时,由于wiki_test中存在_,编译报错,按照latex一般的处理underscore符合策略
    https://tex.stackexchange.com/questions/386637/using-textunderscore-with-biblatex-biber?rq=1,把上述引用重新改为:
    @book{wikibook2014latex,
    title={{http://en.wikibooks.org/wiki}{\_}{test/LaTeX}},
    author={Wikibook},
    year={2014},
    publisher={On-line Resources}
    }
    这次按照wiki所述办法,在artracom.sty中尝试加载backref,编译成功。但最终wikibook条目,和其余引用条目均不能显示超链接。

3, 4, 5, 6中的操作没有在 @muzimuzhi 给出的两条策略下进行测试。
最后只能决定把所有url的引用部分放在正文中,直接使用\url进行引用,不再尝试在ref.bib中添加url引用,再在正文中使用\citep{}进行引用。
@mohuangrui 感觉这一问题十分蛋疼,如果作者一时没有更好的处理策略,建议关闭问题。

@mohuangrui
Copy link
Owner

@Phoenix1327 难怪我无法复现你的问题,原来是使用带特殊符号的 url 所致。这个问题就得请教 @zepinglee 了。

但是,我的建议是与其折腾 url 格式,倒不如不用 参考文献的 backref 功能,因为这个功能并无什么意义。特别是对于纸质打印版,绝对不应该使用此功能,否则是错误的。

@mohuangrui
Copy link
Owner

@Phoenix1327 最好的且最合理的解决方案就是 不用参考文献 backref 这个鸡肋功能:D

@Phoenix1327
Copy link
Author

@Phoenix1327 最好的且最合理的解决方案就是 不用参考文献 backref 这个鸡肋功能:D

好的,感谢各位回复。对latex不熟,直观感觉就是hyperref好多情况下会跟其他package冲突。最后我也决定不使用backref这个功能了😂,有点闲的蛋疼了。。

@mohuangrui
Copy link
Owner

@Phoenix1327 是的,hyperref 需要处理 tex 与 pdf 信息转换之间的很多复杂关系,因而比较敏感。backref 这个功能没什么用,不用就好了。我把它放 wiki 里是为了信息的完备性,我现在已经在

https://github.com/mohuangrui/ucasthesis/wiki/文献样式

添加了你的经验教训,以告来者:

注意:

如果 ref.bib 中的文献源的 url 带有 #_$ 等特殊字符,则 backref 功能容易出现错误,见 Phoenix1327, issue #145

此 backref 功能实际并无多大意义,且纸质打印版不应该使用此功能,因此,不建议启用此功能。

@zepinglee
Copy link

  1. title 域一般不要只填 url
  2. online + urlmisc + howpublished 都可以,因为是自动检测的,推荐使用前者
  3. 正常情况下 _ #\url{} 中是没问题的,但是据你的描述似乎只有 hyperref 加了 backref 才会出问题?有可能是 hyperref 家在顺序的问题

@mohuangrui
Copy link
Owner

@zepinglee 谢谢解答,我有时间时再测测,目前就先考虑不要用这个功能就好。

@muzimuzhi
Copy link
Contributor

我试了示例文档,这么做是可以的

%% ref.bib
% ... other bib items ...
@online{nms-wiki,
    title = {Non-maximum Suppression},
    url = {https://en.wikipedia.org/wiki/Canny_edge_detector#Non-maximum_suppression}
    }
%% end of ref.bib

%% Thesis.tex
\documentclass[doublesided]{Style/ucasthesis}%

\usepackage[pagebackref]{hyperref}
\usepackage{etoolbox}
\makeatletter
\preto{\BR@bibitem}{\catcode`\#=12 }
\makeatother

% ... other contents ...
%% end of Thesis.tex

来源:https://tex.stackexchange.com/a/116021/79060

这么修改可能有为止风险,链接里也提到换用 biblatex

@mohuangrui
Copy link
Owner

经测试,与加载顺序无关。@muzimuzhi 修改 catcode 具有很多局限性,不太合适。既然问题超出了 ucasthesis 的范畴,且并无太多意义,我将标记为 bug,然后关闭此 issue。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

4 participants