hushidong / biblatex-gb7714-2015

A biblatex implementation of the GB/T7714-2015 bibliography style || GB/T 7714-2015 参考文献著录和标注的biblatex样式包
775 stars 84 forks source link

`parencite` 失去超链接 #195

Open xkwxdyy opened 7 months ago

xkwxdyy commented 7 months ago

MWE

\begin{filecontents*}{test.cls}
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{test}[2024/04/13 v0.1 Test class]
\RequirePackage{etoolbox}
\LoadClass{ctexbook}
\ExplSyntaxOn
\RequirePackage
  [
    backend      = biber,
    bibstyle     = gb7714-WHU,
    citestyle    = gb7714-WHU,
    gbfile       = true
  ]{biblatex}
\setcounter { gbrefcompress } { 3 }
% Tofix: 放在 cbx 里没效果,反而变成空白了
% https://github.com/hushidong/biblatex-gb7714-2015/issues/137
% 增加 \parencite 两篇文献之间逗号后的空格
\DeclareDelimFormat [ parencite ] { multicitedelimiter } { \addcomma\addthinspace }  % 太窄则用 addspace
% zepinglee 建议 \cite 的不加空格
\DeclareDelimFormat [ cite ] { multicitedelimiter } { \addcomma }
\RenewDocumentCommand \multicitedelim { } { \printdelim { multicitedelimiter } }

\AtEndPreamble
  {
    \RequirePackage { hyperref }
    \hypersetup 
      { 
        pdfencoding = auto,
        citecolor   = magenta,
        linkcolor   = blue,
        hidelinks
      }
  }
\ExplSyntaxOff
\end{filecontents*}

\documentclass{test}

\addbibresource{biblatex-examples.bib}

\begin{document}

\parencite{westfahl:space}

\printbibliography

\end{document}

使用 latexmk -xelatex 编译后发现 [1]没有超链接的点击效果了。

但如果调换 hyperrefbiblatex 的设置顺序:

\begin{filecontents*}{test.cls}
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{test}[2024/04/13 v0.1 Test class]
\RequirePackage{etoolbox}
\LoadClass{ctexbook}
\ExplSyntaxOn
\AtEndPreamble
  {
    \RequirePackage { hyperref }
    \hypersetup 
      { 
        pdfencoding = auto,
        citecolor   = magenta,
        linkcolor   = blue,
        hidelinks
      }
  }
\RequirePackage
  [
    backend      = biber,
    bibstyle     = gb7714-WHU,
    citestyle    = gb7714-WHU,
    gbfile       = true
  ]{biblatex}
\setcounter { gbrefcompress } { 3 }
% Tofix: 放在 cbx 里没效果,反而变成空白了
% https://github.com/hushidong/biblatex-gb7714-2015/issues/137
% 增加 \parencite 两篇文献之间逗号后的空格
\DeclareDelimFormat [ parencite ] { multicitedelimiter } { \addcomma\addthinspace }  % 太窄则用 addspace
% zepinglee 建议 \cite 的不加空格
\DeclareDelimFormat [ cite ] { multicitedelimiter } { \addcomma }
\RenewDocumentCommand \multicitedelim { } { \printdelim { multicitedelimiter } }
\ExplSyntaxOff
\end{filecontents*}

\documentclass{test}

\addbibresource{biblatex-examples.bib}

\begin{document}

\parencite{westfahl:space}

\printbibliography

\end{document}

又可以产生超链接了。

问题思考

我觉得很奇怪,按理来说 \AtEndPreamble 应该是在导言区那个部分才会执行,不应该会因为 cls的这个顺序而产生影响,除非 biblatex 里面的超链接设置也是用了 类似于 \AtEndPreamble 的设置,导致了前面失效的 MWE 中,biblatex 的设置在 hyperref 之前了。不过这是我的猜测,我不太知道原因。

如果我的 biblatex 的设置只能放在 hyperref 那个前面的话,能否修复这个问题呢?这个可能是 biblatex 的问题了,不知道胡老师有没有想法。

hushidong commented 7 months ago

导入biblatex时,加入选项hyperref=true,应该能解决。

xkwxdyy commented 7 months ago

导入biblatex时,加入选项hyperref=true,应该能解决。

MWE 测试可以,谢谢胡老师。我的大项目测试不行,等我有空再看看,项目太大出错也不好解决……

hushidong commented 7 months ago

其实,参考文献这种比较专门的项目,可以独立一些处理,不用封装的太厉害,就用一个单独文件来配置它,在tex中导入就行。

在各大高校里面,我没有深入看代码,但好像sjtu的是比较独立的。

我个人最喜欢的是nudtpaper那种老式的方式,完全没有封装,想做修改就很容易。

当然封装也有其好处,你们根据实际情况考虑就好。

xkwxdyy commented 7 months ago

其实,参考文献这种比较专门的项目,可以独立一些处理,不用封装的太厉害,就用一个单独文件来配置它,在tex中导入就行。

在各大高校里面,我没有深入看代码,但好像sjtu的是比较独立的。

我个人最喜欢的是nudtpaper那种老式的方式,完全没有封装,想做修改就很容易。

当然封装也有其好处,你们根据实际情况考虑就好。

好的谢谢胡老师提醒。其实后续 bib 的设置确实就是像您说的这样单独一个文件来管理。不过这个方面细节还很多,自己用的话可以随意点,但是要写成模板的话,考虑的还是很多的。