biblatex-gb7714-2015
biblatex-gb7714-2015 copied to clipboard
用法:多音字姓名的排序调整
问题:姓的多音导致排序不正确
一些姓由于有个多音(比如:曾,沈等),且常用音还不是姓名中用的音时,使用默认的中文拼音排序会导致排序错误。
比如:下面的例子:
\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之前。
显然这并不是我们希望的正确的排序,所以,有必要的话,我们需要做调整。
解决方案一:在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}
结果为:
解决方案二:使用修改后的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}
结果为:
您好,
我方案二挺感兴趣的,但是我没有用过 perl ,所以对方案二大部分内容看不懂,我只能看懂思路。想请您指导我几个问题:
在windows下通常会在临时目录temp下构建类似
par-<hex_encoded_username>/cache-
的目录
这个temp文件夹通常在哪个位置?我应该在这个目录直接搜索par-<hex_encoded_username>/cache-
吗?
因为在参考文献排序中通常会使用字的姓名音,所以我们对这个文件做非正式的修改,并放到github上,若用户需要正确的姓的多音字排序,那么只要用该文件替换biber临时工作目录中的文件即可。注意:目前只修改了“曾”“沈”两个字,而“翟”“仇”等没有做修改,若用户有需求后面再增加。
这些应该都有需求,因为文献里随时可能出现这些姓,还有汤应当为tang1
,默认是shang1
;单为shan4
。您方便做一个小白能够看懂的修改这个pm文件多音字的教程吗?
谢谢!
-
对的,biber运行会生成这个目录,你搜pinyin.PM都能搜到。
-
该pm也不复杂,就是把字对应的unicode从原来的位置移动到合适的位置就可以。不过,最好你们还是提需求,我来统一改好了。 我后面把汤,单,仇也加进去吧。翟好像也有读di的姓,所以不改了。
- 对的,biber运行会生成这个目录,你搜pinyin.PM都能搜到。
- 该pm也不复杂,就是把字对应的unicode从原来的位置移动到合适的位置就可以。不过,最好你们还是提需求,我来统一改好了。 我后面把汤,单,仇也加进去吧。翟好像也有读di的姓,所以不改了。
翟北方者读(Dí音狄),迁居南方者读(Zhái音宅)。把它改成zhai2
吧,因为古代的狄族很少见了。
这个网址总结比较全,个人感觉一次尽量全部搞清楚更省力。
麻烦了,谢谢!
为什么我搜索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"
哪一个是多余的?还是各有用途呢?
谢谢!
你把两个最高层目录全部删掉,再次运行biber,会重新生成一个,就用那个里面的。
你全部删掉,再次运行biber,会重新生成一个,就用那个。
好的,谢谢!
再问一个技术问题,为什么别人在github上回复我,我无法在我邮箱中看到对方的邮箱地址。而您回复我,我可以看到您的邮箱地址。是哪里可以设置吗?
谢谢!
再问一个技术问题,为什么别人在github上回复我,我无法在我邮箱中看到对方的邮箱地址。而您回复我,我可以看到您的邮箱地址。是哪里可以设置吗?
谢谢!
有没有可能,那不是邮箱地址,而是类似昵称的东西,只是昵称刚好是邮箱
这个没有研究,我猜是账户设置时可能公开了?
@sikouhjw @hushidong
就很奇怪~
再问一个技术问题,为什么别人在github上回复我,我无法在我邮箱中看到对方的邮箱地址。而您回复我,我可以看到您的邮箱地址。是哪里可以设置吗? 谢谢!
有没有可能,那不是邮箱地址,而是类似昵称的东西,只是昵称刚好是邮箱
他的昵称是hushidong,但他还能显示邮箱。
[email protected]是我的昵称,hushidong是账户名。
确实可以没有昵称,原来我也没有昵称。。。
请教师兄一个问题:
对于一个完全没有学过 perl 语言的新手,应该学习 perl5 还是 perl6(raku) 。理由是什么呢?
谢谢!
我个人认为,无所谓哪个,都是工具而已,需要用哪个的时候就学,两者估计差别不大。
另外,pinyin.pm已经更新,见前面的连接。
你好,可以帮忙查看下Pinyin.pm
这个文件里面的长
是不是读zhang3
?默认取chang2
会不会更好?
是zhang3
是zhang3
在 pinyin.pm 模块中,可以使用 Pinyin::Collate 模块来实现对汉字按拼音排序。其原理是依据 Unicode 标准,先将汉字转换为对应的 Unicode 编码,然后按照 Unicode 编码来进行排序。如果两个汉字的拼音相同,则会根据 Unicode 编码进行比较。
所以,其实pinyin.pm
排序没有考虑笔划顺序对吧? 有没有办法将bibmap
集成到biblatex-gb7714
,提供option
让用户开启,感觉你的bibmap
更科学。
在 macOS 上,我通过替换 /private/var/folders/*/*/T/par-*/cache-*/inc/lib/Unicode/Collate/CJK/Pinyin.pm
实现了多音字的正确排序,非常感谢。
不过我还有两个小问题:
-
替换后的
Pinyin.pm
文件是一直有效的吗?如果 biber 更新或系统清理了缓存,替换的Pinyin.pm
会不会失效呢? -
我还尝试了添加
key
的方式,例如:
@book{shenyao1936,
author = {沈垚},
date = {1936},
publisher = {商務印書館},
location = {上海},
title = {落帆樓文稿},
key = {shen3yao2}
}
在我的 .bib
文件中,只有这一个条目添加了 key
字段,编译之后为什么 shenyao1936
会被排到所有中文文献的最后呢?谢谢。
如果要用key,那么所有文献都要用key才能正确排序。
缓存一遍不太会换的。若被清理了只能重新覆盖pinyin.PM文件了。
经过验证,我发现 Biber 缓存会在电脑关机后被清理。为了使用胡老师修改后的 Pinyin.pm
,我用 Keyboard Maestro 制作了一个 macro,用于在 Mac 开机时自动更新 Pinyin.pm
。
执行的命令如下:
# 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 的问题,可以参考 这个回答。
不错呀,自己动手丰衣足食。
最近遇到一个「阚」(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
但为什么排序是下图这样的呢:
以及这里 厉
姓也应该在 李
姓之后。
以及这里
厉
姓也应该在李
姓 之后。
似乎是数据有误。可以使用 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 也记录了一些姓名的多音字,但还不全,其中就没有包括“阚”。
@zepinglee 谢谢,感觉确实是数据有误,不过「阚」不是一个多音字啊。
感谢!我修改了一下 Pinyin.pm,调整了「阚」、「李」、「厉」的顺序,现在这几个姓氏可以根据拼音正确排序了。
另外推荐一下这两个网站,可以根据字符或 Unicode 编码查询对应的值:
- https://apps.timwhitlock.info/unicode/inspect
- https://bencrowder.github.io/unicode-inspector