继续https://tex.stackexchange.com/a/472956/165772和https://gist.github.com/moewew/6a59fc23db6d2ab219b6f189a3645a06,我注意到作者姓名中的破折号可能会被空格替换。也就是说,在
\documentclass{article}
\usepackage[british,finnish,ngerman]{babel}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@PHDTHESIS{Back-OnTheCorrectnessOfRefinementStepsInProgramDevelopment,
author = {Ralph-Johan Back},
title = {On the correctness of refinement steps in program development},
school = {\foreignlanguage{finnish}{Åbo Akademi}, Department of Computer Science},
year = 1978,
address = {Helsinki, Finland},
note = {Report A--1978--4},
OPTpdf = {http://www.it.abo.fi/crest/publications/public/1978/OnTheCorrectnessOfRefinementStepsInProgramDevelpmentTR.pdf},
language={british}
}
\end{filecontents}
\usepackage{babelbib} % Multilingual bibliographies
\begin{document}
\cite{Back-OnTheCorrectnessOfRefinementStepsInProgramDevelopment}
\bibliographystyle{babalpha-fl-gs-sort}%%% Same with \bibliographystyle{babalpha}
\bibliography{\jobname}
\end{document}
生产
...
[Bac78] Ralph Johan 返回:关于程序细化步骤的正确性
...
特别是,Ralph 和 Johan 之间没有连字符,而应该有一个。虽然通过替换 可以很容易地根据具体情况解决这个问题-
,但我想知道是否有更永久的错误修复。从这个意义上讲,如果您的答案涉及改进 @moewe 的而不是原始的,{-}
我将不胜感激。babalpha-fl-gs-sort
babalpha-fl
(PS:如果可能的话,我真的不想从 babalpha-fl-gs-sort 更改为其他样式或从 bibtex 更改为 biber,因为这会在非最小示例中引发一系列其他兼容性问题,其中包含大量其他包,并且很可能还会出现出版商必须同意的格式额外更改。)
答案1
这似乎是 BibTeX 名称格式化程序的一个怪癖。Q35btxFAQ
似乎极其相关。
在格式化姓名时,它会在名字元素之间babalpha
插入可自定义的宏。以下调用会发生这种情况\btxfnamespacelong
s nameptr "{ff{\btxfnamespacelong } }{vv~}" format.name$
显然,BibTeX 不仅会拆分用空格分隔的名称(例如)Rolph Johan
,还会拆分用连字符连接的名称(例如),Ralph-Johan
以便在名字元素之间插入内容,甚至会丢弃连字符,因此最终会得到Ralph\btxfnamespacelong Johan
。
一个便宜的解决方法是
\newcommand*{\myhyphen}{-}
进而
author = {Ralph\myhyphen{}Johan Back},
对于 BibTeX 来说,Ralph\myhyphen{}Johan
是一个不会被分成两个名字Ralph
和的单位Johan
,所以您最终会得到预期的输出。
另一个保持.bib
内容合理的解决方法是简单地告诉.bst
样式不要理会\btxfnamespacelong
。由于\btxfnamespacelong
在所有默认设置中都是正常空间,所以babelbib
无论如何,删除这部分定义不会给您带来太大损失。
{ff{\btxfnamespacelong } }
在中搜索.bst
并将其替换为{ff }
(应该有两个结果)。
如果要保留\btxfnamespacelong
,则需要做额外的工作。本质上,我们需要手动完成自动执行的{ff }
操作{ff{\btxfnamespacelong } }
。
执行此操作的代码是从 中窃取的biblatex.bst
。我们使用 进行格式化{ff}
,然后手动将和替换
~
为\btxfnamespacelong
。理论上,这可能会导致非大括号级别的空格出现问题0
,但我想人们可以忍受。
不同之处babalpha-fl-gs-sort.bst
在于
--- babalpha-fl-gs-sort.bst 2019-03-28 09:19:33.293644400 +0100
+++ babalpha-fl-gs-sort-dash.bst 2019-03-28 09:25:55.925628100 +0100
@@ -1,3 +1,12 @@
+%%%%%%%% `babalpha-fl-gs-sort-dash.bst'
+%%%%%%%% even more tweaks for `babalpha-fl-gs-sort.bst'
+%%%%%%%% for https://tex.stackexchange.com/q/481557/35864
+%%%%%%%% this time we need to emulate {ff{\btxfnamespacelong } }
+%%%%%%%% most code stolen from biblatex.bst
+%%%%%%%% 2019-03-28 MW
+%%%%%%%%
+%%%%%%%% header of older versions follow
+%%%%%%%%
%%%%%% `babalpha-fl-gs-sort.bst'
%%%%%% babalpha-fl-gs with tweaked sorting
%%%%%% for https://tex.stackexchange.com/q/472951/35864
@@ -76,6 +85,7 @@
after.sentence
after.block
before.title
+ resvctra
}
STRINGS
@@ -84,6 +94,7 @@
language.state
change.temp
isbn.command
+ resvstrga resvstrgb resvstrgc
}
FUNCTION {init.state.consts}
@@ -382,6 +393,35 @@
INTEGERS { nameptr namesleft numnames }
+% from biblatex.bst
+FUNCTION {str:length} {
+ #1 'resvctra :=
+ { duplicate$ duplicate$ #1 resvctra substring$ = not }
+ { resvctra #1 + 'resvctra := }
+ while$
+ pop$
+ resvctra
+}
+
+FUNCTION {str:replace} {
+ 'resvstrga :=
+ 'resvstrgb :=
+ 'resvstrgc :=
+ resvstrgb str:length 'resvctra :=
+ ""
+ { resvstrgc empty$ not }
+ { resvstrgc #1 resvctra substring$ resvstrgb =
+ { resvstrga *
+ resvstrgc #1 resvctra + global.max$ substring$ 'resvstrgc :=
+ }
+ { resvstrgc #1 #1 substring$ *
+ resvstrgc #2 global.max$ substring$ 'resvstrgc :=
+ }
+ if$
+ }
+ while$
+}
+
FUNCTION {format.names}
{ 's :=
#1 'nameptr :=
@@ -390,7 +430,11 @@
{ namesleft #0 > }
{ nameptr #1 >
{
- s nameptr "{ff{\btxfnamespacelong } }{vv~}" format.name$
+ s nameptr "{ff}" format.name$
+ " " "\btxfnamespacelong " str:replace
+ "~" "\btxfnamespacelong " str:replace
+ duplicate$ empty$ 'skip$ { " " * } if$
+ s nameptr "{vv~}" format.name$ *
s nameptr "{ll}" format.name$ lastnamefont *
s nameptr "{, jj}" format.name$ *
't :=
@@ -408,7 +452,11 @@
if$
}
{
- s nameptr "{ff{\btxfnamespacelong } }{vv~}" format.name$
+ s nameptr "{ff}" format.name$
+ " " "\btxfnamespacelong " str:replace
+ "~" "\btxfnamespacelong " str:replace
+ duplicate$ empty$ 'skip$ { " " * } if$
+ s nameptr "{vv~}" format.name$ *
s nameptr "{ll}" format.name$ lastnamefont *
s nameptr "{,~jj}" format.name$ * namefont
}
修改后的文件babalpha-fl-gs-sort-dash.bst
可以在以下网址下载:https://gist.github.com/moewew/db4ea9fd7a76b74ed3a12ec0802c49c0
\documentclass{article}
\usepackage[british,swedish,ngerman]{babel}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@phdthesis{Back-OnTheCorrectnessOfRefinementStepsInProgramDevelopment,
author = {Ralph-Johan Back and Ralph Johan Bock},
title = {On the correctness of refinement steps in program development},
school = {\foreignlanguage{swedish}{Åbo Akademi}, Department of Computer Science},
year = 1978,
address = {Helsinki, Finland},
note = {Report A--1978--4},
language = {british},
}
\end{filecontents}
\usepackage{babelbib}
\begin{document}
\cite{Back-OnTheCorrectnessOfRefinementStepsInProgramDevelopment}
\bibliographystyle{babalpha-fl-gs-sort-dash}
\bibliography{\jobname}
\end{document}