DOI 中的 < > 字符导致格式问题

DOI 中的 < > 字符导致格式问题

当使用包含不常见字符(<、> 等)的 DOI 时,需要在数学模式下将其输入到 latex 中才能正确格式化。问题是,在 .bib 文件中执行此操作会破坏相关链接。以下示例是链接可以正常工作但格式无效的版本:

在此处输入图片描述

MWV 附带两个版本的 .bib 输入,一个版本包含用 $ 括起来的字符(不适用于链接),另一个版本包含未括起来的字符,格式为上下颠倒的“!”等。

我打开了一个错误案例(https://github.com/retorquere/zotero-better-bibtex/issues/2644#issuecomment-1709710696) 与更好的 bibtex 提供商合作(因为我的 .bib 文件就是通过它生成的),但没有成功。

主文本

\documentclass{report}
\usepackage[round]{natbib}                              % BiBTeX style
\usepackage{hyperref}

\begin{document}

\citep{Apel1985}
\cite{Apel19852}
\bibliographystyle{jfm}
\bibliography{BIB}

\end{document}

书目

@article{Apel1985,
  title = {The {{Sulu Sea Internal Soliton Experiment}}},
  author = {Apel, John R. and Holbrook, James R. and Liu, Antony K. and Tsai, John J.},
  year = {1985},
  month = dec,
  journal = {Journal of Physical Oceanography},
  volume = {15},
  number = {12},
  pages = {1625--1651},
  publisher = {{American Meteorological Society}},
  issn = {0022-3670, 1520-0485},
  doi = {10.1175/1520-0485(1985)015<1625:TSSISE>2.0.CO;2},
  url = {https://journals.ametsoc.org/view/journals/phoc/15/12/1520-0485_1985_015_1625_tssise_2_0_co_2.xml},
  urldate = {2023-06-22},
  abstract = {Abstract},
  chapter = {Journal of Physical Oceanography},
  langid = {english}
}
@article{Apel19852,
  title = {The {{Sulu Sea Internal Soliton Experiment}}},
  author = {Apel, John R. and Holbrook, James R. and Liu, Antony K. and Tsai, John J.},
  year = {1985},
  month = dec,
  journal = {Journal of Physical Oceanography},
  volume = {15},
  number = {12},
  pages = {1625--1651},
  publisher = {{American Meteorological Society}},
  issn = {0022-3670, 1520-0485},
  doi = {10.1175/1520-0485(1985)015$<$1625:TSSISE$>$2.0.CO;2},
  url = {https://journals.ametsoc.org/view/journals/phoc/15/12/1520-0485_1985_015_1625_tssise_2_0_co_2.xml},
  urldate = {2023-06-22},
  abstract = {Abstract },
  chapter = {Journal of Physical Oceanography},
  langid = {english}
}

杰夫


ENTRY
   { address
     author
     booktitle
     chapter
     edition
     editor
     howpublished
     institution
     journal
     key
     month
     note
     number
     organization
     pages
     publisher
     school
     series
     title
     type
     volume
     year
     eprint
     doi
   }
   {}
   { label extra.label sort.label short.list }

INTEGERS { output.state before.all mid.sentence after.sentence after.block }

FUNCTION {init.state.consts}
{ #0 'before.all :=
   #1 'mid.sentence :=
   #2 'after.sentence :=
   #3 'after.block :=
}

STRINGS { s t }

FUNCTION {output.nonnull}
{ 's :=
   output.state mid.sentence =
     { ", " * write$ }
     { output.state after.block =
         { add.period$ write$
           newline$
           "\newblock " write$
         }
         { output.state before.all =
             'write$
             { add.period$ " " * write$ }
           if$
         }
       if$
       mid.sentence 'output.state :=
     }
   if$
   s
}

FUNCTION {output}
{ duplicate$ empty$
     'pop$
     'output.nonnull
   if$
}

FUNCTION {output.check}
{ 't :=
   duplicate$ empty$
     { pop$ "empty " t * " in " * cite$ * warning$ }
     'output.nonnull
   if$
}

FUNCTION {fin.entry}
{ add.period$
   write$
   newline$
}

FUNCTION {new.block}
{ output.state before.all =
     'skip$
     { after.block 'output.state := }
   if$
}

FUNCTION {new.sentence}
{ output.state after.block =
     'skip$
     { output.state before.all =
         'skip$
         { after.sentence 'output.state := }
       if$
     }
   if$
}

FUNCTION {add.blank}
{  " " * before.all 'output.state :=
}

FUNCTION {date.block}
{
   add.blank
}

FUNCTION {not}
{   { #0 }
     { #1 }
   if$
}

FUNCTION {and}
{   'skip$
     { pop$ #0 }
   if$
}

FUNCTION {or}
{   { pop$ #1 }
     'skip$
   if$
}

FUNCTION {new.block.checkb}
{ empty$
   swap$ empty$
   and
     'skip$
     'new.block
   if$
}

FUNCTION {field.or.null}
{ duplicate$ empty$
     { pop$ "" }
     'skip$
   if$
}

FUNCTION {emphasize}
{ duplicate$ empty$
     { pop$ "" }
     { "{\em " swap$ * "\/}" * }
   if$
}

FUNCTION {cmd@author}
{ duplicate$ empty$
     { pop$ "" }
     { "\au{" swap$ * "}" * }
   if$
}

FUNCTION {cmd@editor}
{ duplicate$ empty$
     { pop$ "" }
     { "\ed{" swap$ * "}" * }
   if$
}

FUNCTION {cmd@year}
{ duplicate$ empty$
     { pop$ "" }
     { " \yr{" swap$ * "}" * }
   if$
}

FUNCTION {cmd@atitle}
{ duplicate$ empty$
     { pop$ "" }
     { " \at{" swap$ * "}" * }
   if$
}
FUNCTION {cmd@jtitle}
{ duplicate$ empty$
     { pop$ "" }
     { " \jt{" swap$ * "}" * }
   if$
}
FUNCTION {cmd@bktitle}
{ duplicate$ empty$
     { pop$ "" }
     { " \bt{" swap$ * "}" * }
   if$
}

FUNCTION {cmd@seriestitle}
{ duplicate$ empty$
     { pop$ "" }
     { " \st{" swap$ * "}" * }
   if$
}

FUNCTION {cmd@bvolume}
{ duplicate$ empty$
     { pop$ "" }
     { " \bvol{" swap$ * "}" * }
   if$
}

FUNCTION {cmd@volume}
{ duplicate$ empty$
     { pop$ "" }
     { " \vol{" swap$ * "}" * }
   if$
}

FUNCTION {cmd@pages}
{ duplicate$ empty$
     { pop$ "" }
     { " \pg{" swap$ * "}" * }
   if$
}

FUNCTION {cmd@publisher}
{ duplicate$ empty$
     { pop$ "" }
     { " \publ{" swap$ * "}" * }
   if$
}

FUNCTION {cmd@arxiv}
{ duplicate$ empty$
     { pop$ "" }
     { " \arxiv{arXiv: " swap$ * "}" * }
   if$
}

FUNCTION {cmd@org}
{ duplicate$ empty$
     { pop$ "" }
     { " \org{" swap$ * "}" * }
   if$
}


FUNCTION {bolden}
{ duplicate$ empty$
     { pop$ "" }
     { "{\bf " swap$ * "}" * }
   if$
}

FUNCTION {scaps}
{ duplicate$ empty$
     { pop$ "" }
     { "{\sc " swap$ * "}" * }
   if$
}

FUNCTION {capitalize}
{ "u" change.case$ "t" change.case$ }

FUNCTION {space.word}
{ " " swap$ * " " * }

  % Here are the language-specific definitions for explicit words.
  % Each function has a name bbl.xxx where xxx is the English word.
  % The language selected here is ENGLISH
FUNCTION {bbl.and}
{ "and"}

FUNCTION {bbl.editors}
{ "ed." }

FUNCTION {bbl.editor}
{ "ed." }

FUNCTION {bbl.edby}
{ "edited by" }

FUNCTION {bbl.edition}
{ "edn." }

FUNCTION {bbl.volume}
{ "vol." }

FUNCTION {bbl.of}
{ "of" }

FUNCTION {bbl.number}
{ "" }

FUNCTION {bbl.nr}
{ "no." }

FUNCTION {bbl.in}
{ "in" }

FUNCTION {bbl.pages}
{ "pp." }

FUNCTION {bbl.page}
{ "p." }

FUNCTION {bbl.chapter}
{ "chap." }

FUNCTION {bbl.techrep}
{ "Tech. Rep." }

FUNCTION {bbl.mthesis}
{ "Master's thesis" }

FUNCTION {bbl.phdthesis}
{ "PhD thesis" }

FUNCTION {bbl.first}
{ "1st" }

FUNCTION {bbl.second}
{ "2nd" }

FUNCTION {bbl.third}
{ "3rd" }

FUNCTION {bbl.fourth}
{ "4th" }

FUNCTION {bbl.fifth}
{ "5th" }

FUNCTION {bbl.st}
{ "st" }

FUNCTION {bbl.nd}
{ "nd" }

FUNCTION {bbl.rd}
{ "rd" }

FUNCTION {bbl.th}
{ "th" }

MACRO {jan} {"Jan."}

MACRO {feb} {"Feb."}

MACRO {mar} {"Mar."}

MACRO {apr} {"Apr."}

MACRO {may} {"May"}

MACRO {jun} {"Jun."}

MACRO {jul} {"Jul."}

MACRO {aug} {"Aug."}

MACRO {sep} {"Sep."}

MACRO {oct} {"Oct."}

MACRO {nov} {"Nov."}

MACRO {dec} {"Dec."}

FUNCTION {eng.ord}
{ duplicate$ "1" swap$ *
   #-2 #1 substring$ "1" =
      { bbl.th * }
      { duplicate$ #-1 #1 substring$
        duplicate$ "1" =
          { pop$ bbl.st * }
          { duplicate$ "2" =
              { pop$ bbl.nd * }
              { "3" =
                  { bbl.rd * }
                  { bbl.th * }
                if$
              }
            if$
           }
        if$
      }
    if$
}

MACRO {acmcs} {"ACM Computing Surveys"}

MACRO {acta} {"Acta Informatica"}

MACRO {cacm} {"Communications of the ACM"}

MACRO {ibmjrd} {"IBM Journal of Research and Development"}

MACRO {ibmsj} {"IBM Systems Journal"}

MACRO {ieeese} {"IEEE Transactions on Software Engineering"}

MACRO {ieeetc} {"IEEE Transactions on Computers"}

MACRO {ieeetcad}
  {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"}

MACRO {ipl} {"Information Processing Letters"}

MACRO {jacm} {"Journal of the ACM"}

MACRO {jcss} {"Journal of Computer and System Sciences"}

MACRO {scp} {"Science of Computer Programming"}

MACRO {sicomp} {"SIAM Journal on Computing"}

MACRO {tocs} {"ACM Transactions on Computer Systems"}

MACRO {tods} {"ACM Transactions on Database Systems"}

MACRO {tog} {"ACM Transactions on Graphics"}

MACRO {toms} {"ACM Transactions on Mathematical Software"}

MACRO {toois} {"ACM Transactions on Office Information Systems"}

MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"}

MACRO {tcs} {"Theoretical Computer Science"}

INTEGERS { nameptr namesleft numnames }

FUNCTION {format.names}
{ 's :=
   #1 'nameptr :=
   s num.names$ 'numnames :=
   numnames 'namesleft :=
     { namesleft #0 > }
     { s nameptr
       "{vv~}{ll}{, jj}{, ff}" format.name$ cmd@author 't :=
       nameptr #1 >
         {
           namesleft #1 >
             { ", " * t * }
             {
               t "others" =
                 { " " * "et~al." emphasize * }
                 { " \& " * t * }
               if$
             }
           if$
         }
         't
       if$
       nameptr #1 + 'nameptr :=
       namesleft #1 - 'namesleft :=
     }
   while$
}

FUNCTION {format.names.ed}
{ 's :=
   #1 'nameptr :=
   s num.names$ 'numnames :=
   numnames 'namesleft :=
     { namesleft #0 > }
     { s nameptr
       "{ff~}{vv~}{ll}{, jj}"
       format.name$ 't :=
       nameptr #1 >
         {
           namesleft #1 >
             { ", " * t * }
             {
               t "others" =
                 { " " * "et~al." emphasize * }
                 { " \& " * t * }
               if$
             }
           if$
         }
         't
       if$
       nameptr #1 + 'nameptr :=
       namesleft #1 - 'namesleft :=
     }
   while$
}

FUNCTION {format.key}
{ empty$
     { key field.or.null }
     { "" }
   if$
}

FUNCTION {format.authors}
{ author empty$
     { "" }
     {
      author format.names scaps 
     }
   if$
}

FUNCTION {format.editors}
{ editor empty$
     { "" }
     {
       editor format.names scaps
       editor num.names$ #1 >
         { ", " * bbl.editors * }
         { ", " * bbl.editor * }
       if$
     }
   if$
}

FUNCTION {format.in.editors}
{ editor empty$
     { "" }
     { editor format.names.ed cmd@editor
     }
   if$
}

FUNCTION {format.note}
{ note empty$
     { "" }
     { note #1 #1 substring$
       duplicate$ "{" =
         'skip$
         { output.state mid.sentence =
           { "l" }
           { "u" }
         if$
         change.case$
         }
       if$
       note #2 global.max$ substring$ *
     }
   if$
}

FUNCTION {format.title}
{ title empty$
     { "" }
     { title "t" change.case$
     }
   if$
}

FUNCTION {format.full.names}
{'s :=
   #1 'nameptr :=
   s num.names$ 'numnames :=
   numnames 'namesleft :=
     { namesleft #0 > }
     { s nameptr
       "{vv~}{ll}" format.name$ 't :=
       nameptr #1 >
         {
           namesleft #1 >
             { ", " * t * }
             {
               t "others" =
                 { " " * "et~al." emphasize * }
                 { " \& " * t * }
               if$
             }
           if$
         }
         't
       if$
       nameptr #1 + 'nameptr :=
       namesleft #1 - 'namesleft :=
     }
   while$
}

FUNCTION {author.editor.key.full}
{ author empty$
     { editor empty$
         { key empty$
             { cite$ #1 #3 substring$ }
             'key
           if$
         }
         { editor format.full.names }
       if$
     }
     { author format.full.names }
   if$
}

FUNCTION {author.key.full}
{ author empty$
     { key empty$
          { cite$ #1 #3 substring$ }
           'key
       if$
     }
     { author format.full.names }
   if$
}

FUNCTION {editor.key.full}
{ editor empty$
     { key empty$
          { cite$ #1 #3 substring$ }
           'key
       if$
     }
     { editor format.full.names }
   if$
}

FUNCTION {make.full.names}
{ type$ "book" =
   type$ "inbook" =
   or
     'author.editor.key.full
     { type$ "proceedings" =
         'editor.key.full
         'author.key.full
       if$
     }
   if$
}

FUNCTION {output.bibitem}
{ newline$
   "\bibitem[" write$
   label write$
   ")" make.full.names duplicate$ short.list =
      { pop$ }
      { * }
    if$
   "]{" * write$
   cite$ write$
   "}" write$
   newline$
   ""
   before.all 'output.state :=
}

FUNCTION {n.dashify}
{ 't :=
   ""
     { t empty$ not }
     { t #1 #1 substring$ "-" =
         { t #1 #2 substring$ "--" = not
             { "--" *
               t #2 global.max$ substring$ 't :=
             }
             {   { t #1 #1 substring$ "-" = }
                 { "-" *
                   t #2 global.max$ substring$ 't :=
                 }
               while$
             }
           if$
         }
         { t #1 #1 substring$ *
           t #2 global.max$ substring$ 't :=
         }
       if$
     }
   while$
}

FUNCTION {word.in}
{ bbl.in capitalize
   " " * }

FUNCTION {format.date}
{ year duplicate$ empty$
     { "empty year in " cite$ * "; set to ????" * warning$
        pop$ "????" }
     'skip$
   if$
   extra.label *
   before.all 'output.state :=
   "" swap$ * cmd@year
}

FUNCTION {format.btitle}
{ title emphasize
}

FUNCTION {tie.or.space.connect}
{ duplicate$ text.length$ #3 <
     { "~" }
     { " " }
   if$
   swap$ * *
}

FUNCTION {either.or.check}
{ empty$
     'pop$
     { "can't use both " swap$ * " fields in " * cite$ * warning$ }
   if$
}

FUNCTION {format.bvolume}
% Changed (SGLS)
% Notes swap$ fudge
{ volume empty$
     { "" }
     { series empty$
        { "" }
        { series cmd@seriestitle }
      if$
      swap$ bbl.volume volume tie.or.space.connect output cmd@volume
     }
   if$
}
%{ volume empty$
%    { "" }
%    { bbl.volume volume tie.or.space.connect
%      series empty$
%        'skip$
%        { bbl.of space.word * series emphasize * }
%      if$
%      "volume and number" number either.or.check
%    }
%  if$
%}

FUNCTION {format.number.series}
% Changed (SGLS)
{
  volume empty$
     { series empty$
         { ""
           number empty$
             'skip$
             { "there's a number but no series in " cite$ * warning$ }
           if$
         }
         { series emphasize " " * number *}
       if$
     }
     { "" }
   if$
}
%{ volume empty$
%    { number empty$
%        { series field.or.null }
%        { output.state mid.sentence =
%            { bbl.number }
%            { bbl.number capitalize }
%          if$
%          number tie.or.space.connect
%          series empty$
%            { "there's a number but no series in " cite$ * warning$ }
%            { bbl.in space.word * series * }
%          if$
%        }
%      if$
%    }
%    { "" }
%  if$
%}

FUNCTION {is.num}
{ chr.to.int$
   duplicate$ "0" chr.to.int$ < not
   swap$ "9" chr.to.int$ > not and
}

FUNCTION {extract.num}
{ duplicate$ 't :=
   "" 's :=
   { t empty$ not }
   { t #1 #1 substring$
     t #2 global.max$ substring$ 't :=
     duplicate$ is.num
       { s swap$ * 's := }
       { pop$ "" 't := }
     if$
   }
   while$
   s empty$
     'skip$
     { pop$ s }
   if$
}

FUNCTION {convert.edition}
{ edition extract.num "l" change.case$ 's :=
   s "first" = s "1" = or
     { bbl.first 't := }
     { s "second" = s "2" = or
         { bbl.second 't := }
         { s "third" = s "3" = or
             { bbl.third 't := }
             { s "fourth" = s "4" = or
                 { bbl.fourth 't := }
                 { s "fifth" = s "5" = or
                     { bbl.fifth 't := }
                     { s #1 #1 substring$ is.num
                         { s eng.ord 't := }
                         { edition 't := }
                       if$
                     }
                   if$
                 }
               if$
             }
           if$
         }
       if$
     }
   if$
   t
}

FUNCTION {format.edition}
{ edition empty$
     { "" }
     { output.state mid.sentence =
         { convert.edition "l" change.case$ " " * bbl.edition * }
         { convert.edition "t" change.case$ " " * bbl.edition * }
       if$
     }
   if$
}

INTEGERS { multiresult }

FUNCTION {multi.page.check}
{ 't :=
   #0 'multiresult :=
     { multiresult not
       t empty$ not
       and
     }
     { t #1 #1 substring$
       duplicate$ "-" =
       swap$ duplicate$ "," =
       swap$ "+" =
       or or
         { #1 'multiresult := }
         { t #2 global.max$ substring$ 't := }
       if$
     }
   while$
   multiresult
}

FUNCTION {format.pages}
{ pages empty$
     { "" }
     { pages multi.page.check
         { bbl.pages pages n.dashify tie.or.space.connect }
         { bbl.page pages tie.or.space.connect }
       if$
       cmd@pages
     }
   if$
}

FUNCTION {format.journal.pages}
{
   pages empty$
     'skip$
     { duplicate$ empty$
         { pop$ format.pages }
         { ", " * pages n.dashify cmd@pages * }
       if$
     }
   if$
}

FUNCTION {format.vol.num.pages}
{ volume field.or.null
%   bolden 
   cmd@bvolume
   number empty$
     'skip$
     {
       "~(" number * ")" * *
       volume empty$
         { "there's a number but no volume in " cite$ * warning$ }
         'skip$
       if$
     }
   if$
   format.journal.pages
}

FUNCTION {format.chapter.pages}
{ chapter empty$
     'format.pages
     { type empty$
         { bbl.chapter }
         { type "l" change.case$ }
       if$
       chapter tie.or.space.connect
       pages empty$
         'skip$
         { ", " * format.pages * }
       if$
     }
   if$
}

FUNCTION {format.in.ed.booktitle}
% Changed to get edition after booktitle (SGLS)
% Notes swap$ fudge
{ booktitle empty$
     { "" }
     { word.in booktitle emphasize *
       edition empty$
    'skip$
         { swap$ format.edition output }
       if$
       editor empty$
         { "" * }
         {" (" * 
           editor num.names$ #1 >
             { bbl.editors }
             { bbl.editor }
           if$
           *
           " " *
           format.in.editors * 
           ")" *
         }
       if$
     }
   if$
}

FUNCTION {format.thesis.type}
{ type empty$
     'skip$
     { pop$
       type "t" change.case$
     }
   if$
}

FUNCTION {format.tr.number}
{ type empty$
     { bbl.techrep emphasize }
     'type
   if$
   number empty$
     { "t" change.case$ }
     { number tie.or.space.connect }
   if$
}

FUNCTION {format.article.crossref}
{
   word.in
   " \cite{" * crossref * "}" *
}

FUNCTION {format.book.crossref}
{ volume empty$
     { "empty volume in " cite$ * "'s crossref of " * crossref * warning$
       word.in
     }
     { bbl.volume capitalize
       volume tie.or.space.connect
       bbl.of space.word *
     }
   if$
   " \cite{" * crossref * "}" *
}

FUNCTION {format.incoll.inproc.crossref}
{
   word.in
   " \cite{" * crossref * "}" *
}

FUNCTION {format.publisher}
{ publisher empty$
     { "empty publisher in " cite$ * warning$ }
     'skip$
   if$
   ""
   address empty$ publisher empty$ and
     'skip$
     {
       address empty$
         'skip$
         { address * }
       if$
       publisher empty$
         'skip$
         { address empty$
             'skip$
             { ": " * }
           if$
           publisher *
         }
       if$
       cmd@publisher
     }
   if$
   output
}

FUNCTION {format.eprint}
{ eprint empty$
     { "" }
     { ", " * eprint cmd@arxiv * ""}
   if$
}
FUNCTION {format.doi}
{ "\href{https://doi.org/" doi * "}{https://doi.org/" * doi * "}" * output
  enclose.check
}

FUNCTION {article}
{ output.bibitem
   format.authors "author" output.check
   author format.key output
   format.date "year" output.check
   date.block
   format.title "title" output.check  cmd@atitle
   new.sentence
   crossref missing$
     { journal cmd@jtitle
%       emphasize
       "journal" output.check
       add.blank
       format.vol.num.pages output
     }
     { format.article.crossref output.nonnull
     }
   if$
   doi empty$
        'skip$
    { % Clear the stack
      duplicate$ empty$
        'skip$
        { output.new.block }
      if$
      format.doi
    }
   if$
   format.note output
   format.eprint output
   fin.entry
}

FUNCTION {default.type} { misc }

READ

FUNCTION {sortify}
{ purify$
   "l" change.case$
}

INTEGERS { len }

FUNCTION {chop.word}
{ 's :=
   'len :=
   s #1 len substring$ =
     { s len #1 + global.max$ substring$ }
     's
   if$
}

FUNCTION {format.lab.names}
{ 's :=
   s #1 "{vv~}{ll}" format.name$
   s num.names$ duplicate$
   #2 >
     { pop$ " " * "et~al." emphasize * }
     { #2 <
         'skip$
         { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
             { " " * "et~al." emphasize * }
             { " \& " * s #2 "{vv~}{ll}" format.name$ * }
           if$
         }
       if$
     }
   if$
}

FUNCTION {author.key.label}
{ author empty$
     { key empty$
         { cite$ #1 #3 substring$ }
         'key
       if$
     }
     { author format.lab.names }
   if$
}

FUNCTION {author.editor.key.label}
{ author empty$
     { editor empty$
         { key empty$
             { cite$ #1 #3 substring$ }
             'key
           if$
         }
         { editor format.lab.names }
       if$
     }
     { author format.lab.names }
   if$
}

FUNCTION {editor.key.label}
{ editor empty$
     { key empty$
         { cite$ #1 #3 substring$ }
         'key
       if$
     }
     { editor format.lab.names }
   if$
}

FUNCTION {calc.short.authors}
{ type$ "book" =
   type$ "inbook" =
   or
     'author.editor.key.label
     { type$ "proceedings" =
         'editor.key.label
         'author.key.label
       if$
     }
   if$
   'short.list :=
}

FUNCTION {calc.label}
{ calc.short.authors
   short.list
   "("
   *
   year duplicate$ empty$
      { pop$ "????" }
      'skip$
   if$
   *
   'label :=
}

FUNCTION {sort.format.names}
{ 's :=
   #1 'nameptr :=
   ""
   s num.names$ 'numnames :=
   numnames 'namesleft :=
     { namesleft #0 > }
     { s nameptr
       "{ll{ }}{  f{ }}{  jj{ }}"
       format.name$ 't :=
       nameptr #1 >
         {
           "   "  *
           namesleft #1 = t "others" = and
             { "zzzzz" * }
             { t sortify * }
           if$
         }
         { t sortify * }
       if$
       nameptr #1 + 'nameptr :=
       namesleft #1 - 'namesleft :=
     }
   while$
}

FUNCTION {sort.format.title}
{ 't :=
   "A " #2
     "An " #3
       "The " #4 t chop.word
     chop.word
   chop.word
   sortify
   #1 global.max$ substring$
}

FUNCTION {author.sort}
{ author empty$
     { key empty$
         { "to sort, need author or key in " cite$ * warning$
           ""
         }
         { key sortify }
       if$
     }
     { author sort.format.names }
   if$
}

FUNCTION {author.editor.sort}
{ author empty$
     { editor empty$
         { key empty$
             { "to sort, need author, editor, or key in " cite$ * warning$
               ""
             }
             { key sortify }
           if$
         }
         { editor sort.format.names }
       if$
     }
     { author sort.format.names }
   if$
}

FUNCTION {editor.sort}
{ editor empty$
     { key empty$
         { "to sort, need editor or key in " cite$ * warning$
           ""
         }
         { key sortify }
       if$
     }
     { editor sort.format.names }
   if$
}

FUNCTION {presort}
{ calc.label
   label sortify
   "    "
   *
   type$ "book" =
   type$ "inbook" =
   or
     'author.editor.sort
     { type$ "proceedings" =
         'editor.sort
         'author.sort
       if$
     }
   if$
   #1 entry.max$ substring$
   'sort.label :=
   sort.label
   *
   "    "
   *
   title field.or.null
   sort.format.title
   *
   #1 entry.max$ substring$
   'sort.key$ :=
}

ITERATE {presort}

SORT

STRINGS { last.label next.extra }

INTEGERS { last.extra.num number.label }

FUNCTION {initialize.extra.label.stuff}
{ #0 int.to.chr$ 'last.label :=
   "" 'next.extra :=
   #0 'last.extra.num :=
   #0 'number.label :=
}

FUNCTION {forward.pass}
{ last.label label =
     { last.extra.num #1 + 'last.extra.num :=
       last.extra.num int.to.chr$ 'extra.label :=
     }
     { "a" chr.to.int$ 'last.extra.num :=
       "" 'extra.label :=
       label 'last.label :=
     }
   if$
   number.label #1 + 'number.label :=
}

FUNCTION {reverse.pass}
{ next.extra "b" =
     { "a" 'extra.label := }
     'skip$
   if$
   extra.label 'next.extra :=
   extra.label
   emphasize
   duplicate$ empty$
     'skip$
     { "{\natexlab{" swap$ * "}}" * }
   if$
   'extra.label :=
   label extra.label * 'label :=
}

EXECUTE {initialize.extra.label.stuff}

ITERATE {forward.pass}

REVERSE {reverse.pass}

FUNCTION {bib.sort.order}
{ sort.label
   "    "
   *
   year field.or.null sortify
   *
   "    "
   *
   title field.or.null
   sort.format.title
   *
   #1 entry.max$ substring$
   'sort.key$ :=
}

ITERATE {bib.sort.order}

SORT

FUNCTION {begin.bib}
{ preamble$ empty$
     'skip$
     { preamble$ write$ newline$ }
   if$
   "\begin{thebibliography}{" number.label int.to.str$ * "}" *
   write$ newline$
"\expandafter\ifx\csname natexlab\endcsname\relax\def\natexlab#1{#1}\fi"
  write$ newline$
 "\def\au#1{#1} \def\ed#1{#1} \def\yr#1{#1}\def\at#1{#1}\def\jt#1{\textit{#1}} \def\bt#1{#1}\def\bvol#1{\textbf{#1}} \def\vol#1{#1} \def\pg#1{#1} \def\publ#1{#1}\def\arxiv#1{#1}\def\org#1{#1}\def\st#1{\textit{#1}}"
  write$ newline$
}

EXECUTE {begin.bib}

EXECUTE {init.state.consts}

ITERATE {call.type$}

FUNCTION {end.bib}
{ newline$
   "\end{thebibliography}" write$ newline$
}

EXECUTE {end.bib}
%% End of customized bst file
%%
%% End of file `jfmraw.bst'.

相关内容