elsarticle/elsarticle-num.bst
author Madarasi Peter
Wed, 30 Nov 2016 16:52:36 +0100
changeset 22 1a4874982d84
permissions -rw-r--r--
outline, fine tune
     1 %% 
     2 %% Copyright 2007, 2008, 2009 Elsevier Ltd
     3 %% 
     4 %% This file is part of the 'Elsarticle Bundle'.
     5 %% ---------------------------------------------
     6 %% 
     7 %% It may be distributed under the conditions of the LaTeX Project Public
     8 %% License, either version 1.2 of this license or (at your option) any
     9 %% later version.  The latest version of this license is in
    10 %%    http://www.latex-project.org/lppl.txt
    11 %% and version 1.2 or later is part of all distributions of LaTeX
    12 %% version 1999/12/01 or later.
    13 %% 
    14 %% The list of all files belonging to the 'Elsarticle Bundle' is
    15 %% given in the file `manifest.txt'.
    16 %% 
    17 %%% Modification of BibTeX style file elsarticle-num.bst
    18 %%% ... by urlbst, version 0.6 (marked with "% urlbst")
    19 %%% See <http://purl.org/nxg/dist/urlbst>
    20 %%% Added webpage entry type, and url and lastchecked fields.
    21 %%% Added eprint support.
    22 %%% Added DOI support.
    23 %%% Added hyperref support.
    24 %%% Original headers follow...
    25 
    26 %%
    27 %% This is file `elsarticle-num.bst',
    28 %% generated with the docstrip utility.
    29 %%
    30 %% The original source files were:
    31 %%
    32 %% merlin.mbs  (with options: `,seq-no,nm-init,ed-au,dt-end,yr-par,yrp-x,jttl-rm,thtit-a,vnum-sp,volp-blk,jdt-p,pp-last,jnm-x,btit-rm,bt-rm,pub-date,pub-xpar,pre-edn,url,url-nl,edpar,blk-com,in-col,pp,ed,abr,ednx,ord,jabr,and-xcom,xand,em-x,nfss')
    33 %% After docstrip generation some manual changes were made (SP)
    34 
    35 %% ----------------------------------------
    36 
    37 ENTRY
    38   { address
    39     author
    40     booktitle
    41     chapter
    42     edition
    43     editor
    44     howpublished
    45     institution
    46     journal
    47     key
    48     month
    49     note
    50     number
    51     organization
    52     pages
    53     publisher
    54     school
    55     series
    56     title
    57     type
    58     volume
    59     year
    60     eprint % urlbst
    61     doi % urlbst
    62     url % urlbst
    63     lastchecked % urlbst
    64   }
    65   {}
    66   { label }
    67 
    68 INTEGERS { output.state before.all mid.sentence after.sentence after.block }
    69 
    70 STRINGS { urlintro eprinturl eprintprefix doiprefix doiurl openinlinelink closeinlinelink } % urlbst...
    71 INTEGERS { hrefform inlinelinks makeinlinelink addeprints adddoiresolver }
    72 FUNCTION {init.urlbst.variables}
    73 {
    74   "Available from: " 'urlintro := % prefix before URL
    75   "http://arxiv.org/abs/" 'eprinturl := % prefix to make URL from eprint ref
    76   "arXiv:" 'eprintprefix := % text prefix printed before eprint ref
    77   "http://dx.doi.org/" 'doiurl := % prefix to make URL from DOI
    78   "doi:" 'doiprefix :=      % text prefix printed before DOI ref
    79   #1 'addeprints :=         % 0=no eprints; 1=include eprints
    80   #1 'adddoiresolver :=     % 0=no DOI resolver; 1=include it
    81   #2 'hrefform :=           % 0=no crossrefs; 1=hypertex xrefs; 2=hyperref refs
    82   #1 'inlinelinks :=        % 0=URLs explicit; 1=URLs attached to titles
    83   % the following are internal state variables, not config constants
    84   #0 'makeinlinelink :=     % state variable managed by setup.inlinelink
    85   "" 'openinlinelink :=     % ditto
    86   "" 'closeinlinelink :=    % ditto
    87 }
    88 INTEGERS {
    89   bracket.state
    90   outside.brackets
    91   open.brackets
    92   within.brackets
    93   close.brackets
    94 }
    95 FUNCTION {init.state.consts}
    96 { #0 'outside.brackets := % urlbst
    97   #1 'open.brackets :=
    98   #2 'within.brackets :=
    99   #3 'close.brackets :=
   100 
   101   #0 'before.all :=
   102   #1 'mid.sentence :=
   103   #2 'after.sentence :=
   104   #3 'after.block :=
   105 }
   106 
   107 STRINGS { s t }
   108 
   109 FUNCTION {output.nonnull.original}
   110 { 's :=
   111   output.state mid.sentence =
   112     { ", " * write$ }
   113     { output.state after.block =
   114         { add.period$ write$
   115           newline$
   116           "\newblock " write$
   117         }
   118         { output.state before.all =
   119             'write$
   120             { add.period$ " " * write$ }
   121           if$
   122         }
   123       if$
   124       mid.sentence 'output.state :=
   125     }
   126   if$
   127   s
   128 }
   129 
   130 FUNCTION {setup.inlinelink}
   131 { makeinlinelink
   132     { hrefform #1 = % hypertex
   133         { "\special {html:<a href=" quote$ * url * quote$ * "> }{" * 'openinlinelink :=
   134           "\special {html:</a>}" 'closeinlinelink :=
   135           }
   136         { hrefform #2 = % hyperref
   137             { "\href{" url * "}{" * 'openinlinelink :=
   138               "}" 'closeinlinelink :=
   139               }
   140             'skip$
   141           if$ % hrefform #2 =
   142         }
   143       if$ % hrefform #1 =
   144       #0 'makeinlinelink :=
   145     }
   146     'skip$
   147  if$ % makeinlinelink
   148 }
   149 FUNCTION {add.inlinelink}
   150 { openinlinelink empty$
   151     'skip$
   152     { openinlinelink swap$ * closeinlinelink *
   153       "" 'openinlinelink :=
   154       }
   155   if$
   156 }
   157 FUNCTION {output.nonnull}
   158 { % Save the thing we've been asked to output
   159   's :=
   160   % If the bracket-state is close.brackets, then add a close-bracket to
   161   % what is currently at the top of the stack, and set bracket.state
   162   % to outside.brackets
   163   bracket.state close.brackets =
   164     { "]" *
   165       outside.brackets 'bracket.state :=
   166     }
   167     'skip$
   168   if$
   169   bracket.state outside.brackets =
   170     { % We're outside all brackets -- this is the normal situation.
   171       % Write out what's currently at the top of the stack, using the
   172       % original output.nonnull function.
   173       s
   174       add.inlinelink
   175       output.nonnull.original % invoke the original output.nonnull
   176     }
   177     { % Still in brackets.  Add open-bracket or (continuation) comma, add the
   178       % new text (in s) to the top of the stack, and move to the close-brackets
   179       % state, ready for next time (unless inbrackets resets it).  If we come
   180       % into this branch, then output.state is carefully undisturbed.
   181       bracket.state open.brackets =
   182         { " [" * }
   183         { ", " * } % bracket.state will be within.brackets
   184       if$
   185       s *
   186       close.brackets 'bracket.state :=
   187     }
   188   if$
   189 }
   190 
   191 FUNCTION {inbrackets}
   192 { bracket.state close.brackets =
   193     { within.brackets 'bracket.state := } % reset the state: not open nor closed
   194     { open.brackets 'bracket.state := }
   195   if$
   196 }
   197 
   198 FUNCTION {format.lastchecked}
   199 { lastchecked empty$
   200     { "" }
   201     { inbrackets "cited " lastchecked * }
   202   if$
   203 }
   204 
   205 FUNCTION {output}
   206 { duplicate$ empty$
   207     'pop$
   208     'output.nonnull
   209   if$
   210 }
   211 
   212 FUNCTION {output.check}
   213 { 't :=
   214   duplicate$ empty$
   215     { pop$ "empty " t * " in " * cite$ * warning$ }
   216     'output.nonnull
   217   if$
   218 }
   219 
   220 FUNCTION {fin.entry.original}
   221 { add.period$
   222   write$
   223   newline$
   224 }
   225 
   226 FUNCTION {new.block}
   227 { output.state before.all =
   228     'skip$
   229     { after.block 'output.state := }
   230   if$
   231 }
   232 
   233 FUNCTION {new.sentence}
   234 { output.state after.block =
   235     'skip$
   236     { output.state before.all =
   237         'skip$
   238         { after.sentence 'output.state := }
   239       if$
   240     }
   241   if$
   242 }
   243 
   244 FUNCTION {add.blank}
   245 {  " " * before.all 'output.state :=
   246 }
   247 
   248 FUNCTION {date.block}
   249 {
   250   add.blank
   251 }
   252 
   253 FUNCTION {not}
   254 {   { #0 }
   255     { #1 }
   256   if$
   257 }
   258 
   259 FUNCTION {and}
   260 {   'skip$
   261     { pop$ #0 }
   262   if$
   263 }
   264 
   265 FUNCTION {or}
   266 {   { pop$ #1 }
   267     'skip$
   268   if$
   269 }
   270 
   271 FUNCTION {new.block.checka}
   272 { empty$
   273     'skip$
   274     'new.block
   275   if$
   276 }
   277 
   278 FUNCTION {new.block.checkb}
   279 { empty$
   280   swap$ empty$
   281   and
   282     'skip$
   283     'new.block
   284   if$
   285 }
   286 
   287 FUNCTION {new.sentence.checka}
   288 { empty$
   289     'skip$
   290     'new.sentence
   291   if$
   292 }
   293 
   294 FUNCTION {new.sentence.checkb}
   295 { empty$
   296   swap$ empty$
   297   and
   298     'skip$
   299     'new.sentence
   300   if$
   301 }
   302 
   303 FUNCTION {field.or.null}
   304 { duplicate$ empty$
   305     { pop$ "" }
   306     'skip$
   307   if$
   308 }
   309 
   310 FUNCTION {emphasize}
   311 { skip$ }
   312 
   313 FUNCTION {capitalize}
   314 { "u" change.case$ "t" change.case$ }
   315 
   316 FUNCTION {space.word}
   317 { " " swap$ * " " * }
   318 
   319  % Here are the language-specific definitions for explicit words.
   320  % Each function has a name bbl.xxx where xxx is the English word.
   321  % The language selected here is ENGLISH
   322 FUNCTION {bbl.and}
   323 { "and"}
   324 
   325 FUNCTION {bbl.etal}
   326 { "et~al." }
   327 
   328 FUNCTION {bbl.editors}
   329 { "Eds." }
   330 
   331 FUNCTION {bbl.editor}
   332 { "Ed." }
   333 
   334 FUNCTION {bbl.edby}
   335 { "edited by" }
   336 
   337 FUNCTION {bbl.edition}
   338 { "Edition" }
   339 
   340 FUNCTION {bbl.volume}
   341 { "Vol." }
   342 
   343 FUNCTION {bbl.of}
   344 { "of" }
   345 
   346 FUNCTION {bbl.number}
   347 { "no." }
   348 
   349 FUNCTION {bbl.nr}
   350 { "no." }
   351 
   352 FUNCTION {bbl.in}
   353 { "in" }
   354 
   355 FUNCTION {bbl.pages}
   356 { "pp." }
   357 
   358 FUNCTION {bbl.page}
   359 { "p." }
   360 
   361 FUNCTION {bbl.chapter}
   362 { "Ch." }
   363 
   364 FUNCTION {bbl.techrep}
   365 { "Tech. Rep." }
   366 
   367 FUNCTION {bbl.mthesis}
   368 { "Master's thesis" }
   369 
   370 FUNCTION {bbl.phdthesis}
   371 { "Ph.D. thesis" }
   372 
   373 FUNCTION {bbl.first}
   374 { "1st" }
   375 
   376 FUNCTION {bbl.second}
   377 { "2nd" }
   378 
   379 FUNCTION {bbl.third}
   380 { "3rd" }
   381 
   382 FUNCTION {bbl.fourth}
   383 { "4th" }
   384 
   385 FUNCTION {bbl.fifth}
   386 { "5th" }
   387 
   388 FUNCTION {bbl.st}
   389 { "st" }
   390 
   391 FUNCTION {bbl.nd}
   392 { "nd" }
   393 
   394 FUNCTION {bbl.rd}
   395 { "rd" }
   396 
   397 FUNCTION {bbl.th}
   398 { "th" }
   399 
   400 MACRO {jan} {"Jan."}
   401 
   402 MACRO {feb} {"Feb."}
   403 
   404 MACRO {mar} {"Mar."}
   405 
   406 MACRO {apr} {"Apr."}
   407 
   408 MACRO {may} {"May"}
   409 
   410 MACRO {jun} {"Jun."}
   411 
   412 MACRO {jul} {"Jul."}
   413 
   414 MACRO {aug} {"Aug."}
   415 
   416 MACRO {sep} {"Sep."}
   417 
   418 MACRO {oct} {"Oct."}
   419 
   420 MACRO {nov} {"Nov."}
   421 
   422 MACRO {dec} {"Dec."}
   423 
   424 FUNCTION {eng.ord}
   425 { duplicate$ "1" swap$ *
   426   #-2 #1 substring$ "1" =
   427      { bbl.th * }
   428      { duplicate$ #-1 #1 substring$
   429        duplicate$ "1" =
   430          { pop$ bbl.st * }
   431          { duplicate$ "2" =
   432              { pop$ bbl.nd * }
   433              { "3" =
   434                  { bbl.rd * }
   435                  { bbl.th * }
   436                if$
   437              }
   438            if$
   439           }
   440        if$
   441      }
   442    if$
   443 }
   444 
   445 MACRO {acmcs} {"ACM Comput. Surv."}
   446 
   447 MACRO {acta} {"Acta Inf."}
   448 
   449 MACRO {cacm} {"Commun. ACM"}
   450 
   451 MACRO {ibmjrd} {"IBM J. Res. Dev."}
   452 
   453 MACRO {ibmsj} {"IBM Syst.~J."}
   454 
   455 MACRO {ieeese} {"IEEE Trans. Softw. Eng."}
   456 
   457 MACRO {ieeetc} {"IEEE Trans. Comput."}
   458 
   459 MACRO {ieeetcad}
   460  {"IEEE Trans. Comput.-Aided Design Integrated Circuits"}
   461 
   462 MACRO {ipl} {"Inf. Process. Lett."}
   463 
   464 MACRO {jacm} {"J.~ACM"}
   465 
   466 MACRO {jcss} {"J.~Comput. Syst. Sci."}
   467 
   468 MACRO {scp} {"Sci. Comput. Programming"}
   469 
   470 MACRO {sicomp} {"SIAM J. Comput."}
   471 
   472 MACRO {tocs} {"ACM Trans. Comput. Syst."}
   473 
   474 MACRO {tods} {"ACM Trans. Database Syst."}
   475 
   476 MACRO {tog} {"ACM Trans. Gr."}
   477 
   478 MACRO {toms} {"ACM Trans. Math. Softw."}
   479 
   480 MACRO {toois} {"ACM Trans. Office Inf. Syst."}
   481 
   482 MACRO {toplas} {"ACM Trans. Prog. Lang. Syst."}
   483 
   484 MACRO {tcs} {"Theoretical Comput. Sci."}
   485 
   486 FUNCTION {write.url}
   487 { url empty$
   488     { skip$ }
   489     { "\newline\urlprefix\url{" url * "}" * write$ newline$ }
   490   if$
   491 }
   492 
   493 INTEGERS { nameptr namesleft numnames }
   494 
   495 FUNCTION {format.names}
   496 { 's :=
   497   #1 'nameptr :=
   498   s num.names$ 'numnames :=
   499   numnames 'namesleft :=
   500     { namesleft #0 > }
   501     { s nameptr
   502       "{f.~}{vv~}{ll}{, jj}" format.name$
   503     't :=
   504       nameptr #1 >
   505         {
   506           namesleft #1 >
   507             { ", " * t * }
   508             {
   509               "," *
   510               s nameptr "{ll}" format.name$ duplicate$ "others" =
   511                 { 't := }
   512                 { pop$ }
   513               if$
   514               t "others" =
   515                 {
   516                   " " * bbl.etal *
   517                 }
   518                 { " " * t * }
   519               if$
   520             }
   521           if$
   522         }
   523         't
   524       if$
   525       nameptr #1 + 'nameptr :=
   526       namesleft #1 - 'namesleft :=
   527     }
   528   while$
   529 }
   530 FUNCTION {format.names.ed}
   531 { format.names }
   532 FUNCTION {format.authors}
   533 { author empty$
   534     { "" }
   535     { author format.names }
   536   if$
   537 }
   538 
   539 FUNCTION {format.editors}
   540 { editor empty$
   541     { "" }
   542     { editor format.names
   543       editor num.names$ #1 >
   544         { " (" * bbl.editors * ")" * }
   545         { " (" * bbl.editor * ")" * }
   546       if$
   547     }
   548   if$
   549 }
   550 
   551 FUNCTION {format.in.editors}
   552 { editor empty$
   553     { "" }
   554     { editor format.names.ed
   555       editor num.names$ #1 >
   556         { " (" * bbl.editors * ")" * }
   557         { " (" * bbl.editor * ")" * }
   558       if$
   559     }
   560   if$
   561 }
   562 
   563 FUNCTION {format.note}
   564 {
   565  note empty$
   566     { "" }
   567     { note #1 #1 substring$
   568       duplicate$ "{" =
   569         'skip$
   570         { output.state mid.sentence =
   571           { "l" }
   572           { "u" }
   573         if$
   574         change.case$
   575         }
   576       if$
   577       note #2 global.max$ substring$ *
   578     }
   579   if$
   580 }
   581 
   582 FUNCTION {format.title}
   583 { title empty$
   584     { "" }
   585     { title "t" change.case$
   586     }
   587   if$
   588 }
   589 
   590 FUNCTION {output.bibitem.original}
   591 { newline$
   592   "\bibitem{" write$
   593   cite$ write$
   594   "}" write$
   595   newline$
   596   ""
   597   before.all 'output.state :=
   598 }
   599 
   600 FUNCTION {n.dashify}
   601 {
   602   't :=
   603   ""
   604     { t empty$ not }
   605     { t #1 #1 substring$ "-" =
   606         { t #1 #2 substring$ "--" = not
   607             { "--" *
   608               t #2 global.max$ substring$ 't :=
   609             }
   610             {   { t #1 #1 substring$ "-" = }
   611                 { "-" *
   612                   t #2 global.max$ substring$ 't :=
   613                 }
   614               while$
   615             }
   616           if$
   617         }
   618         { t #1 #1 substring$ *
   619           t #2 global.max$ substring$ 't :=
   620         }
   621       if$
   622     }
   623   while$
   624 }
   625 
   626 FUNCTION {word.in}
   627 { bbl.in
   628   ":" *
   629   " " * }
   630 
   631 FUNCTION {format.date}
   632 { year empty$
   633     { month empty$
   634         { "" }
   635         { "there's a month but no year in " cite$ * warning$
   636           month
   637         }
   638       if$
   639     }
   640     { month empty$
   641         'year
   642         { month " " * year * }
   643       if$
   644     }
   645   if$
   646   duplicate$ empty$
   647     'skip$
   648     {
   649       before.all 'output.state :=
   650     " (" swap$ * ")" *
   651     }
   652   if$
   653 }
   654 
   655 FUNCTION{format.year}
   656 { year duplicate$ empty$
   657     { "empty year in " cite$ * warning$ pop$ "" }
   658     { "(" swap$ * ")" * }
   659   if$
   660 }
   661 
   662 FUNCTION {format.btitle}
   663 { title
   664 }
   665 
   666 FUNCTION {tie.or.space.connect}
   667 { duplicate$ text.length$ #3 <
   668     { "~" }
   669     { " " }
   670   if$
   671   swap$ * *
   672 }
   673 
   674 FUNCTION {either.or.check}
   675 { empty$
   676     'pop$
   677     { "can't use both " swap$ * " fields in " * cite$ * warning$ }
   678   if$
   679 }
   680 
   681 FUNCTION {format.bvolume}
   682 { volume empty$
   683     { "" }
   684     { bbl.volume volume tie.or.space.connect
   685       series empty$
   686         'skip$
   687         { bbl.of space.word * series emphasize * }
   688       if$
   689       "volume and number" number either.or.check
   690     }
   691   if$
   692 }
   693 
   694 FUNCTION {format.number.series}
   695 { volume empty$
   696     { number empty$
   697         { series field.or.null }
   698         { output.state mid.sentence =
   699             { bbl.number }
   700             { bbl.number capitalize }
   701           if$
   702           number tie.or.space.connect
   703           series empty$
   704             { "there's a number but no series in " cite$ * warning$ }
   705             { bbl.in space.word * series * }
   706           if$
   707         }
   708       if$
   709     }
   710     { "" }
   711   if$
   712 }
   713 
   714 FUNCTION {is.num}
   715 { chr.to.int$
   716   duplicate$ "0" chr.to.int$ < not
   717   swap$ "9" chr.to.int$ > not and
   718 }
   719 
   720 FUNCTION {extract.num}
   721 { duplicate$ 't :=
   722   "" 's :=
   723   { t empty$ not }
   724   { t #1 #1 substring$
   725     t #2 global.max$ substring$ 't :=
   726     duplicate$ is.num
   727       { s swap$ * 's := }
   728       { pop$ "" 't := }
   729     if$
   730   }
   731   while$
   732   s empty$
   733     'skip$
   734     { pop$ s }
   735   if$
   736 }
   737 
   738 FUNCTION {convert.edition}
   739 { edition extract.num "l" change.case$ 's :=
   740   s "first" = s "1" = or
   741     { bbl.first 't := }
   742     { s "second" = s "2" = or
   743         { bbl.second 't := }
   744         { s "third" = s "3" = or
   745             { bbl.third 't := }
   746             { s "fourth" = s "4" = or
   747                 { bbl.fourth 't := }
   748                 { s "fifth" = s "5" = or
   749                     { bbl.fifth 't := }
   750                     { s #1 #1 substring$ is.num
   751                         { s eng.ord 't := }
   752                         { edition 't := }
   753                       if$
   754                     }
   755                   if$
   756                 }
   757               if$
   758             }
   759           if$
   760         }
   761       if$
   762     }
   763   if$
   764   t
   765 }
   766 
   767 FUNCTION {format.edition}
   768 { edition empty$
   769     { "" }
   770     { output.state mid.sentence =
   771         { convert.edition "l" change.case$ " " * bbl.edition * }
   772         { convert.edition "t" change.case$ " " * bbl.edition * }
   773       if$
   774     }
   775   if$
   776 }
   777 
   778 INTEGERS { multiresult }
   779 
   780 FUNCTION {multi.page.check}
   781 { 't :=
   782   #0 'multiresult :=
   783     { multiresult not
   784       t empty$ not
   785       and
   786     }
   787     { t #1 #1 substring$
   788       duplicate$ "-" =
   789       swap$ duplicate$ "," =
   790       swap$ "+" =
   791       or or
   792         { #1 'multiresult := }
   793         { t #2 global.max$ substring$ 't := }
   794       if$
   795     }
   796   while$
   797   multiresult
   798 }
   799 
   800 FUNCTION {format.pages}
   801 { pages empty$
   802     { "" }
   803     { pages multi.page.check
   804         { bbl.pages pages n.dashify tie.or.space.connect }
   805         { bbl.page pages tie.or.space.connect }
   806       if$
   807     }
   808   if$
   809 }
   810 
   811 FUNCTION {format.journal.pages}
   812 { pages empty$
   813     'skip$
   814     { duplicate$ empty$
   815         { pop$ format.pages }
   816         {
   817           " " *
   818           format.year * " " *
   819           pages n.dashify *
   820         }
   821       if$
   822     }
   823   if$
   824 }
   825 
   826 FUNCTION {format.vol.num.pages}
   827 {
   828   % volume field.or.null
   829   " "
   830   volume empty$
   831     { pop$ "" }
   832     { volume * }
   833   if$
   834   number empty$
   835     'skip$
   836     {
   837       "~(" number * ")" * *
   838       volume empty$
   839         { "there's a number but no volume in " cite$ * warning$ }
   840         'skip$
   841       if$
   842     }
   843   if$
   844 }
   845 
   846 FUNCTION {format.chapter.pages}
   847 { chapter empty$
   848     { "" }
   849     { type empty$
   850         { bbl.chapter }
   851         { type "l" change.case$ }
   852       if$
   853       chapter tie.or.space.connect
   854     }
   855   if$
   856 }
   857 
   858 FUNCTION {format.in.ed.booktitle}
   859 { booktitle empty$
   860     { "" }
   861     { editor empty$
   862         { word.in booktitle * }
   863         { word.in format.in.editors * ", " *
   864           booktitle * }
   865       if$
   866     }
   867   if$
   868 }
   869 
   870 FUNCTION {empty.misc.check}
   871 { author empty$ title empty$ howpublished empty$
   872   month empty$ year empty$ note empty$
   873   and and and and and
   874     { "all relevant fields are empty in " cite$ * warning$ }
   875     'skip$
   876   if$
   877 }
   878 
   879 FUNCTION {format.thesis.type}
   880 { type empty$
   881     'skip$
   882     { pop$
   883       type "t" change.case$
   884     }
   885   if$
   886 }
   887 
   888 FUNCTION {format.tr.number}
   889 { type empty$
   890     { bbl.techrep }
   891     'type
   892   if$
   893   number empty$
   894     { "t" change.case$ }
   895     { number tie.or.space.connect }
   896   if$
   897 }
   898 
   899 FUNCTION {format.article.crossref}
   900 {
   901   key empty$
   902     { journal empty$
   903         { "need key or journal for " cite$ * " to crossref " * crossref *
   904           warning$
   905           ""
   906         }
   907         { word.in journal emphasize * }
   908       if$
   909     }
   910     { word.in key * " " *}
   911   if$
   912   " \cite{" * crossref * "}" *
   913 }
   914 
   915 FUNCTION {format.crossref.editor}
   916 { editor #1 "{vv~}{ll}" format.name$
   917   editor num.names$ duplicate$
   918   #2 >
   919     { pop$
   920       " " * bbl.etal *
   921     }
   922     { #2 <
   923         'skip$
   924         { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
   925             {
   926               " " * bbl.etal *
   927             }
   928             { bbl.and space.word * editor #2 "{vv~}{ll}" format.name$
   929               * }
   930           if$
   931         }
   932       if$
   933     }
   934   if$
   935 }
   936 
   937 FUNCTION {format.book.crossref}
   938 { volume empty$
   939     { "empty volume in " cite$ * "'s crossref of " * crossref * warning$
   940       word.in
   941     }
   942     { bbl.volume volume tie.or.space.connect
   943       bbl.of space.word *
   944     }
   945   if$
   946   editor empty$
   947   editor field.or.null author field.or.null =
   948   or
   949     { key empty$
   950         { series empty$
   951             { "need editor, key, or series for " cite$ * " to crossref " *
   952               crossref * warning$
   953               "" *
   954             }
   955             { series emphasize * }
   956           if$
   957         }
   958         { key * }
   959       if$
   960     }
   961     { format.crossref.editor * }
   962   if$
   963   " \cite{" * crossref * "}" *
   964 }
   965 
   966 FUNCTION {format.incoll.inproc.crossref}
   967 {
   968   editor empty$
   969   editor field.or.null author field.or.null =
   970   or
   971     { key empty$
   972         { booktitle empty$
   973             { "need editor, key, or booktitle for " cite$ * " to crossref " *
   974               crossref * warning$
   975               ""
   976             }
   977             { word.in booktitle * }
   978           if$
   979         }
   980         { word.in key * " " *}
   981       if$
   982     }
   983     { word.in format.crossref.editor * " " *}
   984   if$
   985   " \cite{" * crossref * "}" *
   986 }
   987 
   988 FUNCTION {format.org.or.pub}
   989 { 't :=
   990   ""
   991   year empty$
   992     { "empty year in " cite$ * warning$ }
   993     'skip$
   994   if$
   995   address empty$ t empty$ and
   996   year empty$ and
   997     'skip$
   998     {
   999       t empty$
  1000         { address empty$
  1001           'skip$
  1002           { address * }
  1003           if$
  1004         }
  1005         { t *
  1006           address empty$
  1007             'skip$
  1008             { ", " * address * }
  1009           if$
  1010         }
  1011       if$
  1012       year empty$
  1013         'skip$
  1014         { t empty$ address empty$ and
  1015             'skip$
  1016             { ", " * }
  1017           if$
  1018           year *
  1019         }
  1020       if$
  1021     }
  1022   if$
  1023 }
  1024 
  1025 FUNCTION {format.publisher.address}
  1026 { publisher empty$
  1027     { "empty publisher in " cite$ * warning$
  1028       ""
  1029     }
  1030     { publisher }
  1031   if$
  1032   format.org.or.pub
  1033 }
  1034 
  1035 FUNCTION {format.organization.address}
  1036 { organization empty$
  1037     { "" }
  1038     { organization }
  1039   if$
  1040   format.org.or.pub
  1041 }
  1042 
  1043 FUNCTION {make.href.null}
  1044 {
  1045   pop$
  1046 }
  1047 FUNCTION {make.href.hypertex}
  1048 {
  1049   "\special {html:<a href=" quote$ *
  1050   swap$ * quote$ * "> }" * swap$ *
  1051   "\special {html:</a>}" *
  1052 }
  1053 FUNCTION {make.href.hyperref}
  1054 {
  1055   "\href {" swap$ * "} {\path{" * swap$ * "}}" *
  1056 }
  1057 FUNCTION {make.href}
  1058 { hrefform #2 =
  1059     'make.href.hyperref      % hrefform = 2
  1060     { hrefform #1 =
  1061         'make.href.hypertex  % hrefform = 1
  1062         'make.href.null      % hrefform = 0 (or anything else)
  1063       if$
  1064     }
  1065   if$
  1066 }
  1067 
  1068 FUNCTION {format.url}
  1069 { inlinelinks #1 = url empty$ or
  1070    { "" }
  1071    { hrefform #1 =
  1072        { % special case -- add HyperTeX specials
  1073          urlintro "\url{" url * "}" * url make.href.hypertex * }
  1074        { urlintro "\url{" * url * "}" * }
  1075      if$
  1076    }
  1077   if$
  1078 }
  1079 
  1080 FUNCTION {format.eprint}
  1081 { eprint empty$
  1082     { "" }
  1083     { eprintprefix eprint * eprinturl eprint * make.href }
  1084   if$
  1085 }
  1086 
  1087 FUNCTION {format.doi}
  1088 { doi empty$
  1089     { "" }
  1090     { doiprefix doi * doiurl doi * make.href }
  1091   if$
  1092 }
  1093 
  1094 FUNCTION {output.url}
  1095 { url empty$
  1096     'skip$
  1097     { new.block
  1098       format.url output
  1099       format.lastchecked output
  1100     }
  1101   if$
  1102 }
  1103 
  1104 FUNCTION {output.web.refs}
  1105 {
  1106   new.block
  1107   output.url
  1108   addeprints eprint empty$ not and
  1109     { format.eprint output.nonnull }
  1110     'skip$
  1111   if$
  1112   adddoiresolver doi empty$ not and
  1113     { format.doi output.nonnull }
  1114     'skip$
  1115   if$
  1116 }
  1117 
  1118 FUNCTION {output.bibitem}
  1119 { outside.brackets 'bracket.state :=
  1120   output.bibitem.original
  1121   inlinelinks url empty$ not and
  1122     { #1 'makeinlinelink := }
  1123     { #0 'makeinlinelink := }
  1124   if$
  1125 }
  1126 
  1127 FUNCTION {fin.entry}
  1128 { output.web.refs  % urlbst
  1129   makeinlinelink       % ooops, it appears we didn't have a title for inlinelink
  1130     { setup.inlinelink % add some artificial link text here, as a fallback
  1131       "[link]" output.nonnull }
  1132     'skip$
  1133   if$
  1134   bracket.state close.brackets = % urlbst
  1135     { "]" * }
  1136     'skip$
  1137   if$
  1138   fin.entry.original
  1139 }
  1140 
  1141 FUNCTION {webpage}
  1142 { output.bibitem
  1143   author empty$
  1144     { editor empty$
  1145         'skip$  % author and editor both optional
  1146         { format.editors output.nonnull }
  1147       if$
  1148     }
  1149     { editor empty$
  1150         { format.authors output.nonnull }
  1151         { "can't use both author and editor fields in " cite$ * warning$ }
  1152       if$
  1153     }
  1154   if$
  1155   new.block
  1156   title empty$ 'skip$ 'setup.inlinelink if$
  1157   format.title "title" output.check
  1158   inbrackets "online" output
  1159   new.block
  1160   year empty$
  1161     'skip$
  1162     { format.date "year" output.check }
  1163   if$
  1164   % We don't need to output the URL details ('lastchecked' and 'url'),
  1165   % because fin.entry does that for us, using output.web.refs.  The only
  1166   % reason we would want to put them here is if we were to decide that
  1167   % they should go in front of the rather miscellaneous information in 'note'.
  1168   new.block
  1169   note output
  1170   fin.entry
  1171 }
  1172 
  1173 FUNCTION {article}
  1174 { output.bibitem
  1175   format.authors "author" output.check
  1176   title empty$ 'skip$ 'setup.inlinelink if$ % urlbst
  1177   format.title "title" output.check
  1178   crossref missing$
  1179     { journal
  1180       "journal" output.check
  1181       % add.blank
  1182   before.all 'output.state :=
  1183       format.vol.num.pages output
  1184     }
  1185     { format.article.crossref output.nonnull
  1186       format.pages output
  1187     }
  1188   if$
  1189   format.journal.pages
  1190   format.note output
  1191   fin.entry
  1192   write.url
  1193 }
  1194 
  1195 FUNCTION {book}
  1196 { output.bibitem
  1197   author empty$
  1198     { format.editors "author and editor" output.check
  1199     }
  1200     { format.authors output.nonnull
  1201       crossref missing$
  1202         { "author and editor" editor either.or.check }
  1203         'skip$
  1204       if$
  1205     }
  1206   if$
  1207   title empty$ 'skip$ 'setup.inlinelink if$ % urlbst
  1208   format.btitle "title" output.check
  1209   crossref missing$
  1210     { format.edition output
  1211       format.bvolume output
  1212       format.number.series output
  1213       format.publisher.address output
  1214     }
  1215     {
  1216       format.book.crossref output.nonnull
  1217     }
  1218   if$
  1219   format.note output
  1220   fin.entry
  1221   write.url
  1222 }
  1223 
  1224 FUNCTION {booklet}
  1225 { output.bibitem
  1226   format.authors output
  1227   title empty$ 'skip$ 'setup.inlinelink if$ % urlbst
  1228   format.title "title" output.check
  1229   howpublished output
  1230   address output
  1231   format.note output
  1232   format.date output
  1233   fin.entry
  1234   write.url
  1235 }
  1236 
  1237 FUNCTION {inbook}
  1238 { output.bibitem
  1239   author empty$
  1240     { format.editors "author and editor" output.check
  1241     }
  1242     { format.authors output.nonnull
  1243       crossref missing$
  1244         { "author and editor" editor either.or.check }
  1245         'skip$
  1246       if$
  1247     }
  1248   if$
  1249   title empty$ 'skip$ 'setup.inlinelink if$ % urlbst
  1250   format.btitle "title" output.check
  1251   crossref missing$
  1252     {
  1253       format.edition output
  1254       format.bvolume output
  1255       format.number.series output
  1256       format.publisher.address output
  1257       format.chapter.pages "chapter and pages" output.check
  1258     }
  1259     {
  1260       format.chapter.pages "chapter and pages" output.check
  1261       format.book.crossref output.nonnull
  1262     }
  1263   if$
  1264   format.pages "pages" output.check
  1265   format.note output
  1266   fin.entry
  1267   write.url
  1268 }
  1269 
  1270 FUNCTION {incollection}
  1271 { output.bibitem
  1272   format.authors "author" output.check
  1273   title empty$ 'skip$ 'setup.inlinelink if$ % urlbst
  1274   format.title "title" output.check
  1275   crossref missing$
  1276     { format.in.ed.booktitle "booktitle" output.check
  1277       format.edition output
  1278       format.bvolume output
  1279       format.number.series output
  1280       format.publisher.address output
  1281       format.chapter.pages output
  1282     }
  1283     { format.incoll.inproc.crossref output.nonnull
  1284       format.chapter.pages output
  1285     }
  1286   if$
  1287   format.pages "pages" output.check
  1288   format.note output
  1289   fin.entry
  1290   write.url
  1291 }
  1292 
  1293 FUNCTION {inproceedings}
  1294 { output.bibitem
  1295   format.authors "author" output.check
  1296   title empty$ 'skip$ 'setup.inlinelink if$ % urlbst
  1297   format.title "title" output.check
  1298   crossref missing$
  1299     { format.in.ed.booktitle "booktitle" output.check
  1300       format.edition output
  1301       format.bvolume output
  1302       format.number.series output
  1303       publisher empty$
  1304         { format.organization.address output }
  1305         { organization output
  1306           format.publisher.address output
  1307         }
  1308       if$
  1309     }
  1310     { format.incoll.inproc.crossref output.nonnull
  1311     }
  1312   if$
  1313   format.pages "pages" output.check
  1314   format.note output
  1315   fin.entry
  1316   write.url
  1317 }
  1318 
  1319 FUNCTION {conference} { inproceedings }
  1320 
  1321 FUNCTION {manual}
  1322 { output.bibitem
  1323   author empty$
  1324     { organization empty$
  1325         'skip$
  1326         { organization output.nonnull
  1327           address output
  1328         }
  1329       if$
  1330     }
  1331     { format.authors output.nonnull }
  1332   if$
  1333   title empty$ 'skip$ 'setup.inlinelink if$ % urlbst
  1334   format.btitle "title" output.check
  1335   author empty$
  1336     { organization empty$
  1337     {
  1338           address output
  1339         }
  1340         'skip$
  1341       if$
  1342     }
  1343     {
  1344       organization output
  1345       address output
  1346     }
  1347   if$
  1348   format.edition output
  1349   format.note output
  1350   format.date output
  1351   fin.entry
  1352   write.url
  1353 }
  1354 
  1355 FUNCTION {mastersthesis}
  1356 { output.bibitem
  1357   format.authors "author" output.check
  1358   title empty$ 'skip$ 'setup.inlinelink if$ % urlbst
  1359   format.title "title" output.check
  1360   bbl.mthesis format.thesis.type output.nonnull
  1361   school "school" output.check
  1362   address output
  1363   format.note output
  1364   format.date "year" output.check
  1365   fin.entry
  1366   write.url
  1367 }
  1368 
  1369 FUNCTION {misc}
  1370 { output.bibitem
  1371   format.authors output
  1372   title empty$ 'skip$ 'setup.inlinelink if$ % urlbst
  1373   format.title output
  1374   howpublished output
  1375   format.note output
  1376   format.date output
  1377   fin.entry
  1378   write.url
  1379   empty.misc.check
  1380 }
  1381 
  1382 FUNCTION {phdthesis}
  1383 { output.bibitem
  1384   format.authors "author" output.check
  1385   title empty$ 'skip$ 'setup.inlinelink if$ % urlbst
  1386   format.title "title" output.check
  1387   bbl.phdthesis format.thesis.type output.nonnull
  1388   school "school" output.check
  1389   address output
  1390   format.note output
  1391   format.date "year" output.check
  1392   fin.entry
  1393   write.url
  1394 }
  1395 
  1396 FUNCTION {proceedings}
  1397 { output.bibitem
  1398   editor empty$
  1399     { organization output }
  1400     { format.editors output.nonnull }
  1401   if$
  1402   title empty$ 'skip$ 'setup.inlinelink if$ % urlbst
  1403   format.btitle "title" output.check
  1404   format.bvolume output
  1405   format.number.series output
  1406   editor empty$
  1407     { publisher empty$
  1408         'skip$
  1409         {
  1410           format.publisher.address output
  1411         }
  1412       if$
  1413     }
  1414     { publisher empty$
  1415         {
  1416           format.organization.address output }
  1417         {
  1418           organization output
  1419           format.publisher.address output
  1420         }
  1421       if$
  1422      }
  1423   if$
  1424   format.note output
  1425   fin.entry
  1426   write.url
  1427 }
  1428 
  1429 FUNCTION {techreport}
  1430 { output.bibitem
  1431   format.authors "author" output.check
  1432   title empty$ 'skip$ 'setup.inlinelink if$ % urlbst
  1433   format.title "title" output.check
  1434   format.tr.number output.nonnull
  1435   institution "institution" output.check
  1436   address output
  1437   format.note output
  1438   format.date "year" output.check
  1439   fin.entry
  1440   write.url
  1441 }
  1442 
  1443 FUNCTION {unpublished}
  1444 { output.bibitem
  1445   format.authors "author" output.check
  1446   title empty$ 'skip$ 'setup.inlinelink if$ % urlbst
  1447   format.title "title" output.check
  1448   format.note "note" output.check
  1449   format.date output
  1450   fin.entry
  1451   write.url
  1452 }
  1453 
  1454 FUNCTION {default.type} { misc }
  1455 
  1456 READ
  1457 
  1458 STRINGS { longest.label }
  1459 
  1460 INTEGERS { number.label longest.label.width }
  1461 
  1462 FUNCTION {initialize.longest.label}
  1463 { "" 'longest.label :=
  1464   #1 'number.label :=
  1465   #0 'longest.label.width :=
  1466 }
  1467 
  1468 FUNCTION {longest.label.pass}
  1469 { number.label int.to.str$ 'label :=
  1470   number.label #1 + 'number.label :=
  1471   label width$ longest.label.width >
  1472     { label 'longest.label :=
  1473       label width$ 'longest.label.width :=
  1474     }
  1475     'skip$
  1476   if$
  1477 }
  1478 
  1479 EXECUTE {initialize.longest.label}
  1480 
  1481 ITERATE {longest.label.pass}
  1482 
  1483 FUNCTION {begin.bib}
  1484 { preamble$ empty$
  1485     'skip$
  1486     { preamble$ write$ newline$ }
  1487   if$
  1488   "\begin{thebibliography}{"  longest.label  * "}" *
  1489   write$ newline$
  1490   "\expandafter\ifx\csname url\endcsname\relax"
  1491   write$ newline$
  1492   "  \def\url#1{\texttt{#1}}\fi"
  1493   write$ newline$
  1494   "\expandafter\ifx\csname urlprefix\endcsname\relax\def\urlprefix{URL }\fi"
  1495   write$ newline$
  1496   "\expandafter\ifx\csname href\endcsname\relax"
  1497   write$ newline$
  1498   "  \def\href#1#2{#2} \def\path#1{#1}\fi"
  1499   write$ newline$
  1500 }
  1501 
  1502 EXECUTE {begin.bib}
  1503 
  1504 EXECUTE {init.urlbst.variables}
  1505 EXECUTE {init.state.consts}
  1506 
  1507 ITERATE {call.type$}
  1508 
  1509 FUNCTION {end.bib}
  1510 { newline$
  1511   "\end{thebibliography}" write$ newline$
  1512 }
  1513 
  1514 EXECUTE {end.bib}
  1515 %% End of customized bst file
  1516 %%
  1517 %% End of file `elsarticle-num.bst'.