nju-lug / modern-nju-thesis

南京大学学位论文 Typst 模板 modern-nju-thesis
https://typst.app/universe/package/modern-nju-thesis
MIT License
122 stars 14 forks source link

Feature request: 支持中英双语的参考文献 #3

Open OrangeX4 opened 3 months ago

OrangeX4 commented 3 months ago

目前 Typst 不支持中英双语的参考文献,详见 https://github.com/typst/typst/issues/2793https://github.com/typst/citationberg/issues/5

我有一个用来解决这个问题的 proof of concept:https://typst.app/project/rN08qR13YfLociKdV7b1Mx

不过目前只是普通的简单映射替换,还需要补充这个映射表,以及希望能够处理一些更特殊的情况。

OrangeX4 commented 3 months ago

目前的两种解决方法:https://github.com/csimide/SEU-Typst-Template https://github.com/cherichy/BUAA-typst/blob/main/typstcite.md

csimide commented 3 months ago

可以通过比对 Citation Style Language 项目的 locales 得到完整的映射表

实际用到的词语不多,只需要对 处理应该就可以了。

我改了一个支持第x版 的,但是不知道为什么工作不正常, 修好了,您可以在 https://gist.github.com/csimide/fc0e3ef69775a69805fc6ba7af227c4c 查看。

理论上这种做法适用于 GB7714-2015 numeric 及其变体,但是由于“方言”很多,不能保证适配所有变体。

csimide commented 3 months ago

请问还有其他测试引文条目吗

OrangeX4 commented 3 months ago

我才看到,太强了,感谢补充的代码!我可以觉得可以将其用到模板里面了。 我目前也没有太多其他的测试引文条目,我觉得可以等到有更多用户反馈时再进行修改,这个 issue 可以暂且不用关闭,您也可以在 SEU-Typst-Template 也维护一个反馈的 issue。

OrangeX4 commented 3 months ago

以及 typst 还有一个多文件架构的问题,typst 会默认使用函数定义所在目录作为“相对路径父目录”,也就是说,调用 bilingual-bibliography("ref.bib") 默认使用的是模板目录,而不是用户目录。所以这里我有一个借助闭包来解决这个问题的 workaround。

已经补充到 https://typst.app/project/rN08qR13YfLociKdV7b1Mx

csimide commented 3 months ago

目前判断中文的方法非常粗暴,我也不知道好不好用。

regex("[等卷册和版本章期页篇译间者(不详)]") 这一段关键字表是我看中文 locales 写的。之前看 LaTeX 文稿见过 日期不详. 之类的写法,我自己写东西引用的时候发现大部分 CSL 会将未给定的字段直接去除。因此虽然在这里对 不详 做了排除,但各种 不详 没有加到翻译表里。

我的想法是,如果做了上面的替换后,理论上应该把绝大部分单字多字的提示性文字去掉了。如果还残留有大于两个汉字,那么这条文献应该当作中文文献处理。这是一段“凭感觉”的代码,并不知道是否容易误判。如果有更好的判断方法,建议替换。

我刚发现我注释写的是 https://github.com/nju-lug/modern-nju-thesis/blob/8bdf5474b5d985155721ab21da5d38436f6b370b/utils/bilingual-bibliography.typ#L38 但代码写的是 https://github.com/nju-lug/modern-nju-thesis/blob/8bdf5474b5d985155721ab21da5d38436f6b370b/utils/bilingual-bibliography.typ#L40

注释与代码不符,应该改成 regex("\p{sc=Hani}{2,}") 才对。

目前还需要大量文献条目测试。我在考虑 https://github.com/nju-lug/modern-nju-thesis/blob/8bdf5474b5d985155721ab21da5d38436f6b370b/utils/bilingual-bibliography.typ#L67 这里有一个 default 情况,正常情况下是不会走到这个 default 里的(即:英文条目中不应该有汉语字符)。这里或许可以改成

mapping.at(itt.text, default: text(fill: red, itt.text))

甚至添加一些其他提示语,让用户报 issue 方便处理。

原本的代码中我也写错了,应该是 mapping.at(itt.text, default: itt.text) 才对,少了个 .text


您也可以在 SEU-Typst-Template 也维护一个反馈的 issue。

SEU 用的是 GB/T 7714-2015 的方言,得找个时间改出符合要求的 CSL 来……

csimide commented 2 months ago

所以这里我有一个借助闭包来解决这个问题的 workaround。

我偷懒先套娃了(

#bilingual-bibliography(
  bibliography(
    "ref.bib", 
    style: "gb-t-7714-2015-numeric-seu.csl"
  )
)
csimide commented 2 months ago

改了一下,现在支持根据译者数量自动选择 tran 还是 trans 了。判断数量的方法比较草率,可以看注释。

另外遇到了 译为 et al. 时补 . 和空格的问题,把 也单独做了一个替换逻辑。

特殊情况越做越多,怎么回事呢

已经传到 https://typst.app/project/rN08qR13YfLociKdV7b1Mx (它出现在了我的 typst.app 里)和 https://gist.github.com/csimide/fc0e3ef69775a69805fc6ba7af227c4c