tuna / thuthesis

LaTeX Thesis Template for Tsinghua University
https://www.ctan.org/pkg/thuthesis
LaTeX Project Public License v1.3c
4.52k stars 1.07k forks source link

将 bibtex 的接口改为 \addbibresource 和 \printbibliography #875

Closed zepinglee closed 1 year ago

zepinglee commented 1 year ago

目前有多处 \bibliography,如果用户将默认的 bibtex 方案改为 biblatex,需要将这些都修改为 \printbibliography,不太方便。

我提议将 bibtex 的接口 \bibliography 改为 \addbibresource\printbibliography,同 biblatex 和 citation-style-language 一致,这样就只需要修改 thusetup.tex 就可以了。

https://github.com/tuna/thuthesis/blob/c208916d15b1e839c10b0b2d6f129e0caf7ac23f/thusetup.tex#L148-L167

初步想法:

  1. 兼容旧的接口 \bibliographystyle\bibliography
  2. bibtex 的 \printbibliography[] 如果有参数则给出警告。
  3. 主文档的 \bibliographystyle 也设置附录中的默认 bib style(bibunits\defaultbibliographystyle)。

另外 stone-zeng/fduthesis 目前就是这么处理的。

Originally posted by @zepinglee in https://github.com/tuna/thuthesis/issues/837#issuecomment-1542274625

zepinglee commented 1 year ago

我提议将 bibtex 的接口 \bibliography 改为 \addbibresource\printbibliography,同biblatex 一致,这样就只需要修改 thusetup.tex 就可以了。】

我读过(也抄过)fduthesis 里面的相关代码,觉得曾老师的封装方案已经很完备了,可以直接借来用。新功能也可以直接拿 L3 写,就作为重构的一部分了。

@atxy-blip 我记得 fduthesis 是设置 bib-backend 选择 bibtex/biblatex 的吧?但我更倾向于让用户加载宏包的方式进行控制,比如 \usepackage{natbib}\usepackage[...]{biblatex}。这样更加灵活,比如切换成 citation-style-language 也不必修改太多模板代码(如 https://github.com/tuna/thuthesis/issues/844#issuecomment-1508020710)。

atxy-blip commented 1 year ago

我记得 fduthesis 是设置 bib-backend 选择 bibtex/biblatex 的吧?

是这样的,fduthesis 把载入宏包的部分也封装好了,在下面。这样做的好处是能把附属功能一并做成选项,比如顺序编码制和著者-出版年制的样式控制、批量载入 .bib 文件等。如果让用户手动载入,额外的功能或许都要写进钩子里面?

让用户手动载入 natbib 然后写 \addbibresource 可能也有点违反直觉……

关于灵活性,我在自己的项目里只做了 biblatex 的兼容,然后提供了可以选择禁用模板的全部参考文献设置的选项,从而保留了用户的自由。或许可以作为思路参考。

https://github.com/stone-zeng/fduthesis/blob/c4dc227f7c61ea31e9a4af615fa10e3f85618618/source/fduthesis.dtx#L5659-L5694

zepinglee commented 1 year ago

是这样的,fduthesis 把载入宏包的部分也封装好了,在下面。这样做的好处是能把附属功能一并做成选项,比如顺序编码制和著者-出版年制的样式控制、批量载入 .bib 文件等。如果让用户手动载入,额外的功能或许都要写进钩子里面?

对。

biblatex 会加载 hyperref,而有的宏包(比如 cleverref)需要在 hyperref 后加载,这种情况如果用选项的方式在 \AtEndPreamble 加载宏包就很不方便。但让用户手动写 \usepackage 就比较自然。

让用户手动载入 natbib 然后写 \addbibresource 可能也有点违反直觉……

确实有点。那主文档 bibtex 参考文献还是保留 \bibliography 吧。附录的参考文献改成 \printbibliography,默认使用主文档设置的 .bib 文件。bibunits 原来的命令是 \putbib[<bibfile>],为了让用户更上手才改成了 \bibliography 的。

note286 commented 1 year ago

像 biblatex 会加载 hyperref,而有的宏包(比如 cleverref)需要在 hyperref 后加载,这种情况如果用选项的方式在 \AtEndPreamble 加载宏包就很不方便。但让用户手动写 \usepackage 就比较自然。

关于这一点,是否可以参考tabularray\UseTblrLibrary{}呢?也弄一个这样的命令,实际效果就是底部下载。

stone-zeng commented 1 year ago

补充一点,有些编辑器会根据 \bibliography{...} 来判断和解析参考文献数据,并提供一些辅助功能。如果不用这个反而会破坏这些功能。

zepinglee commented 1 year ago

关于这一点,是否可以参考tabularray\UseTblrLibrary{}呢?也弄一个这样的命令,实际效果就是底部下载。

我不喜欢这种设计。

比如 amsmath 有的选项只能在加载的参数中设置,用 \UseTblrLibrary 就得用 \PassOptionsToPackage 特殊处理。还有如果文档类已经调用了 amsmath,不知道 tabularray 能不能正确处理。

理想的结果是,加载宏包的顺序不影响输出。使用 file hook 基本都能解决。

zepinglee commented 1 year ago

补充一点,有些编辑器会根据 \bibliography{...} 来判断和解析参考文献数据,并提供一些辅助功能。如果不用这个反而会破坏这些功能。

\addbibresource 应该也会读吧?

zepinglee commented 1 year ago

补充一点,有些编辑器会根据 \bibliography{...} 来判断和解析参考文献数据,并提供一些辅助功能。如果不用这个反而会破坏这些功能。

对了 fduthesis 会有这个问题吗?

atxy-blip commented 1 year ago

对了 fduthesis 会有这个问题吗?

如果用 bib-resource 填写数据源,确实可能在 TeXStudio 没法补全 citation key,后来还是补了一个 \addbibresourcehttps://github.com/stone-zeng/fduthesis/pull/229)。

note286 commented 1 year ago

比如 amsmath 有的选项只能在加载的参数中设置,用 \UseTblrLibrary 就得用 \PassOptionsToPackage 特殊处理。

确实不够优雅,需要用户额外学习,但是也可以将可选参数传进去。

xduts的字体也是在后面设置的,导致circledtext正常加载的话,无法正确设置字符宽度,只能将circledtext在后面加载,我目前还没想到什么好的办法。字体在文档类参数里设置就不会有这个问题,但是我还想要在\xdusetup里设置,这样更统一。

还有如果文档类已经调用了 amsmath,不知道 tabularray 能不能正确处理。

tabularray仅对amsmathbooktabscounterdiagboxfunctionalnamerefsiunitxvarwidthzref做了特殊处理,这几个宏包使用\UseTblrLibrary加载会进行特殊处理。我记得没错的话,其他宏包使用甚至会报错。

如果在tabularray之前正常加载的宏包,仅有xcolorhyperref会自动做一些处理。

zepinglee commented 1 year ago

@Harry-Chen 感觉可以发布一个新版本了。

Harry-Chen commented 1 year ago

@Harry-Chen 感觉可以发布一个新版本了。

好的,今天发布,应该刚好是在研究生提交论文之前。