为什么 babalpha 会删除破折号?

为什么 babalpha 会删除破折号?

继续https://tex.stackexchange.com/a/472956/165772https://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-sortbabalpha-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}

Ralph-Johan Back 和 Ralph Johan Bock:关于程序开发中细化步骤的正确性。博士论文,Åbo Akademi,计算机科学系,赫尔辛基,芬兰,1978 年。报告 A–1978–4。

相关内容