hushidong / biblatex-gb7714-2015

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

用法:多音字姓名的排序调整 #157

Open hushidong opened 1 year ago

hushidong commented 1 year ago

问题:姓的多音导致排序不正确

一些姓由于有个多音(比如:曾,沈等),且常用音还不是姓名中用的音时,使用默认的中文拼音排序会导致排序错误。

比如:下面的例子:

\documentclass{article}
\usepackage{ctex}

\begin{filecontents}[force]{\jobname.bib}
@thesis{曾某某,
author    = {曾某某},
title     = {CGF建模方法与应用研究},
publisher = {科技大学},
date      = {2010},
}

@thesis{白某某,
author    = {白某某},
title     = {CGF建模方法与应用研究},
publisher = {科技大学},
date      = {2010},
}

@thesis{戴某某,
author    = {戴某某},
title     = {CGF建模方法与应用研究},
publisher = {科技大学},
date      = {2010},
}

@thesis{沈某某,
author    = {沈某某},
title     = {CGF建模方法与应用研究},
publisher = {科技大学},
date      = {2011},
}

@thesis{王某某,
author    = {王某某},
title     = {CGF建模方法与应用研究},
publisher = {科技大学},
date      = {2011},
}

@thesis{齐某某,
author    = {齐某某},
title     = {CGF建模方法与应用研究},
publisher = {科技大学},
date      = {2011},
}
\end{filecontents}

\usepackage[style=gb7714-2015ay]{biblatex} %,defernumbers=true
\addbibresource{\jobname}

\begin{document}

text\nocite{*}

\printbibliography

\end{document} 

其结果为:

图片

可以看到,曾和沈,用ceng,chen的音做了排序,所以会在dai之前。

显然这并不是我们希望的正确的排序,所以,有必要的话,我们需要做调整。

hushidong commented 1 year ago

解决方案一:在key域添加正确的拼音,并使用排序模板,使其按key域排序

默认情况下:

gb7714-2015样式不使用排序模板,只按照文献的引用顺序进行排序,所以通常不需要处理。 但若要使用一定的排序,那么就要使用排序模板: gb7714-2015样式提供了gb7714-2015、gbnytd、gbyntd、gbynta四个排序模板都使用了key域,因此只要key域内能够填入正确的拼音就能得到正确的姓的排序。

而gb7714-2015ay样式,默认使用gb7714-2015排序模板,即以语言、作者、年份、标题、升序排列,其它gbnytd、gbyntd、gbynta 排序模板也都使用了key域,因此只要key域内能够填入正确的拼音就能得到正确的姓的排序。

所以问题的关键是如何在key域填入拼音。

第一种方式是,手动的填写。

打开bib文件,对中文的条目,添加key域,写入拼音,比如:

原来的条目为

@thesis{白某某,
author    = {白某某},
title     = {CGF建模方法与应用研究},
publisher = {科技大学},
date      = {2010},
}

修改为:

@thesis{白某某,
    author = {白某某},
    title = {CGF建模方法与应用研究},
    publisher = {科技大学},
    date = {2010},
    key = {bai2mou3mou3},
}

第二种方式是,利用bibmap工具自动填写。

bibmap工具见:https://github.com/hushidong/biblatex-map

步骤为: (1)下载后进入binary目录,并将上一级目录下的所有的py文件拷贝到binary目录下 (2)将需要修改的a.bib文件也拷到该目录下 (3)使用命令:

bibmap.exe a.bib --nofmt --addpinyin

会得到newa.bib,其内部的每条文献都会自动的添加拼音。

比如:

%% 
%% bib file modified by bibmap.py
%% 2023-03-31T17:19:26
%% 

@thesis{曾某某,
    author = {曾某某},
    title = {CGF建模方法与应用研究},
    publisher = {科技大学},
    date = {2010},
    key = {zeng1mou3mou3},
}

@thesis{白某某,
    author = {白某某},
    title = {CGF建模方法与应用研究},
    publisher = {科技大学},
    date = {2010},
    key = {bai2mou3mou3},
}

@thesis{戴某某,
    author = {戴某某},
    title = {CGF建模方法与应用研究},
    publisher = {科技大学},
    date = {2010},
    key = {dai4mou3mou3},
}

@thesis{沈某某,
    author = {沈某某},
    title = {CGF建模方法与应用研究},
    publisher = {科技大学},
    date = {2011},
    key = {shen3mou3mou3},
}

@thesis{王某某,
    author = {王某某},
    title = {CGF建模方法与应用研究},
    publisher = {科技大学},
    date = {2011},
    key = {wang2mou3mou3},
}

@thesis{齐某某,
    author = {齐某某},
    title = {CGF建模方法与应用研究},
    publisher = {科技大学},
    date = {2011},
    key = {ji4mou3mou3},
}

因此:使用新的文件可以得到正确的结果:

\documentclass{article}
\usepackage{ctex}

\usepackage[style=gb7714-2015ay]{biblatex} %,defernumbers=true
\addbibresource{\jobname.bib}

\begin{document}

text\nocite{*}

\printbibliography

\end{document} 

结果为: 图片

hushidong commented 1 year ago

解决方案二:使用修改后的Pinyin.pm模块替换原来的Pinyin.pm使多音的姓排序正确

为避免前一种方案添加拼音到key域的操作,这里提供一种可能更为方便的方法。

由于biber在做排序时实际上是利用 perl 的 Unicode::Collation::locale 模块,其中的Pinyin.pm提供了汉字的拼音顺序,对该文件做临时的修改,可以调整多音字的顺序。

因为在参考文献排序中通常会使用字的姓名音,所以我们对这个文件做非正式的修改,并放到github上,若用户需要正确的姓的多音字排序,那么只要用该文件替换biber临时工作目录中的文件即可。注意:目前只修改了“曾”“沈”等个字,而有些没有做修改,若用户有需求后面再增加。

通常biber在第一次运行的时候,会构建一个依赖目录,这也是biber的临时工作路径,而所有的依赖文件就在其中。 在windows下通常会在临时目录temp下构建类似par-<hex_encoded_username>/cache-的目录(其它系统也是类似命名,可以搜索一下),所有的依赖包括Pinyin.pm都会在其内部,找到并替换即可(Pinyin.pm文件通常在cache-<hex-code-string>\inc\lib\Unicode\Collate\CJK下)。

Pinyin.pm原始文件: Pinyin-origin.zip

pinyin.PM 修改后的(翟读di): Pinyin-modified-di.zip

pinyin.PM 修改后的(翟读翟): Pinyin-modified-zhai.zip

替换完毕后,我们即便不添加key域,同样能够排序正确:

\documentclass{article}
\usepackage{ctex}

\begin{filecontents}[force]{\jobname.bib}
@thesis{曾某某,
author    = {曾某某},
title     = {CGF建模方法与应用研究},
publisher = {科技大学},
date      = {2010},
}

@thesis{白某某,
author    = {白某某},
title     = {CGF建模方法与应用研究},
publisher = {科技大学},
date      = {2010},
}

@thesis{戴某某,
author    = {戴某某},
title     = {CGF建模方法与应用研究},
publisher = {科技大学},
date      = {2010},
}

@thesis{沈某某,
author    = {沈某某},
title     = {CGF建模方法与应用研究},
publisher = {科技大学},
date      = {2011},
}

@thesis{王某某,
author    = {王某某},
title     = {CGF建模方法与应用研究},
publisher = {科技大学},
date      = {2011},
}

@thesis{齐某某,
author    = {齐某某},
title     = {CGF建模方法与应用研究},
publisher = {科技大学},
date      = {2011},
}

\end{filecontents}

\usepackage[style=gb7714-2015ay]{biblatex} %,defernumbers=true
\addbibresource{\jobname}

\begin{document}

text\nocite{*}

\printbibliography

\end{document} 

结果为: 图片

earthmoon commented 1 year ago

您好,

方案二挺感兴趣的,但是我没有用过 perl ,所以对方案二大部分内容看不懂,我只能看懂思路。想请您指导我几个问题:

在windows下通常会在临时目录temp下构建类似par-<hex_encoded_username>/cache-的目录

这个temp文件夹通常在哪个位置?我应该在这个目录直接搜索par-<hex_encoded_username>/cache-吗?

因为在参考文献排序中通常会使用字的姓名音,所以我们对这个文件做非正式的修改,并放到github上,若用户需要正确的姓的多音字排序,那么只要用该文件替换biber临时工作目录中的文件即可。注意:目前只修改了“曾”“沈”两个字,而“翟”“仇”等没有做修改,若用户有需求后面再增加。

这些应该都有需求,因为文献里随时可能出现这些姓,还有应当为tang1,默认是shang1shan4。您方便做一个小白能够看懂的修改这个pm文件多音字的教程吗?

谢谢!

hushidong commented 1 year ago
  1. 对的,biber运行会生成这个目录,你搜pinyin.PM都能搜到。

  2. 该pm也不复杂,就是把字对应的unicode从原来的位置移动到合适的位置就可以。不过,最好你们还是提需求,我来统一改好了。 我后面把汤,单,仇也加进去吧。翟好像也有读di的姓,所以不改了。

earthmoon commented 1 year ago
  1. 对的,biber运行会生成这个目录,你搜pinyin.PM都能搜到。
  2. 该pm也不复杂,就是把字对应的unicode从原来的位置移动到合适的位置就可以。不过,最好你们还是提需求,我来统一改好了。 我后面把汤,单,仇也加进去吧。翟好像也有读di的姓,所以不改了。

北方者读(Dí音狄),迁居南方者读(Zhái音宅)。把它改成zhai2吧,因为古代的族很少见了。

这个网址总结比较全,个人感觉一次尽量全部搞清楚更省力。

麻烦了,谢谢!

earthmoon commented 1 year ago

为什么我搜索Pinyin.pm会出现两个目录:

"C:\Users\Office\AppData\Local\Temp\par-4f66666963655a656e67\cache-0fff6f0fbf692d8a03594920d947d8aa448181d1\inc\lib\Unicode\Collate\CJK\Pinyin.pm"
"C:\Users\Office\AppData\Local\Temp\par-4f66666963655a656e67\cache-96d297aa7563e182b1dd640f406e913a11204801\inc\lib\Unicode\Collate\CJK\Pinyin.pm"

哪一个是多余的?还是各有用途呢?

谢谢!

hushidong commented 1 year ago

你把两个最高层目录全部删掉,再次运行biber,会重新生成一个,就用那个里面的。

earthmoon commented 1 year ago

你全部删掉,再次运行biber,会重新生成一个,就用那个。

好的,谢谢!

earthmoon commented 1 year ago

再问一个技术问题,为什么别人在github上回复我,我无法在我邮箱中看到对方的邮箱地址。而您回复我,我可以看到您的邮箱地址。是哪里可以设置吗?

谢谢!

sikouhjw commented 1 year ago

再问一个技术问题,为什么别人在github上回复我,我无法在我邮箱中看到对方的邮箱地址。而您回复我,我可以看到您的邮箱地址。是哪里可以设置吗?

谢谢!

有没有可能,那不是邮箱地址,而是类似昵称的东西,只是昵称刚好是邮箱

hushidong commented 1 year ago

这个没有研究,我猜是账户设置时可能公开了?

earthmoon commented 1 year ago

@sikouhjw @hushidong Screenshot 2023-04-04 113546 Screenshot 2023-04-04 113517 就很奇怪~

earthmoon commented 1 year ago

再问一个技术问题,为什么别人在github上回复我,我无法在我邮箱中看到对方的邮箱地址。而您回复我,我可以看到您的邮箱地址。是哪里可以设置吗? 谢谢!

有没有可能,那不是邮箱地址,而是类似昵称的东西,只是昵称刚好是邮箱

他的昵称是hushidong,但他还能显示邮箱。

hushidong commented 1 year ago

hzzmail@163.com是我的昵称,hushidong是账户名。

earthmoon commented 1 year ago

hzzmail@163.com是我的昵称,hushidong是账户名。

Screenshot 2023-04-04 114113 Screenshot 2023-04-04 114050

难道他没有昵称?

earthmoon commented 1 year ago

确实可以没有昵称,原来我也没有昵称。。。

earthmoon commented 1 year ago

请教师兄一个问题:

对于一个完全没有学过 perl 语言的新手,应该学习 perl5 还是 perl6(raku) 。理由是什么呢?

谢谢!

hushidong commented 1 year ago

我个人认为,无所谓哪个,都是工具而已,需要用哪个的时候就学,两者估计差别不大。

另外,pinyin.pm已经更新,见前面的连接。

earthmoon commented 1 year ago

你好,可以帮忙查看下Pinyin.pm这个文件里面的是不是读zhang3?默认取chang2会不会更好?

hushidong commented 1 year ago

是zhang3

earthmoon commented 1 year ago

是zhang3

在 pinyin.pm 模块中,可以使用 Pinyin::Collate 模块来实现对汉字按拼音排序。其原理是依据 Unicode 标准,先将汉字转换为对应的 Unicode 编码,然后按照 Unicode 编码来进行排序。如果两个汉字的拼音相同,则会根据 Unicode 编码进行比较。

所以,其实pinyin.pm排序没有考虑笔划顺序对吧? 有没有办法将bibmap集成到biblatex-gb7714,提供option让用户开启,感觉你的bibmap更科学。

TomBener commented 3 months ago

在 macOS 上,我通过替换 /private/var/folders/*/*/T/par-*/cache-*/inc/lib/Unicode/Collate/CJK/Pinyin.pm 实现了多音字的正确排序,非常感谢。

不过我还有两个小问题:

  1. 替换后的 Pinyin.pm 文件是一直有效的吗?如果 biber 更新或系统清理了缓存,替换的 Pinyin.pm 会不会失效呢?

  2. 我还尝试了添加 key 的方式,例如:

@book{shenyao1936,
  author = {沈垚},
  date = {1936},
  publisher = {商務印書館},
  location = {上海},
  title = {落帆樓文稿},
  key = {shen3yao2}
}

在我的 .bib 文件中,只有这一个条目添加了 key 字段,编译之后为什么 shenyao1936 会被排到所有中文文献的最后呢?谢谢。

hushidong commented 3 months ago

如果要用key,那么所有文献都要用key才能正确排序。

缓存一遍不太会换的。若被清理了只能重新覆盖pinyin.PM文件了。

TomBener commented 2 months ago

经过验证,我发现 Biber 缓存会在电脑关机后被清理。为了使用胡老师修改后的 Pinyin.pm,我用 Keyboard Maestro 制作了一个 macro,用于在 Mac 开机时自动更新 Pinyin.pm

CleanShot 2024-04-21 at 08 47 58@2x

执行的命令如下:

# Get the path of the cache folder
cache_path=$(biber --cache)

# Copy updated `Pinyin.pm` to the cache folder
cp -f ~/Documents/Pinyin.pm "${cache_path}/inc/lib/Unicode/Collate/CJK/Pinyin.pm"

其他操作系统可参考这个命令进行修改,或者用其他自动化工具实现类似的操作。关于 Biber cache 的问题,可以参考 这个回答

hushidong commented 2 months ago

不错呀,自己动手丰衣足食。

TomBener commented 2 months ago

最近遇到一个「」(kàn)姓在参考文献列表排序时不正确,我看了一下它(U+961A)在 Pinyin.pm 中的位置是正确的:

770B 884E 5D01 5888 77B0 78E1 95DE 77D9 961A
5FFC 95F6 780A 7C87 5EB7 5ADD 5D7B 6177 6F2E 69FA

但为什么排序是下图这样的呢:

CleanShot 2024-05-10 at 17 10 38@2x

以及这里 姓也应该在 姓之后。

zepinglee commented 1 month ago

以及这里 姓也应该在 姓 之后。

似乎是数据有误。可以使用 https://github.com/unicode-org/cldr/blob/main/common/collation/zh.xml 的数据修正。

另外 https://github.com/unicode-org/cldr/blob/main/common/transforms/Han-Latin-Names.xml 也记录了一些姓名的多音字,但还不全,其中就没有包括“阚”。

TomBener commented 1 month ago

@zepinglee 谢谢,感觉确实是数据有误,不过「阚」不是一个多音字啊。

zepinglee commented 1 month ago

不过「阚」不是一个多音字啊。

collation/zh.xml 记录的拼音是 hǎn。

TomBener commented 1 month ago

感谢!我修改了一下 Pinyin.pm,调整了「阚」、「李」、「厉」的顺序,现在这几个姓氏可以根据拼音正确排序了。

Pinyin.pm.zip

另外推荐一下这两个网站,可以根据字符或 Unicode 编码查询对应的值:

hushidong commented 1 month ago

感谢