hushidong / biblatex-gb7714-2015

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

西文作者名包含短横线 hyphen 的缩写问题 #198

Closed TomBener closed 4 months ago

TomBener commented 4 months ago

当西文作者名(given name)包含短横线(hyphen)时,hyphen 后的部分首字母会显示出来,例如 Chiang Kai-shek 会显示为 Chiang, K s。MWE 如下:

\documentclass{article}

\usepackage[backend=biber,style=gb7714-2015ay,gbnamefmt=lowercase]{biblatex}

\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}

生成的 PDF 如下图所示。

CleanShot 2024-05-15 at 23 55 04@2x

上面的代码关闭了作者姓名大写,而 hyphen 后有的作者名大写,有的小写,因此会出现 Chang P YChang K n 这样大小写不一致的情况,并且这与作者名中不包含 hyphen 的情况也不协调。因此是否可以在缩写包含 hyphen 的姓名时,只保留第一个首字母?输出为下图这样的参考文献。

CleanShot 2024-05-15 at 23 57 31@2x

hushidong commented 4 months ago

关于包含hyphen的姓名,也有其它需求的,比如 https://github.com/hushidong/biblatex-gb7714-2015/issues/161 这是哪位同学当前要求的。

我想你前面给出的例子之所以不一致,主要还是bib文件里面不统一,-后面的一会大写一会小写,这本身会带来不统一。

所以一个方法是吧bib文件改成统一的规范,比如-后面受字母全大写。

当然也可以做不改也没事,可以通过biblatex宏来操作,比如下面两个例子:

hushidong commented 4 months ago

例一:这是做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} 

结果为:

图片

hushidong commented 4 months ago

例二:按原来的处理,只是从原来的默认的不改变大小写,变为强制大写。

\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} 

结果为:

图片

TomBener commented 4 months ago

所以一个方法是吧bib文件改成统一的规范,比如-后面受字母全大写。

这种方法似乎不可行,因为有的 - 后作者名是大写,有的是小写,这是他们自己的习惯。当设置 giveninits=false 时,在 .bib 文件中的修改不符合原作者的姓名形式。

例一符合我的需求,非常感谢!

TomBener commented 4 months ago

我测试了一下例一,下面的例子不太符合需求:

\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}

CleanShot 2024-05-16 at 10 17 14@2x

这里作者名被缩写为 Ho S,但感觉 Ho S P 比较合适,请问可以实现这种缩写吗?

hushidong commented 4 months ago

可以是可以,不过这有必要的么?看起来是要在姓名里面加入一个英文名和一个中文名,这种杂洋的方式,我个人是不喜欢或者不希望看到的。

示例一:

\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} 

结果为:

图片

TomBener commented 4 months ago

非常感谢,不过上面的例子中作者名 Ho Samuel Pao-San 不是中英文的混杂,而是其本来的名字。

zepinglee commented 4 months ago

西方人有的名中带 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”。

Screenshot 2024-05-16 at 11 43 41

另外 hyphen 后有小写的字母似乎主要常见于威妥玛拼音,不过按照西文的缩写习惯一般也保留后半部分,比如下面 https://en.wikipedia.org/wiki/Chinese_name#Comparison_chart 列出的 V. K. Wellington KooT. V. Soong等。

所以“Chiang Kai-shek”按照国标缩写为“CHIANG K S”更为合理。

hushidong commented 4 months ago

是的,若没其它特别的需求,实际上用默认国标方式是更ok的。

TomBener commented 4 months ago

西方人有的名中带 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 后如果是小写,就会被忽略,大写的话就会取首字母。

zepinglee commented 4 months ago

如果可以的话,最好是取“ 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。但我觉得这不太合理。

TomBener commented 4 months ago

如果可以的话,最好是取“ Kai-shek”的首字母“K s”并转为大写“K S”。

赞成这样的修改。

刚发现有个测试案例是这样的 citation-style-language/test-suite@4001cda/processor-tests/humans/name_LowercaseSurnameSuffix.txt。但我觉得这不太合理。

我也觉得这样不太合适,不过也是通过将 BibLaTeX 和 CSL 的对比,我才发现了二者的区别。想要通过 Pandoc 转换同时得到 DOCX 和 PDF,参考文献格式还是很难做到完全一致。