“t” 改变 .bst 中的 .case$ 姓氏?

“t” 改变 .bst 中的 .case$ 姓氏?

由于 .bib 中的姓氏通常全部用大写字母表示,例如 VICTORIA,但大多数期刊不希望姓氏全部用大写字母表示,因此让 .bst 能够“t”更改姓氏以在参考文献中获取 Victoria 是很有用的。

我可以用类似这样的代码对一个.bst进行操作

 t #1 "{vv~}{ll}" format.name$ 
       uppercase.name
           {  "t" change.case$ }
           'skip$ 
       if$
 t #1 "{~f{~}}" format.name$ *
 t #1 "{, jj}" format.name$ *

但无法使其工作,model6-num-names.bst 可从爱思唯尔 邮编

我尝试的主要部分是从以下方面进行改变:

nameptr #1 >
    {
      namesleft #1 >
        { ", " * t * }
        {
          "," *
          s nameptr "{ll}" format.name$ duplicate$ "others" =
            { 't := }
            { pop$ }
          if$
          t "others" =
            {
              " " * bbl.etal *
            }
            { " " * t * }
          if$
        }
      if$
    }
    't
  if$

到:

nameptr #1 >
    {
      namesleft #1 >
        { ", " * t #1 "{vv~}{ll}" format.name$ 
                    "t" change.case$ 
            t #1 "{~f{~}}" format.name$ *
            t #1 "{, jj}" format.name$ * }
        {
          "," *
          s nameptr "{ll}" format.name$ duplicate$ "others" =
            { 't := }
            { pop$ }
          if$
          t "others" =
            {
              " " * bbl.etal *
            }
            { " " * t #1 "{vv~}{ll}" format.name$ 
                        "t" change.case$ 
                    t #1 "{~f{~}}" format.name$ *
                    t #1 "{, jj}" format.name$ * }
          if$
        }
      if$
    }
    't
  if$

由于 model6-num-names.bst 不需要 'uppercase.name' 函数,因此 'uppercase.name' if$ 部分简化为 "t" change.case$。

.bib 是:

@article{srarticle1p, author = {JEREMY, George and MICHAEL, JACKSON}, title = {The art of writing }, journal = {Software Engineering}, year = {2018}, month = {}, volume = {19}, number = {345}, pages = {1234}, doi = {}, }    @book{Strunk2000, author = {VICTORIA, Water and WHITE, Edison}, title = {The elements of style}, edition = {4th}, editor = {}, translator = {}, address = {New York}, publisher = {Longman}, year = {2000}, month = {}, volume = {}, number = {}, pages = {}, isbn = {}, doi = {}, }

但姓氏仍然全部大写:

姓氏仍然全部大写

我曾尝试将“t”change.case$ 放置在 .bst 周围,但仍然没有效果。

我们的专家能否指出正确的方法,即使在 .bib 中姓氏字母全部大写,也只保留姓氏首字母大写,其他字母小写?“t”会改变.case$ 姓氏吗?

答案1

model6-num-names.bst在几个地方调用format.names$。此外,有些用法format.names$实际上并未用于在输出中打印名称(这是您在问题中显示的已修改部分的情况:那里的代码执行了“et al.”处理,但没有打印名称)。

我们需要修改

  • FUNCTION {format.names}
  • FUNCTION {format.full.names}
  • FUNCTION {format.lab.names}

在 diff 中显示必要的更改比用很多文字描述它们稍微方便一些

--- model6-num-names.bst    2019-11-09 12:11:53.818725800 +0100
+++ model6-num-names-nocap.bst  2019-11-09 12:08:38.767078500 +0100
@@ -1,3 +1,12 @@
+%%%% `model6-num-names-nocap.bst'
+%%%% for https://tex.stackexchange.com/q/515600/35864
+%%%% 2019-11-09 MW
+%%%% adds `"t" change.case$` after almost all format.names$ calls
+%%%% to convert names from all uppercase to title case
+%%%%
+%%%% Original copyright header follows
+%%%% (distributed under LPPL 1.3c)
+%%%%
 %%
 %% This is file `model6-num-names.bst'  (Version 2.0),
 %% 
@@ -428,9 +437,11 @@
   s num.names$ 'numnames :=
   numnames 'namesleft :=
     { namesleft #0 > }
-    { s nameptr
-      "{vv~}{ll}{ jj}\xfnm[{ f{.}.}]"
-      format.name$
+    { s nameptr "{vv~}" format.name$ "t" change.case$
+      s nameptr "{ll}" format.name$ "t" change.case$
+      *
+      s nameptr "{ jj}\xfnm[{ f{.}.}]" format.name$
+      *
 %      remove.dots
       bibinfo bibinfo.check
       't :=
@@ -541,8 +552,9 @@
   s num.names$ 'numnames :=
   numnames 'namesleft :=
     { namesleft #0 > }
-    { s nameptr
-      "{vv~}{ll}" format.name$
+    { s nameptr "{vv~}" format.name$ "t" change.case$
+      s nameptr "{ll}" format.name$ "t" change.case$
+      *
       't :=
       nameptr #1 >
         {
@@ -1380,7 +1392,9 @@
 FUNCTION {format.lab.names}
 { 's :=
   "" 't :=
-  s #1 "{vv~}{ll}" format.name$
+  s #1 "{vv~}" format.name$ "t" change.case$
+  s #1 "{ll}" format.name$ "t" change.case$
+  *
   s num.names$ duplicate$
   #2 >
     { pop$
@@ -1392,7 +1406,11 @@
             {
               " " * bbl.etal *
             }
-            { bbl.and space.word * s #2 "{vv~}{ll}" format.name$
+            { bbl.and space.word
+              *
+              s #2 "{vv~}" format.name$ "t" change.case$
+              s #2 "{ll}" format.name$ "t" change.case$
+              *
               * }
           if$
         }

您可以在以下位置下载修改后的文件https://gist.github.com/moewew/a79d76d88fe0604ec428326865c22cc5,如果您有兴趣的话,该网站还会在修订选项卡中显示明显的差异。

请注意,我将调用拆分为"{vv~}{ll}"多个单独的调用,以确保带有 von 部分的名称不会被不必要地大写。


我应该提到我强烈建议以非大写形式在文件中输入姓名.bib。如果有必要,BibTeX 将姓名全部大写要比处理输入中的全部大写姓名容易得多(我真的希望这种情况很少发生,因为全部大写姓名看起来不太好看)。

相关内容