Closed TomBener closed 4 months ago
关于包含hyphen的姓名,也有其它需求的,比如 https://github.com/hushidong/biblatex-gb7714-2015/issues/161 这是哪位同学当前要求的。
我想你前面给出的例子之所以不一致,主要还是bib文件里面不统一,-后面的一会大写一会小写,这本身会带来不统一。
所以一个方法是吧bib文件改成统一的规范,比如-后面受字母全大写。
当然也可以做不改也没事,可以通过biblatex宏来操作,比如下面两个例子:
例一:这是做hypen判断,只取首字母了。
\documentclass{article}
\usepackage[backend=biber,style=gb7714-2015ay,gbnamefmt=lowercase]{biblatex}
\makeatletter
%GB/T 7714-2015 风格,大小写不变,根据bib文件内输入原样输出
\newbibmacro*{name:gblowercase}[4]{\bibauthorfont%
\gbcaselocalset%
\ifuseprefix
{\usebibmacro{name:delim}{#3#1}%
\usebibmacro{name:hook}{#3#1}%
\ifdefvoid{#3}{}{%
\ifcapital
{\mkbibnameprefix{\MakeCapital{#3}}\isdot}
{\mkbibnameprefix{#3}\isdot}%
\ifprefchar{}{\bibnamedelimc}}%
\ifdefvoid{#2}{\mkbibnamefamily{\MakeCapital{#1}}}{\mkbibnamefamily{{#1}}}\isdot%
\ifdefvoid{#2}{}{\IfSubStr{\namepartgiven}{-}{\StrLeft{\namepartgiven}{1}[\namegivenshort]}{\def\namegivenshort{#2}}%
\revsdnamepunct\bibnamedelimd\mkbibnamegiven{\MakeUppercase{\namegivenshort}}\isdot%
}%\MakeCapital
\ifdefvoid{#4}{}{\bibnamedelimd\mkbibnamesuffix{#4}\isdot}}
{\usebibmacro{name:delim}{#1}%
\usebibmacro{name:hook}{#1}%
\ifdefvoid{#2}{\mkbibnamefamily{\MakeCapital{#1}}}{\mkbibnamefamily{{#1}}}\isdot%
\ifboolexpe{%
test {\ifdefvoid{#2}}
and
test {\ifdefvoid{#3}}}
{}{\revsdnamepunct}%
\ifdefvoid{#2}{}{\IfSubStr{\namepartgiven}{-}{\StrLeft{\namepartgiven}{1}[\namegivenshort]}{\def\namegivenshort{#2}}%
\bibnamedelimd\mkbibnamegiven{\MakeUppercase{\namegivenshort}}\isdot%
}%\MakeCapital
\ifdefvoid{#3}{}{\bibnamedelimd\mkbibnameprefix{#3}\isdot}
\ifdefvoid{#4}{}{\bibnamedelimd\mkbibnamesuffix{#4}\isdot}}%
}
\makeatother
\begin{filecontents}[force,noheader]{\jobname.bib}
@book{chiang2013,
title = {China's {{Destiny}} and {{Chinese Economic Theory}}},
author = {Chiang, Kai-shek},
date = {2013},
publisher = {Brill},
location = {Leiden},
doi = {10.1163/9789004212732}
}
@article{chang2024,
title = {Struggling with Exactitude in a Fragmented State: {{Intelligence}} Testing in Early Twentieth-Century {{China}}},
author = {Chang, Pang-Yen},
date = {2024-03-17},
journaltitle = {History of Science},
doi = {10.1177/00732753241235432}
}
@book{chang1943,
title = {China's {{Struggle}} for {{Railroad Development}}},
author = {Chang, Kia-ngau},
date = {1943},
publisher = {The John Day Company},
location = {New York}
}
@article{ang2023b,
title = {Adaptive {{Political Economy}}: {{Toward}} a {{New Paradigm}}},
shorttitle = {Adaptive {{Political Economy}}},
author = {Ang, Yuen Yuen},
date = {2023-12},
journaltitle = {World Politics},
volume = {75},
number = {5},
doi = {10.1353/wp.0.a927487}
}
@article{burkhardt2024,
title = {Foundation Models Are Platform Models: {{Prompting}} and the Political Economy of {{AI}}},
author = {Burkhardt, Sarah and Rieder, Bernhard},
date = {2024-06-01},
journaltitle = {Big Data \& Society},
volume = {11},
number = {2},
doi = {10.1177/20539517241247839}
}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
\cite{chiang2013, chang2024, chang1943, ang2023b, burkhardt2024}
\printbibliography[heading=bibliography]
\end{document}
结果为:
例二:按原来的处理,只是从原来的默认的不改变大小写,变为强制大写。
\documentclass{article}
\usepackage[backend=biber,style=gb7714-2015ay,gbnamefmt=lowercase]{biblatex}
\makeatletter
%GB/T 7714-2015 风格,大小写不变,根据bib文件内输入原样输出
\newbibmacro*{name:gblowercase}[4]{\bibauthorfont%
\gbcaselocalset%
\ifuseprefix
{\usebibmacro{name:delim}{#3#1}%
\usebibmacro{name:hook}{#3#1}%
\ifdefvoid{#3}{}{%
\ifcapital
{\mkbibnameprefix{\MakeCapital{#3}}\isdot}
{\mkbibnameprefix{#3}\isdot}%
\ifprefchar{}{\bibnamedelimc}}%
\ifdefvoid{#2}{\mkbibnamefamily{\MakeCapital{#1}}}{\mkbibnamefamily{{#1}}}\isdot%
\ifdefvoid{#2}{}{\revsdnamepunct\bibnamedelimd\mkbibnamegiven{\MakeUppercase{#2}}\isdot}%\MakeCapital
\ifdefvoid{#4}{}{\bibnamedelimd\mkbibnamesuffix{#4}\isdot}}
{\usebibmacro{name:delim}{#1}%
\usebibmacro{name:hook}{#1}%
\ifdefvoid{#2}{\mkbibnamefamily{\MakeCapital{#1}}}{\mkbibnamefamily{{#1}}}\isdot%
\ifboolexpe{%
test {\ifdefvoid{#2}}
and
test {\ifdefvoid{#3}}}
{}{\revsdnamepunct}%
\ifdefvoid{#2}{}{\bibnamedelimd\mkbibnamegiven{\MakeUppercase{#2}}\isdot}
\ifdefvoid{#3}{}{\bibnamedelimd\mkbibnameprefix{#3}\isdot}
\ifdefvoid{#4}{}{\bibnamedelimd\mkbibnamesuffix{#4}\isdot}}%
}
\makeatother
\begin{filecontents}[force,noheader]{\jobname.bib}
@book{chiang2013,
title = {China's {{Destiny}} and {{Chinese Economic Theory}}},
author = {Chiang, Kai-shek},
date = {2013},
publisher = {Brill},
location = {Leiden},
doi = {10.1163/9789004212732}
}
@article{chang2024,
title = {Struggling with Exactitude in a Fragmented State: {{Intelligence}} Testing in Early Twentieth-Century {{China}}},
author = {Chang, Pang-Yen},
date = {2024-03-17},
journaltitle = {History of Science},
doi = {10.1177/00732753241235432}
}
@book{chang1943,
title = {China's {{Struggle}} for {{Railroad Development}}},
author = {Chang, Kia-ngau},
date = {1943},
publisher = {The John Day Company},
location = {New York}
}
@article{ang2023b,
title = {Adaptive {{Political Economy}}: {{Toward}} a {{New Paradigm}}},
shorttitle = {Adaptive {{Political Economy}}},
author = {Ang, Yuen Yuen},
date = {2023-12},
journaltitle = {World Politics},
volume = {75},
number = {5},
doi = {10.1353/wp.0.a927487}
}
@article{burkhardt2024,
title = {Foundation Models Are Platform Models: {{Prompting}} and the Political Economy of {{AI}}},
author = {Burkhardt, Sarah and Rieder, Bernhard},
date = {2024-06-01},
journaltitle = {Big Data \& Society},
volume = {11},
number = {2},
doi = {10.1177/20539517241247839}
}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
\cite{chiang2013, chang2024, chang1943, ang2023b, burkhardt2024}
\printbibliography[heading=bibliography]
\end{document}
结果为:
所以一个方法是吧bib文件改成统一的规范,比如-后面受字母全大写。
这种方法似乎不可行,因为有的 -
后作者名是大写,有的是小写,这是他们自己的习惯。当设置 giveninits=false
时,在 .bib
文件中的修改不符合原作者的姓名形式。
例一符合我的需求,非常感谢!
我测试了一下例一,下面的例子不太符合需求:
\documentclass{article}
\usepackage[backend=biber,style=gb7714-2015ay,gbnamefmt=lowercase]{biblatex}
\makeatletter
%GB/T 7714-2015 风格,大小写不变,根据bib文件内输入原样输出
\newbibmacro*{name:gblowercase}[4]{\bibauthorfont%
\gbcaselocalset%
\ifuseprefix
{\usebibmacro{name:delim}{#3#1}%
\usebibmacro{name:hook}{#3#1}%
\ifdefvoid{#3}{}{%
\ifcapital
{\mkbibnameprefix{\MakeCapital{#3}}\isdot}
{\mkbibnameprefix{#3}\isdot}%
\ifprefchar{}{\bibnamedelimc}}%
\ifdefvoid{#2}{\mkbibnamefamily{\MakeCapital{#1}}}{\mkbibnamefamily{{#1}}}\isdot%
\ifdefvoid{#2}{}{\IfSubStr{\namepartgiven}{-}{\StrLeft{\namepartgiven}{1}[\namegivenshort]}{\def\namegivenshort{#2}}%
\revsdnamepunct\bibnamedelimd\mkbibnamegiven{\MakeUppercase{\namegivenshort}}\isdot%
}%\MakeCapital
\ifdefvoid{#4}{}{\bibnamedelimd\mkbibnamesuffix{#4}\isdot}}
{\usebibmacro{name:delim}{#1}%
\usebibmacro{name:hook}{#1}%
\ifdefvoid{#2}{\mkbibnamefamily{\MakeCapital{#1}}}{\mkbibnamefamily{{#1}}}\isdot%
\ifboolexpe{%
test {\ifdefvoid{#2}}
and
test {\ifdefvoid{#3}}}
{}{\revsdnamepunct}%
\ifdefvoid{#2}{}{\IfSubStr{\namepartgiven}{-}{\StrLeft{\namepartgiven}{1}[\namegivenshort]}{\def\namegivenshort{#2}}%
\bibnamedelimd\mkbibnamegiven{\MakeUppercase{\namegivenshort}}\isdot%
}%\MakeCapital
\ifdefvoid{#3}{}{\bibnamedelimd\mkbibnameprefix{#3}\isdot}
\ifdefvoid{#4}{}{\bibnamedelimd\mkbibnamesuffix{#4}\isdot}}%
}
\makeatother
\begin{filecontents}[force,noheader]{\jobname.bib}
@incollection{ho1984,
title = {Colonialism and {{Development}}: {{Korea}}, {{Taiwan}}, and {{Kwantung}}},
booktitle = {The {{Japanese Colonial Empire}}, 1895--1945},
author = {Ho, Samuel Pao-San},
editor = {Myers, Ramon H. and Peattie, Mark R.},
date = {1984},
pages = {347--398},
publisher = {Princeton University Press},
location = {Princeton},
doi = {10.1515/9780691213873-013}
}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
\cite{ho1984}
\printbibliography[heading=bibliography]
\end{document}
这里作者名被缩写为 Ho S
,但感觉 Ho S P
比较合适,请问可以实现这种缩写吗?
可以是可以,不过这有必要的么?看起来是要在姓名里面加入一个英文名和一个中文名,这种杂洋的方式,我个人是不喜欢或者不希望看到的。
示例一:
\documentclass{article}
\usepackage[backend=biber,style=gb7714-2015ay,gbnamefmt=lowercase]{biblatex}
\makeatletter
%GB/T 7714-2015 风格,大小写不变,根据bib文件内输入原样输出
\newbibmacro*{name:gblowercase}[4]{\bibauthorfont%
\gbcaselocalset%
\ifuseprefix
{\usebibmacro{name:delim}{#3#1}%
\usebibmacro{name:hook}{#3#1}%
\ifdefvoid{#3}{}{%
\ifcapital
{\mkbibnameprefix{\MakeCapital{#3}}\isdot}
{\mkbibnameprefix{#3}\isdot}%
\ifprefchar{}{\bibnamedelimc}}%
\ifdefvoid{#2}{\mkbibnamefamily{\MakeCapital{#1}}}{\mkbibnamefamily{{#1}}}\isdot%
\ifdefvoid{#2}{}{\IfSubStr{\namepartgiven}{-}{\expandarg\IfSubStr{\namepartgiven}{\noexpand\bibnamedelima}%
{\expandarg\StrBefore{\namepartgiveni}{\noexpand\bibinithyphendelim}[\namegivenshort]}%
{\StrLeft{\namepartgiven}{1}[\namegivenshort]}}%
{\def\namegivenshort{#2}}%
\revsdnamepunct\bibnamedelimd\mkbibnamegiven{\MakeUppercase{\namegivenshort}}\isdot%
}%\MakeCapital
\ifdefvoid{#4}{}{\bibnamedelimd\mkbibnamesuffix{#4}\isdot}}
{\usebibmacro{name:delim}{#1}%
\usebibmacro{name:hook}{#1}%
\ifdefvoid{#2}{\mkbibnamefamily{\MakeCapital{#1}}}{\mkbibnamefamily{{#1}}}\isdot%
\ifboolexpe{%
test {\ifdefvoid{#2}}
and
test {\ifdefvoid{#3}}}
{}{\revsdnamepunct}%
\ifdefvoid{#2}{}{\IfSubStr{\namepartgiven}{-}{\expandarg\IfSubStr{\namepartgiven}{\noexpand\bibnamedelima}%
{\expandarg\StrBefore{\namepartgiveni}{\noexpand\bibinithyphendelim}[\namegivenshort]}%
{\StrLeft{\namepartgiven}{1}[\namegivenshort]}}%
{\def\namegivenshort{#2}}%
\bibnamedelimd\mkbibnamegiven{\MakeUppercase{\namegivenshort}}\isdot%
}%\MakeCapital
\ifdefvoid{#3}{}{\bibnamedelimd\mkbibnameprefix{#3}\isdot}
\ifdefvoid{#4}{}{\bibnamedelimd\mkbibnamesuffix{#4}\isdot}}%
}
\makeatother
\begin{filecontents}[force,noheader]{\jobname.bib}
@book{chiang2013,
title = {China's {{Destiny}} and {{Chinese Economic Theory}}},
author = {Chiang, Kai-shek},
date = {2013},
publisher = {Brill},
location = {Leiden},
doi = {10.1163/9789004212732}
}
@article{chang2024,
title = {Struggling with Exactitude in a Fragmented State: {{Intelligence}} Testing in Early Twentieth-Century {{China}}},
author = {Chang, Pang-Yen},
date = {2024-03-17},
journaltitle = {History of Science},
doi = {10.1177/00732753241235432}
}
@book{chang1943,
title = {China's {{Struggle}} for {{Railroad Development}}},
author = {Chang, Kia-ngau},
date = {1943},
publisher = {The John Day Company},
location = {New York}
}
@article{ang2023b,
title = {Adaptive {{Political Economy}}: {{Toward}} a {{New Paradigm}}},
shorttitle = {Adaptive {{Political Economy}}},
author = {Ang, Yuen Yuen},
date = {2023-12},
journaltitle = {World Politics},
volume = {75},
number = {5},
doi = {10.1353/wp.0.a927487}
}
@article{burkhardt2024,
title = {Foundation Models Are Platform Models: {{Prompting}} and the Political Economy of {{AI}}},
author = {Burkhardt, Sarah and Rieder, Bernhard},
date = {2024-06-01},
journaltitle = {Big Data \& Society},
volume = {11},
number = {2},
doi = {10.1177/20539517241247839}
}
@incollection{ho1984,
title = {Colonialism and {{Development}}: {{Korea}}, {{Taiwan}}, and {{Kwantung}}},
booktitle = {The {{Japanese Colonial Empire}}, 1895--1945},
author = {Ho, Samuel Pao-San},
editor = {Myers, Ramon H. and Peattie, Mark R.},
date = {1984},
pages = {347--398},
publisher = {Princeton University Press},
location = {Princeton},
doi = {10.1515/9780691213873-013}
}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
\cite{chiang2013, chang2024, chang1943, ang2023b, burkhardt2024,ho1984}
\printbibliography[heading=bibliography]
\end{document}
结果为:
非常感谢,不过上面的例子中作者名 Ho Samuel Pao-San 不是中英文的混杂,而是其本来的名字。
西方人有的名中带 hyphen,比如“ Pierre-Simon Laplace”,一般缩写为“P.-S.”或省略 hyphen 的 “P. S.”,但很少省略后面的部分。
国标 A.8 节有个例子 https://doi.org/10.1080/01639374.2010.508711。其第一作者名为“Jung-Ran Park”(似乎是韩国人),国标采用的格式是省略 hyphen 的“PARK J R”。
另外 hyphen 后有小写的字母似乎主要常见于威妥玛拼音,不过按照西文的缩写习惯一般也保留后半部分,比如下面 https://en.wikipedia.org/wiki/Chinese_name#Comparison_chart 列出的 V. K. Wellington Koo、T. V. Soong等。
所以“Chiang Kai-shek”按照国标缩写为“CHIANG K S”更为合理。
是的,若没其它特别的需求,实际上用默认国标方式是更ok的。
西方人有的名中带 hyphen,比如“ Pierre-Simon Laplace”,一般缩写为“P.-S.”或省略 hyphen 的 “P. S.”,但很少省略后面的部分。
确实,这种缩写方式比较合适。但主要是 hyphen 后有的首字母大写,有的小写(上面的例子中 hyphen 后字母小写的确实都是威妥玛拼音),如果显示 hyphen 后的首字母的话,大小写不一致,所以要么全部大写,要么不显示 hyphen 后的部分。
发现一个很小的细节,在 Citation Style Language (CSL) 中,如果设置 initialize-with=" " initialize-with-hyphen="false"
,Chiang Kai-shek
会被缩写为 Chiang K
,而 Chang Pang-Yen
会缩写为 Chang P Y
,也就是 hyphen 后如果是小写,就会被忽略,大写的话就会取首字母。
如果可以的话,最好是取“ Kai-shek”的首字母“K s”并转为大写“K S”。不确定这样这样会不会有什么副作用,比如像“Jean de La Fontaine”中小写的“de”。国标中既没有规定也没有示例。
发现一个很小的细节,在 Citation Style Language (CSL) 中,如果设置
initialize-with=" " initialize-with-hyphen="false"
,Chiang Kai-shek
会被缩写为Chiang K
,而Chang Pang-Yen
会缩写为Chang P Y
,也就是 hyphen 后如果是小写,就会被忽略,大写的话就会取首字母。
刚发现有个测试案例是这样的 https://github.com/citation-style-language/test-suite/blob/4001cdada66cd30f2ba1b8ae45a8da20f407dec0/processor-tests/humans/name_LowercaseSurnameSuffix.txt。但我觉得这不太合理。
如果可以的话,最好是取“ Kai-shek”的首字母“K s”并转为大写“K S”。
赞成这样的修改。
刚发现有个测试案例是这样的 citation-style-language/test-suite@
4001cda
/processor-tests/humans/name_LowercaseSurnameSuffix.txt。但我觉得这不太合理。
我也觉得这样不太合适,不过也是通过将 BibLaTeX 和 CSL 的对比,我才发现了二者的区别。想要通过 Pandoc 转换同时得到 DOCX 和 PDF,参考文献格式还是很难做到完全一致。
当西文作者名(given name)包含短横线(hyphen)时,hyphen 后的部分首字母会显示出来,例如
Chiang Kai-shek
会显示为Chiang, K s
。MWE 如下:生成的 PDF 如下图所示。
上面的代码关闭了作者姓名大写,而 hyphen 后有的作者名大写,有的小写,因此会出现
Chang P Y
和Chang K n
这样大小写不一致的情况,并且这与作者名中不包含 hyphen 的情况也不协调。因此是否可以在缩写包含 hyphen 的姓名时,只保留第一个首字母?输出为下图这样的参考文献。