├── .gitignore ├── Figures ├── Enhanced_sampling_sorting_revised.pdf ├── Enhanced_sampling_sorting_revised.svg ├── MetaD-Figure.png ├── MetaD-Figure │ ├── MetaD-Figure.py │ └── metad-bf4-s020_hills.data ├── TOC.jpeg ├── Venn_Diagram_Early_Attempt.jpeg ├── Venn_Diagram_Early_Attempt.png ├── abf_new.pdf ├── diagnostic_figures │ ├── goodmixing.png │ ├── goodmixing_exp.png │ ├── sepmixing.png │ ├── sepmixing_exp.png │ ├── slowmixing.png │ └── slowmixing_exp.png ├── emptywell.png ├── fullwell.png ├── halfwell.png ├── wl.png └── wwl.png ├── LICENSE ├── README.md ├── Revision ├── review.Diff-Resubmission-August19-2022.pdf └── review.Diff-Resubmission-August19-2022.tex ├── latexmkrc ├── livecoms.cls ├── refs.bib ├── releases ├── LiveCoMS_Article_v1.0.pdf └── header_v1.0.jpg ├── review.pdf ├── review.tex └── vancouver-livecoms.bst /.gitignore: -------------------------------------------------------------------------------- 1 | *.aux 2 | *.bbl 3 | *.bcf 4 | *.blg 5 | *.fdb_latexmk 6 | *.fls 7 | *.log 8 | *.run.xml 9 | *.synctex.gz 10 | *.xmpi 11 | *.bak 12 | *.snm 13 | *.swp 14 | *.out 15 | *.nav 16 | *.toc 17 | *.suppinfo 18 | *acs*.bib 19 | .DS_Store 20 | -------------------------------------------------------------------------------- /Figures/Enhanced_sampling_sorting_revised.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jhenin/Methods-for-enhanced-sampling-and-free-energy-calculations/8a61ca08b4a34455d6a89669feed5617afe28c5b/Figures/Enhanced_sampling_sorting_revised.pdf -------------------------------------------------------------------------------- /Figures/Enhanced_sampling_sorting_revised.svg: -------------------------------------------------------------------------------- 1 | 2 | 18 | 20 | 23 | 27 | 31 | 32 | 34 | 38 | 42 | 43 | 46 | 50 | 54 | 55 | 64 | 73 | 74 | 100 | 105 | 106 | 108 | 109 | 111 | image/svg+xml 112 | 114 | 115 | 116 | 117 | 118 | 123 | 131 | Is the original configurational distribution preserved? 157 | 163 | yes 174 | 182 | Does one use transitions to other ensembles? 208 | 214 | yes 225 | 232 | 240 | 246 | yes 257 | Are the systems simulated in parallel? 283 | Replica exchange 299 | 305 | no 316 | 323 | 330 | Expanded ensemble 346 | 352 | no 363 | 370 | Selective acceleration methods 391 | 397 | no 408 | 414 | 422 | Does the simulationconverge to an equilibrium ensemble? 453 | yes 464 | Out-of-equilibrium/Driven methods 490 | 496 | no 507 | 515 | 521 | yes 532 | Is sampling enhanced by specifying starting/ending coordinates? 564 | 570 | no 581 | 588 | 593 | 601 | 607 | yes 618 | Are thesimulationslocalized? 639 | Localization methods 655 | partitioning (non-overlapping) 666 | overlapping 677 | 683 | no 694 | 701 | 708 | Adaptive seeding 724 | Importance sampling 740 | 748 | 754 | yes 765 | Is the bias learned along the simulation? 786 | 792 | no 808 | 815 | Non-adaptivebiasing potentialmethods 836 | Biasedsimulations 852 | Generalizedensemble 868 | section 10 879 | section 8.2 890 | section 4 901 | section 9 912 | section 5 923 | section 7 934 | section 6 945 | section 8.1 956 | 963 | Adaptivebias simulationmethods 984 | 991 | 992 | 997 | 1002 | 1003 | -------------------------------------------------------------------------------- /Figures/MetaD-Figure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jhenin/Methods-for-enhanced-sampling-and-free-energy-calculations/8a61ca08b4a34455d6a89669feed5617afe28c5b/Figures/MetaD-Figure.png -------------------------------------------------------------------------------- /Figures/MetaD-Figure/MetaD-Figure.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python 2 | 3 | # Author: Omar Valsson 4 | # Script to generate Metadynamics figure (Figure 3 in version 1.0). 5 | # The figure is for a model potential given by 6 | # F(z)=a*x**4-4*a*x**2+b*x (see parameters below) 7 | # The hill file is taken from a metadynamics run on this 8 | # model system. 9 | 10 | import numpy as np 11 | import matplotlib.pyplot as plt 12 | from datetime import datetime 13 | 14 | 15 | gamma=4.0 16 | beta=0.5 17 | a=2.0 18 | b=0.1918 19 | FES_filename="FES.data" 20 | GridMin=-4.0 21 | GridMax=+4.0 22 | GridBins=4000 23 | HillsFile="metad-bf4-s020_hills.data" 24 | 25 | 26 | x = np.linspace(GridMin,GridMax,GridBins) 27 | 28 | FES=a*x**4-4*a*x**2+b*x 29 | FES=FES-FES.min() 30 | FES_gamma=FES/gamma 31 | FES_gamma=FES_gamma-FES_gamma.min() 32 | PDF=np.exp(-beta*FES) 33 | PDF=PDF/np.trapz(y=PDF,x=x) 34 | norm=np.trapz(y=PDF,x=x) 35 | PDF_gamma=np.exp(-beta*FES_gamma) 36 | PDF_gamma=PDF_gamma/np.trapz(y=PDF_gamma,x=x) 37 | norm_gamma=np.trapz(y=PDF_gamma,x=x) 38 | 39 | DataOut = [x, FES, PDF, FES_gamma, PDF_gamma] 40 | Header="! FIELDS x FES PDF FES_gamma PDF_gamma\n" 41 | Header+="! SET FES(x)=a*x^4-4*a*x^2+b*x\n".format(gamma) 42 | Header+="! SET a={}\n".format(a) 43 | Header+="! SET b={}\n".format(b) 44 | Header+="! SET beta={}\n".format(beta) 45 | Header+="! SET gamma={}".format(gamma) 46 | np.savetxt(FES_filename, np.column_stack(DataOut), header=Header) 47 | 48 | 49 | Offset=+12.0 50 | xlimits = [-2.5,+2.5] 51 | FES_gamma_offset=FES_gamma+Offset 52 | lw=2 53 | alpha=0.6 54 | fontsize=16 55 | color_normal='#8c564b' 56 | color_gamma='#1f77b4' 57 | 58 | plt.rcParams['text.usetex'] = True 59 | fig, ax = plt.subplots(2,2,figsize=[16.0,8.0],sharex='col') 60 | 61 | ax1 = ax[1,1] 62 | ax2 = ax[0,1] 63 | ax3 = ax[1,0] 64 | ax4 = ax[0,0] 65 | 66 | 67 | ax1.fill_between(x,PDF,alpha=alpha,color=color_normal) 68 | ax1.fill_between(x,PDF_gamma,alpha=alpha,color=color_gamma) 69 | # ax1.plot(x,PDF,linewidth=lw,color=color_normal) 70 | # ax1.plot(x,PDF_gamma,linewidth=lw,color=color_gamma) 71 | ax1.set_xlim(xlimits) 72 | ax1.set_ylim(bottom=0.0) 73 | ax1.set_xticks([]) 74 | ax1.set_yticks([]) 75 | ax1.set_xlabel("Collective Variable",fontsize=fontsize) 76 | ax1.set_ylabel("Probability",fontsize=fontsize) 77 | ax1.spines["top"].set_visible(False) 78 | ax1.spines["right"].set_visible(False) 79 | 80 | ax1.text(-1.25,PDF[np.abs(x - -1.25).argmin()]+0.1,"$\\rho(\mathbf{z})$",color=color_normal,fontsize=fontsize) 81 | ax1.text(-1.00,PDF_gamma[np.abs(x - -1.00).argmin()]+0.05,"$\\tilde{\\rho}(\mathbf{z})\propto [\\rho(\mathbf{z})]^{1/\gamma}$",color=color_gamma,fontsize=fontsize) 82 | 83 | 84 | NumGaussians = [20000, 1200, 416, 50] 85 | 86 | # ax3.set_xticks([]) 87 | ax3.set_xticks([0, 400, 800, 1200],labels=["0", "400", "800", "1200"],fontsize=fontsize) 88 | ax3.set_yticks([]) 89 | ax3.set_xlim([0,1200]) 90 | ax3.set_xlabel("Number of Gaussians Deposited",fontsize=fontsize) 91 | ax3.set_ylabel("Gaussian Height",fontsize=fontsize) 92 | ax3.spines["top"].set_visible(False) 93 | ax3.spines["right"].set_visible(False) 94 | 95 | # ax4.set_xticks([]) 96 | ax4.set_xticks([0, 400, 800, 1200],labels=["0", "400", "800", "1200"],fontsize=fontsize) 97 | ax4.set_yticks([]) 98 | ax4.set_xlim([0,1200]) 99 | # ax4.set_xlabel("Number of Gaussians Deposited",fontsize=fontsize) 100 | ax4.set_ylabel("Collective Variable",fontsize=fontsize) 101 | ax4.spines["top"].set_visible(False) 102 | ax4.spines["right"].set_visible(False) 103 | 104 | hillsdata=np.loadtxt(HillsFile) 105 | time=hillsdata[:,0] 106 | pos=hillsdata[:,1] 107 | biasf=hillsdata[0,4] 108 | height=(1.0-(1.0/biasf))*hillsdata[:,3] 109 | sigma=hillsdata[0,2] 110 | # color_gaussian='#d62728' 111 | color_gaussian=color_gamma 112 | color_gaussian='blue' 113 | for k in NumGaussians: 114 | BIAS=np.zeros(x.size) 115 | for i in range(k): 116 | BIAS += height[i]*np.exp(-0.5*((x-pos[i])/sigma)**2) 117 | ax2.fill_between(x,FES,BIAS+FES,where=BIAS>=0.0,alpha=alpha) 118 | ax2.plot(x,BIAS+FES,linewidth=lw,label="{}".format(k)) 119 | ax3.plot(time[:k],height[:k]) 120 | ax4.plot(time[:k],pos[:k]) 121 | ax2.plot(x,FES, linewidth=lw,color=color_normal) 122 | ax2.legend(loc=[0.0,0.65], 123 | fontsize=12, 124 | title="Number of Gaussian") 125 | #ax2.plot(x[FES_gamma_offset >= FES], 126 | # FES_gamma_offset[FES_gamma_offset >= FES], 127 | # linewidth=lw, 128 | # color=color_gamma) 129 | #ax2.fill_between(x,FES,FES_gamma_offset,where=FES_gamma_offset >= FES,alpha=alpha,color=color_gamma) 130 | ax2.set_xlim(xlimits) 131 | ax2.set_ylim([0.0,+26]) 132 | ax2.set_xticks([]) 133 | ax2.set_yticks([]) 134 | # ax2.set_xlabel("Collective Variable",fontsize=fontsize) 135 | ax2.set_ylabel("Free Energy",fontsize=fontsize) 136 | ax2.spines["top"].set_visible(False) 137 | ax2.spines["right"].set_visible(False) 138 | # ax2.text(-2.2,FES[np.abs(x - -2.2).argmin()]+2.0,"$A(\mathbf{z})$",color=color_normal,fontsize=fontsize) 139 | # ax2.text(0.2,FES[np.abs(x - 0.2).argmin()]+BIAS[np.abs(x - 0.2).argmin()]+2.0,"$A(\mathbf{z})+U_{\mathrm{bias}}(\mathbf{z})$",color=color_gamma,fontsize=fontsize) 140 | 141 | 142 | timestampStr = datetime.now().strftime("%d-%b-%Y_%H%M") 143 | plt.savefig("MetaD-Figure.png") 144 | # plt.savefig("MetaD-Figure.{}.png".format(timestampStr)) 145 | plt.show() 146 | 147 | 148 | 149 | 150 | -------------------------------------------------------------------------------- /Figures/TOC.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jhenin/Methods-for-enhanced-sampling-and-free-energy-calculations/8a61ca08b4a34455d6a89669feed5617afe28c5b/Figures/TOC.jpeg -------------------------------------------------------------------------------- /Figures/Venn_Diagram_Early_Attempt.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jhenin/Methods-for-enhanced-sampling-and-free-energy-calculations/8a61ca08b4a34455d6a89669feed5617afe28c5b/Figures/Venn_Diagram_Early_Attempt.jpeg -------------------------------------------------------------------------------- /Figures/Venn_Diagram_Early_Attempt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jhenin/Methods-for-enhanced-sampling-and-free-energy-calculations/8a61ca08b4a34455d6a89669feed5617afe28c5b/Figures/Venn_Diagram_Early_Attempt.png -------------------------------------------------------------------------------- /Figures/abf_new.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jhenin/Methods-for-enhanced-sampling-and-free-energy-calculations/8a61ca08b4a34455d6a89669feed5617afe28c5b/Figures/abf_new.pdf -------------------------------------------------------------------------------- /Figures/diagnostic_figures/goodmixing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jhenin/Methods-for-enhanced-sampling-and-free-energy-calculations/8a61ca08b4a34455d6a89669feed5617afe28c5b/Figures/diagnostic_figures/goodmixing.png -------------------------------------------------------------------------------- /Figures/diagnostic_figures/goodmixing_exp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jhenin/Methods-for-enhanced-sampling-and-free-energy-calculations/8a61ca08b4a34455d6a89669feed5617afe28c5b/Figures/diagnostic_figures/goodmixing_exp.png -------------------------------------------------------------------------------- /Figures/diagnostic_figures/sepmixing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jhenin/Methods-for-enhanced-sampling-and-free-energy-calculations/8a61ca08b4a34455d6a89669feed5617afe28c5b/Figures/diagnostic_figures/sepmixing.png -------------------------------------------------------------------------------- /Figures/diagnostic_figures/sepmixing_exp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jhenin/Methods-for-enhanced-sampling-and-free-energy-calculations/8a61ca08b4a34455d6a89669feed5617afe28c5b/Figures/diagnostic_figures/sepmixing_exp.png -------------------------------------------------------------------------------- /Figures/diagnostic_figures/slowmixing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jhenin/Methods-for-enhanced-sampling-and-free-energy-calculations/8a61ca08b4a34455d6a89669feed5617afe28c5b/Figures/diagnostic_figures/slowmixing.png -------------------------------------------------------------------------------- /Figures/diagnostic_figures/slowmixing_exp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jhenin/Methods-for-enhanced-sampling-and-free-energy-calculations/8a61ca08b4a34455d6a89669feed5617afe28c5b/Figures/diagnostic_figures/slowmixing_exp.png -------------------------------------------------------------------------------- /Figures/emptywell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jhenin/Methods-for-enhanced-sampling-and-free-energy-calculations/8a61ca08b4a34455d6a89669feed5617afe28c5b/Figures/emptywell.png -------------------------------------------------------------------------------- /Figures/fullwell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jhenin/Methods-for-enhanced-sampling-and-free-energy-calculations/8a61ca08b4a34455d6a89669feed5617afe28c5b/Figures/fullwell.png -------------------------------------------------------------------------------- /Figures/halfwell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jhenin/Methods-for-enhanced-sampling-and-free-energy-calculations/8a61ca08b4a34455d6a89669feed5617afe28c5b/Figures/halfwell.png -------------------------------------------------------------------------------- /Figures/wl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jhenin/Methods-for-enhanced-sampling-and-free-energy-calculations/8a61ca08b4a34455d6a89669feed5617afe28c5b/Figures/wl.png -------------------------------------------------------------------------------- /Figures/wwl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jhenin/Methods-for-enhanced-sampling-and-free-energy-calculations/8a61ca08b4a34455d6a89669feed5617afe28c5b/Figures/wwl.png -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Attribution 4.0 International 2 | 3 | ======================================================================= 4 | 5 | Creative Commons Corporation ("Creative Commons") is not a law firm and 6 | does not provide legal services or legal advice. Distribution of 7 | Creative Commons public licenses does not create a lawyer-client or 8 | other relationship. Creative Commons makes its licenses and related 9 | information available on an "as-is" basis. Creative Commons gives no 10 | warranties regarding its licenses, any material licensed under their 11 | terms and conditions, or any related information. Creative Commons 12 | disclaims all liability for damages resulting from their use to the 13 | fullest extent possible. 14 | 15 | Using Creative Commons Public Licenses 16 | 17 | Creative Commons public licenses provide a standard set of terms and 18 | conditions that creators and other rights holders may use to share 19 | original works of authorship and other material subject to copyright 20 | and certain other rights specified in the public license below. The 21 | following considerations are for informational purposes only, are not 22 | exhaustive, and do not form part of our licenses. 23 | 24 | Considerations for licensors: Our public licenses are 25 | intended for use by those authorized to give the public 26 | permission to use material in ways otherwise restricted by 27 | copyright and certain other rights. Our licenses are 28 | irrevocable. Licensors should read and understand the terms 29 | and conditions of the license they choose before applying it. 30 | Licensors should also secure all rights necessary before 31 | applying our licenses so that the public can reuse the 32 | material as expected. Licensors should clearly mark any 33 | material not subject to the license. This includes other CC- 34 | licensed material, or material used under an exception or 35 | limitation to copyright. More considerations for licensors: 36 | wiki.creativecommons.org/Considerations_for_licensors 37 | 38 | Considerations for the public: By using one of our public 39 | licenses, a licensor grants the public permission to use the 40 | licensed material under specified terms and conditions. If 41 | the licensor's permission is not necessary for any reason--for 42 | example, because of any applicable exception or limitation to 43 | copyright--then that use is not regulated by the license. Our 44 | licenses grant only permissions under copyright and certain 45 | other rights that a licensor has authority to grant. Use of 46 | the licensed material may still be restricted for other 47 | reasons, including because others have copyright or other 48 | rights in the material. A licensor may make special requests, 49 | such as asking that all changes be marked or described. 50 | Although not required by our licenses, you are encouraged to 51 | respect those requests where reasonable. More_considerations 52 | for the public: 53 | wiki.creativecommons.org/Considerations_for_licensees 54 | 55 | ======================================================================= 56 | 57 | Creative Commons Attribution 4.0 International Public License 58 | 59 | By exercising the Licensed Rights (defined below), You accept and agree 60 | to be bound by the terms and conditions of this Creative Commons 61 | Attribution 4.0 International Public License ("Public License"). To the 62 | extent this Public License may be interpreted as a contract, You are 63 | granted the Licensed Rights in consideration of Your acceptance of 64 | these terms and conditions, and the Licensor grants You such rights in 65 | consideration of benefits the Licensor receives from making the 66 | Licensed Material available under these terms and conditions. 67 | 68 | 69 | Section 1 -- Definitions. 70 | 71 | a. Adapted Material means material subject to Copyright and Similar 72 | Rights that is derived from or based upon the Licensed Material 73 | and in which the Licensed Material is translated, altered, 74 | arranged, transformed, or otherwise modified in a manner requiring 75 | permission under the Copyright and Similar Rights held by the 76 | Licensor. For purposes of this Public License, where the Licensed 77 | Material is a musical work, performance, or sound recording, 78 | Adapted Material is always produced where the Licensed Material is 79 | synched in timed relation with a moving image. 80 | 81 | b. Adapter's License means the license You apply to Your Copyright 82 | and Similar Rights in Your contributions to Adapted Material in 83 | accordance with the terms and conditions of this Public License. 84 | 85 | c. Copyright and Similar Rights means copyright and/or similar rights 86 | closely related to copyright including, without limitation, 87 | performance, broadcast, sound recording, and Sui Generis Database 88 | Rights, without regard to how the rights are labeled or 89 | categorized. For purposes of this Public License, the rights 90 | specified in Section 2(b)(1)-(2) are not Copyright and Similar 91 | Rights. 92 | 93 | d. Effective Technological Measures means those measures that, in the 94 | absence of proper authority, may not be circumvented under laws 95 | fulfilling obligations under Article 11 of the WIPO Copyright 96 | Treaty adopted on December 20, 1996, and/or similar international 97 | agreements. 98 | 99 | e. Exceptions and Limitations means fair use, fair dealing, and/or 100 | any other exception or limitation to Copyright and Similar Rights 101 | that applies to Your use of the Licensed Material. 102 | 103 | f. Licensed Material means the artistic or literary work, database, 104 | or other material to which the Licensor applied this Public 105 | License. 106 | 107 | g. Licensed Rights means the rights granted to You subject to the 108 | terms and conditions of this Public License, which are limited to 109 | all Copyright and Similar Rights that apply to Your use of the 110 | Licensed Material and that the Licensor has authority to license. 111 | 112 | h. Licensor means the individual(s) or entity(ies) granting rights 113 | under this Public License. 114 | 115 | i. Share means to provide material to the public by any means or 116 | process that requires permission under the Licensed Rights, such 117 | as reproduction, public display, public performance, distribution, 118 | dissemination, communication, or importation, and to make material 119 | available to the public including in ways that members of the 120 | public may access the material from a place and at a time 121 | individually chosen by them. 122 | 123 | j. Sui Generis Database Rights means rights other than copyright 124 | resulting from Directive 96/9/EC of the European Parliament and of 125 | the Council of 11 March 1996 on the legal protection of databases, 126 | as amended and/or succeeded, as well as other essentially 127 | equivalent rights anywhere in the world. 128 | 129 | k. You means the individual or entity exercising the Licensed Rights 130 | under this Public License. Your has a corresponding meaning. 131 | 132 | 133 | Section 2 -- Scope. 134 | 135 | a. License grant. 136 | 137 | 1. Subject to the terms and conditions of this Public License, 138 | the Licensor hereby grants You a worldwide, royalty-free, 139 | non-sublicensable, non-exclusive, irrevocable license to 140 | exercise the Licensed Rights in the Licensed Material to: 141 | 142 | a. reproduce and Share the Licensed Material, in whole or 143 | in part; and 144 | 145 | b. produce, reproduce, and Share Adapted Material. 146 | 147 | 2. Exceptions and Limitations. For the avoidance of doubt, where 148 | Exceptions and Limitations apply to Your use, this Public 149 | License does not apply, and You do not need to comply with 150 | its terms and conditions. 151 | 152 | 3. Term. The term of this Public License is specified in Section 153 | 6(a). 154 | 155 | 4. Media and formats; technical modifications allowed. The 156 | Licensor authorizes You to exercise the Licensed Rights in 157 | all media and formats whether now known or hereafter created, 158 | and to make technical modifications necessary to do so. The 159 | Licensor waives and/or agrees not to assert any right or 160 | authority to forbid You from making technical modifications 161 | necessary to exercise the Licensed Rights, including 162 | technical modifications necessary to circumvent Effective 163 | Technological Measures. For purposes of this Public License, 164 | simply making modifications authorized by this Section 2(a) 165 | (4) never produces Adapted Material. 166 | 167 | 5. Downstream recipients. 168 | 169 | a. Offer from the Licensor -- Licensed Material. Every 170 | recipient of the Licensed Material automatically 171 | receives an offer from the Licensor to exercise the 172 | Licensed Rights under the terms and conditions of this 173 | Public License. 174 | 175 | b. No downstream restrictions. You may not offer or impose 176 | any additional or different terms or conditions on, or 177 | apply any Effective Technological Measures to, the 178 | Licensed Material if doing so restricts exercise of the 179 | Licensed Rights by any recipient of the Licensed 180 | Material. 181 | 182 | 6. No endorsement. Nothing in this Public License constitutes or 183 | may be construed as permission to assert or imply that You 184 | are, or that Your use of the Licensed Material is, connected 185 | with, or sponsored, endorsed, or granted official status by, 186 | the Licensor or others designated to receive attribution as 187 | provided in Section 3(a)(1)(A)(i). 188 | 189 | b. Other rights. 190 | 191 | 1. Moral rights, such as the right of integrity, are not 192 | licensed under this Public License, nor are publicity, 193 | privacy, and/or other similar personality rights; however, to 194 | the extent possible, the Licensor waives and/or agrees not to 195 | assert any such rights held by the Licensor to the limited 196 | extent necessary to allow You to exercise the Licensed 197 | Rights, but not otherwise. 198 | 199 | 2. Patent and trademark rights are not licensed under this 200 | Public License. 201 | 202 | 3. To the extent possible, the Licensor waives any right to 203 | collect royalties from You for the exercise of the Licensed 204 | Rights, whether directly or through a collecting society 205 | under any voluntary or waivable statutory or compulsory 206 | licensing scheme. In all other cases the Licensor expressly 207 | reserves any right to collect such royalties. 208 | 209 | 210 | Section 3 -- License Conditions. 211 | 212 | Your exercise of the Licensed Rights is expressly made subject to the 213 | following conditions. 214 | 215 | a. Attribution. 216 | 217 | 1. If You Share the Licensed Material (including in modified 218 | form), You must: 219 | 220 | a. retain the following if it is supplied by the Licensor 221 | with the Licensed Material: 222 | 223 | i. identification of the creator(s) of the Licensed 224 | Material and any others designated to receive 225 | attribution, in any reasonable manner requested by 226 | the Licensor (including by pseudonym if 227 | designated); 228 | 229 | ii. a copyright notice; 230 | 231 | iii. a notice that refers to this Public License; 232 | 233 | iv. a notice that refers to the disclaimer of 234 | warranties; 235 | 236 | v. a URI or hyperlink to the Licensed Material to the 237 | extent reasonably practicable; 238 | 239 | b. indicate if You modified the Licensed Material and 240 | retain an indication of any previous modifications; and 241 | 242 | c. indicate the Licensed Material is licensed under this 243 | Public License, and include the text of, or the URI or 244 | hyperlink to, this Public License. 245 | 246 | 2. You may satisfy the conditions in Section 3(a)(1) in any 247 | reasonable manner based on the medium, means, and context in 248 | which You Share the Licensed Material. For example, it may be 249 | reasonable to satisfy the conditions by providing a URI or 250 | hyperlink to a resource that includes the required 251 | information. 252 | 253 | 3. If requested by the Licensor, You must remove any of the 254 | information required by Section 3(a)(1)(A) to the extent 255 | reasonably practicable. 256 | 257 | 4. If You Share Adapted Material You produce, the Adapter's 258 | License You apply must not prevent recipients of the Adapted 259 | Material from complying with this Public License. 260 | 261 | 262 | Section 4 -- Sui Generis Database Rights. 263 | 264 | Where the Licensed Rights include Sui Generis Database Rights that 265 | apply to Your use of the Licensed Material: 266 | 267 | a. for the avoidance of doubt, Section 2(a)(1) grants You the right 268 | to extract, reuse, reproduce, and Share all or a substantial 269 | portion of the contents of the database; 270 | 271 | b. if You include all or a substantial portion of the database 272 | contents in a database in which You have Sui Generis Database 273 | Rights, then the database in which You have Sui Generis Database 274 | Rights (but not its individual contents) is Adapted Material; and 275 | 276 | c. You must comply with the conditions in Section 3(a) if You Share 277 | all or a substantial portion of the contents of the database. 278 | 279 | For the avoidance of doubt, this Section 4 supplements and does not 280 | replace Your obligations under this Public License where the Licensed 281 | Rights include other Copyright and Similar Rights. 282 | 283 | 284 | Section 5 -- Disclaimer of Warranties and Limitation of Liability. 285 | 286 | a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE 287 | EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS 288 | AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF 289 | ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, 290 | IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, 291 | WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR 292 | PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, 293 | ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT 294 | KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT 295 | ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. 296 | 297 | b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE 298 | TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, 299 | NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, 300 | INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, 301 | COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR 302 | USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN 303 | ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR 304 | DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR 305 | IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. 306 | 307 | c. The disclaimer of warranties and limitation of liability provided 308 | above shall be interpreted in a manner that, to the extent 309 | possible, most closely approximates an absolute disclaimer and 310 | waiver of all liability. 311 | 312 | 313 | Section 6 -- Term and Termination. 314 | 315 | a. This Public License applies for the term of the Copyright and 316 | Similar Rights licensed here. However, if You fail to comply with 317 | this Public License, then Your rights under this Public License 318 | terminate automatically. 319 | 320 | b. Where Your right to use the Licensed Material has terminated under 321 | Section 6(a), it reinstates: 322 | 323 | 1. automatically as of the date the violation is cured, provided 324 | it is cured within 30 days of Your discovery of the 325 | violation; or 326 | 327 | 2. upon express reinstatement by the Licensor. 328 | 329 | For the avoidance of doubt, this Section 6(b) does not affect any 330 | right the Licensor may have to seek remedies for Your violations 331 | of this Public License. 332 | 333 | c. For the avoidance of doubt, the Licensor may also offer the 334 | Licensed Material under separate terms or conditions or stop 335 | distributing the Licensed Material at any time; however, doing so 336 | will not terminate this Public License. 337 | 338 | d. Sections 1, 5, 6, 7, and 8 survive termination of this Public 339 | License. 340 | 341 | 342 | Section 7 -- Other Terms and Conditions. 343 | 344 | a. The Licensor shall not be bound by any additional or different 345 | terms or conditions communicated by You unless expressly agreed. 346 | 347 | b. Any arrangements, understandings, or agreements regarding the 348 | Licensed Material not stated herein are separate from and 349 | independent of the terms and conditions of this Public License. 350 | 351 | 352 | Section 8 -- Interpretation. 353 | 354 | a. For the avoidance of doubt, this Public License does not, and 355 | shall not be interpreted to, reduce, limit, restrict, or impose 356 | conditions on any use of the Licensed Material that could lawfully 357 | be made without permission under this Public License. 358 | 359 | b. To the extent possible, if any provision of this Public License is 360 | deemed unenforceable, it shall be automatically reformed to the 361 | minimum extent necessary to make it enforceable. If the provision 362 | cannot be reformed, it shall be severed from this Public License 363 | without affecting the enforceability of the remaining terms and 364 | conditions. 365 | 366 | c. No term or condition of this Public License will be waived and no 367 | failure to comply consented to unless expressly agreed to by the 368 | Licensor. 369 | 370 | d. Nothing in this Public License constitutes or may be interpreted 371 | as a limitation upon, or waiver of, any privileges and immunities 372 | that apply to the Licensor or You, including from the legal 373 | processes of any jurisdiction or authority. 374 | 375 | 376 | ======================================================================= 377 | 378 | Creative Commons is not a party to its public 379 | licenses. Notwithstanding, Creative Commons may elect to apply one of 380 | its public licenses to material it publishes and in those instances 381 | will be considered the “Licensor.” The text of the Creative Commons 382 | public licenses is dedicated to the public domain under the CC0 Public 383 | Domain Dedication. Except for the limited purpose of indicating that 384 | material is shared under a Creative Commons public license or as 385 | otherwise permitted by the Creative Commons policies published at 386 | creativecommons.org/policies, Creative Commons does not authorize the 387 | use of the trademark "Creative Commons" or any other trademark or logo 388 | of Creative Commons without its prior written consent including, 389 | without limitation, in connection with any unauthorized modifications 390 | to any of its public licenses or any other arrangements, 391 | understandings, or agreements concerning use of licensed material. For 392 | the avoidance of doubt, this paragraph does not form part of the 393 | public licenses. 394 | 395 | Creative Commons may be contacted at creativecommons.org. 396 | 397 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Enhanced Sampling Methods for Molecular Dynamics Simulations 2 | A repository for a [LiveCoMS Perpetual Review](https://livecomsjournal.org/index.php/livecoms/catalog/category/reviews) on enhanced sampling methods titled "Enhanced Sampling Methods for Molecular Dynamics Simulations". Version 1.0 published in LiveCoMS under DOI: [10.33011/livecoms.4.1.1583](https://doi.org/10.33011/livecoms.4.1.1583). 3 | 4 | ## List of Authors 5 | - Jérôme Hénin, Laboratoire de Biochimie Théorique UPR 9080, CNRS, Université de Paris, Paris, France, and Institut de Biologie Physico-Chimique-Fondation Edmond de Rothschild, Paris, France 6 | - Tony Lelièvre, CERMICS, Ecole des Ponts, INRIA, Marne-la-Vallée, France 7 | - Michael R. Shirts, Department of Chemical and Biological Engineering, University of Colorado Boulder, Boulder, CO, USA 8 | - Omar Valsson, University of North Texas, Department of Chemistry, Denton, TX, USA 9 | - Lucie Delemotte, KTH Royal Institute of Technology, Science for Life Laboratory, Stockholm, Sweden 10 | 11 | ## Citation 12 | Please use the following citation for the review: 13 | 14 | Hénin, J. ., Lelièvre, T., Shirts, M. R., Valsson, O., & Delemotte, L. (2022). Enhanced Sampling Methods for Molecular Dynamics Simulations [Article v1.0]. Living Journal of Computational Molecular Science, 4(1), 1583. https://doi.org/10.33011/livecoms.4.1.1583 15 | 16 | Or in BibTeX format: 17 | ``` 18 | @article{Henin_Lelievre_Shirts_Valsson_Delemotte_2022, 19 | place={Boulder, CO, USA}, 20 | author={H{\'e}nin, J{\'e}r{\^o}me and Leli{\`e}vre, Tony and Shirts, Michael R. and Valsson, Omar and Delemotte, Lucie}, 21 | title={Enhanced Sampling Methods for Molecular Dynamics Simulations [Article v1.0]}, 22 | journal={Living Journal of Computational Molecular Science}, 23 | volume={4}, 24 | number={1}, 25 | year={2022}, 26 | month={Dec.}, 27 | pages={1583}, 28 | url={https://livecomsjournal.org/index.php/livecoms/article/view/v4i1e1583}, 29 | DOI={10.33011/livecoms.4.1.1583} 30 | } 31 | ``` 32 | 33 | 34 | ## List of Contributors 35 | 36 | 37 | ## Paper writing as code development 38 | 39 | This paper is being developed as a living document, open to changes from the community. You can read more about the concept of writing a paper in the same way one would write software code in the essay ["Paper writing as code development"](https://livecomsjournal.github.io/about/paper_code/). If you have comments or suggestions, we welcome them! Please [submit them as issues](https://guides.github.com/features/issues/) to this GitHub repository so they can be recorded and given credit for the contribution. Specific changes can be proposed [via pull requests](https://help.github.com/articles/about-pull-requests/). 40 | 41 | ## List of Released Versions 42 | 43 | - v0.5: Initial submisson to LiveCoMS, and posted on [arXiv](https://arxiv.org/abs/2202.04164v1). 44 | - v0.7: Revised submisson to LiveCoMS, and posted on [arXiv](https://arxiv.org/abs/2202.04164v2). 45 | - v1.0: Published version in LiveCoMs, and posted under DOI: [10.33011/livecoms.4.1.1583](https://doi.org/10.33011/livecoms.4.1.1583). 46 | 47 | ## Changelog 48 | 49 | - 9 February 2022: Version v0.5 submitted to LiveCoMS, and posted on [arXiv](https://arxiv.org/abs/2202.04164v1). 50 | - 19 August 2022: Version v0.7 (revision) submitted to LiveCoMS, and posted on [arXiv](https://arxiv.org/abs/2202.04164v2). 51 | - 14 December 2022: Version v1.0 published in LiveCoMS, and posted under DOI: [10.33011/livecoms.4.1.1583](https://doi.org/10.33011/livecoms.4.1.1583). 52 | -------------------------------------------------------------------------------- /Revision/review.Diff-Resubmission-August19-2022.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jhenin/Methods-for-enhanced-sampling-and-free-energy-calculations/8a61ca08b4a34455d6a89669feed5617afe28c5b/Revision/review.Diff-Resubmission-August19-2022.pdf -------------------------------------------------------------------------------- /latexmkrc: -------------------------------------------------------------------------------- 1 | $pdflatex = 'pdflatex --halt-on-error %O %S'; 2 | $lualatex = 'lualatex --halt-on-error %O %S'; 3 | $xelatex = 'xelatex --halt-on-error %O %S'; -------------------------------------------------------------------------------- /livecoms.cls: -------------------------------------------------------------------------------- 1 | % A template for LiveCoMS submissions. 2 | % 3 | % adapted from elife template, v1.4 4 | \NeedsTeXFormat{LaTeX2e} 5 | \ProvidesClass{livecoms}[2017/08/10, v0.5...] 6 | 7 | \RequirePackage[english]{babel} 8 | 9 | \RequirePackage{calc} 10 | \RequirePackage{etoolbox} 11 | \RequirePackage{regexpatch} 12 | \RequirePackage{ifxetex,ifluatex} 13 | 14 | \newif\ifxetexorluatex 15 | \ifxetex 16 | \xetexorluatextrue 17 | \else 18 | \ifluatex 19 | \xetexorluatextrue 20 | \else 21 | \xetexorluatexfalse 22 | \fi 23 | \fi 24 | 25 | \newif\if@reqslineno 26 | \DeclareOption{lineno}{\@reqslinenotrue} 27 | 28 | %% the type of document this is. The current types: 29 | % bestpractices, editorial, tutorial, training, review, software, lessons 30 | \newif\if@bestpractices 31 | \DeclareOption{bestpractices}{\@bestpracticestrue} 32 | 33 | \newif\if@editorial 34 | \DeclareOption{editorial}{\@editorialtrue} 35 | 36 | \newif\if@tutorial 37 | \DeclareOption{tutorial}{\@tutorialtrue} 38 | 39 | \newif\if@training 40 | \DeclareOption{training}{\@trainingtrue} 41 | 42 | \newif\if@review 43 | \DeclareOption{review}{\@reviewtrue} 44 | 45 | \newif\if@software 46 | \DeclareOption{software}{\@softwaretrue} 47 | 48 | \newif\if@lessons 49 | \DeclareOption{lessons}{\@lessonstrue} 50 | 51 | %Publication Information 52 | \newif\if@pubversion 53 | \DeclareOption{pubversion}{\@pubversiontrue} 54 | 55 | \newif\if@ASAPversion 56 | \DeclareOption{ASAPversion}{\@ASAPversiontrue} 57 | 58 | %% Linespacing. 59 | \newif\if@onehalfspacing 60 | \newif\if@doublespacing 61 | \DeclareOption{onehalfspacing}{\@onehalfspacingtrue} 62 | \DeclareOption{doublespacing}{\@doublespacingtrue} 63 | 64 | \DeclareOption*{\PassOptionsToClass{\CurrentOption}{extarticle}} 65 | \ExecuteOptions{} 66 | \ProcessOptions\relax 67 | \LoadClass{extarticle} 68 | 69 | \RequirePackage{amsmath} 70 | \RequirePackage{amssymb} 71 | \RequirePackage{mdframed} 72 | 73 | \RequirePackage{lineno} 74 | \if@reqslineno\linenumbers\fi 75 | 76 | \ifxetexorluatex 77 | \RequirePackage[no-math]{fontspec} 78 | \setmainfont[Ligatures = TeX, 79 | Extension = .ttf, 80 | UprightFont = *-Regular, 81 | BoldFont = *-Bold, 82 | ItalicFont = *-Italic, 83 | BoldItalicFont = *-BoldItalic] 84 | {OpenSans} 85 | \else 86 | \RequirePackage[T1]{fontenc} 87 | \RequirePackage[utf8]{inputenc} 88 | \RequirePackage[default]{opensans} 89 | \renewcommand{\ttdefault}{lmtt} 90 | \fi 91 | 92 | \RequirePackage{microtype} 93 | 94 | % Trueno/Open Sans requires a bigger "single" linespread. 95 | \linespread{1.2} 96 | \if@onehalfspacing\linespread{1.5}\fi 97 | \if@doublespacing\linespread{2.0}\fi 98 | 99 | \emergencystretch 3em 100 | 101 | \RequirePackage{graphicx,xcolor} 102 | \definecolor{LiveCoMSDarkBlue}{HTML}{273B81} 103 | \definecolor{LiveCoMSLightBlue}{HTML}{0A9DD9} 104 | \definecolor{LiveCoMSMediumGrey}{HTML}{6D6E70} 105 | \definecolor{LiveCoMSLightGrey}{HTML}{929497} 106 | 107 | \RequirePackage{booktabs} 108 | \RequirePackage{authblk} 109 | 110 | % Modified page geometry for LiveComs 111 | \RequirePackage[%left=6cm,% 112 | %marginparwidth=4cm,% 113 | %marginparsep=0.5cm,% 114 | left=2cm, 115 | right=1.3cm,% 116 | top=2cm,% 117 | bottom=2.5cm,% 118 | headheight=21pt,% 119 | headsep=2\baselineskip,% 120 | columnsep=2em,% 121 | letterpaper]{geometry}% 122 | \RequirePackage{changepage} 123 | 124 | \RequirePackage{silence} 125 | \WarningFilter{caption}{The option `hypcap=true' will be ignored} 126 | \WarningFilter{microtype}{Unknown slot} 127 | 128 | \RequirePackage[labelfont={bf},% 129 | labelsep=period,% 130 | justification=justified,% 131 | singlelinecheck=false,% 132 | tableposition=top,font=small] 133 | {caption} 134 | 135 | % \captionsetup*[table]{skip=\medskipamount} 136 | 137 | 138 | \RequirePackage[square,numbers,sort&compress]{natbib} 139 | \RequirePackage{natmove} 140 | \renewcommand{\bibfont}{\small} 141 | % modifed from https://github.com/gbhutani/vancouver_authoryear_bibstyle/ 142 | \IfFileExists{vancouver-livecoms.bst} 143 | {\bibliographystyle{vancouver-livecoms}} 144 | {\PackageWarning{elife}{vancouver-livecoms.bst not found; falling back to apalike bibliography style.}\bibliographystyle{apalike}} 145 | % Make author in citation italic 146 | \renewcommand{\NAT@nmfmt}[1]{{\bfseries\itshape\color{LiveCoMSMediumGrey} #1}} 147 | 148 | % ...as well as the year 149 | \xpatchcmd{\NAT@citex} 150 | {\@citea\NAT@hyper@{\NAT@nmfmt{\NAT@nm}\NAT@date}} 151 | {\@citea\NAT@hyper@{\NAT@nmfmt{\NAT@nm}\NAT@nmfmt{\NAT@date}}} 152 | {}{\PackageWarning{LiveCoMS}{Failed to patch year format in citation}} 153 | 154 | \xpatchcmd{\NAT@citex} 155 | {\else\unskip\NAT@spacechar\NAT@hyper@{\NAT@date}} 156 | {\else\unskip\NAT@spacechar\NAT@hyper@{\NAT@nmfmt{\NAT@date}}} 157 | {}{\PackageWarning{LiveCoMS}{Failed to patch year format in citation}} 158 | 159 | \xpatchcmd{\NAT@citex} 160 | {\hyper@natlinkbreak{\NAT@aysep\NAT@spacechar}{\@citeb\@extra@b@citeb}\NAT@date} 161 | {\hyper@natlinkbreak{\NAT@nmfmt{\NAT@aysep\NAT@spacechar}}{\@citeb\@extra@b@citeb}\NAT@nmfmt{\NAT@date}} 162 | {}{\PackageWarning{LiveCoMS}{Failed to patch year format in citation}} 163 | 164 | \xpatchcmd{\NAT@citex} 165 | {\@citea\NAT@hyper@{\NAT@date}} 166 | {\@citea\NAT@hyper@{\NAT@nmfmt{\NAT@date}}} 167 | {}{\PackageWarning{LiveCoMS}{Failed to patch year format in citation}} 168 | 169 | \xpatchcmd{\NAT@citex} 170 | {{\@citeb\@extra@b@citeb}\NAT@date} 171 | {{\@citeb\@extra@b@citeb}\NAT@nmfmt{\NAT@date}} 172 | {}{\PackageWarning{LiveCoMS}{Failed to patch year format in citation}} 173 | %% There, we're finally done with patching the year in citations. 174 | 175 | % 176 | % headers and footers 177 | % 178 | 179 | \RequirePackage{fancyhdr} % custom headers/footers 180 | \RequirePackage{lastpage} % Number of pages in the document 181 | \pagestyle{fancy} % Enables the custom headers/footers 182 | %% Next two lines unnecessary for LiveComs 183 | % \addtolength{\headwidth}{\marginparsep} 184 | % \addtolength{\headwidth}{\marginparwidth} 185 | 186 | %% different document types listed here 187 | 188 | \newif\ifdocumenttype 189 | \documenttypefalse 190 | 191 | \if@bestpractices 192 | \documenttypetrue 193 | \newcommand{\documenttype}{Best Practices Guide} 194 | \else 195 | % nothing 196 | \fi 197 | 198 | \if@editorial 199 | \documenttypetrue 200 | \newcommand{\documenttype}{Editorial} 201 | \else 202 | % nothing 203 | \fi 204 | 205 | \if@tutorial 206 | \documenttypetrue 207 | \newcommand{\documenttype}{Tutorial} 208 | \else 209 | % nothing 210 | \fi 211 | 212 | \if@training 213 | \documenttypetrue 214 | \newcommand{\documenttype}{Training Article} 215 | \else 216 | % nothing 217 | \fi 218 | 219 | \if@review 220 | \documenttypetrue 221 | \newcommand{\documenttype}{Perpetual Review} 222 | \else 223 | % nothing 224 | \fi 225 | 226 | \if@software 227 | \documenttypetrue 228 | \newcommand{\documenttype}{Software Analysis} 229 | \else 230 | % nothing 231 | \fi 232 | 233 | \if@lessons 234 | \documenttypetrue 235 | \newcommand{\documenttype}{``Lessons Learned'' Document} 236 | \else 237 | % nothing 238 | \fi 239 | 240 | \fancyhf{} 241 | \ifdocumenttype 242 | \chead{% 243 | \setlength{\fboxsep}{3pt} 244 | \colorbox{LiveCoMSMediumGrey}{\begin{minipage}{\headwidth}\centering\color{white} A LiveCoMS \documenttype\end{minipage}}% 245 | } 246 | \fi 247 | 248 | % Publication information in document footer 249 | % *ONLY INCLUDED IF "pubversion" CLASS OPTION IS INVOKED* 250 | \def\@publishedDOI{} 251 | \def\@publishedvolume{} 252 | \def\@publishedyear{} 253 | \def\@publishedarticlenum{} 254 | \def\@publisheddatereceived{} 255 | \def\@publisheddateaccepted{} 256 | \def \DOIprefix{10.XXXX} %May be able to use this later 257 | \newcommand{\pubDOI}[1]{% 258 | \appto{\@publishedDOI}{#1}{}{} 259 | } 260 | \newcommand{\pubvolume}[1]{% 261 | \appto{\@publishedvolume}{#1}{}{} 262 | } 263 | \newcommand{\pubissue}[1]{% 264 | \appto{\@publishedissue}{#1}{}{} 265 | } 266 | \newcommand{\pubyear}[1]{% 267 | \appto{\@publishedyear}{#1}{}{} 268 | } 269 | \newcommand{\articlenum}[1]{% 270 | \appto{\@publishedarticlenum}{#1}{}{} 271 | } 272 | \newcommand{\datereceived}[1]{% 273 | \appto{\@publisheddatereceived}{#1}{}{} 274 | } 275 | \newcommand{\dateaccepted}[1]{% 276 | \appto{\@publisheddateaccepted}{#1}{}{} 277 | } 278 | 279 | %-------------------------------------------------------- 280 | % Footers 281 | % 1. Error Check for conflicting class options 282 | \if@pubversion 283 | \if@ASAPversion 284 | \ClassError{livecoms} 285 | {Nope nope nope, you cannot invoke 'pubversion' and 'ASAPversion' simultaneously. Please correct the class options.} 286 | \fi 287 | \fi 288 | % 2. Publication Version: put submission/acceptance dates in left footer and citation information in right footer 289 | %%% DWS NOTE: would be nice if the left footer was in an if A-or-B type logical statement 290 | \if@pubversion 291 | \lfoot{\ifthenelse{\value{page}=1} 292 | {\small\color{LiveCoMSMediumGrey}Received: \@publisheddatereceived \\ Accepted: \@publisheddateaccepted} 293 | {~\\~} 294 | }% 295 | \rfoot{\small\color{LiveCoMSMediumGrey}\href{https://doi.org/\@publishedDOI}{https://doi.org/\@publishedDOI}\\ 296 | {\it Living J. Comp. Mol. Sci.} \@publishedyear, \@publishedvolume\nobreak\hspace{.05em}(\@publishedissue), \@publishedarticlenum 297 | }% 298 | \fi 299 | % 3. ASAP Version: put submission/acceptance dates in left footer and "ASAP Version" in right footer 300 | \if@ASAPversion 301 | \lfoot{\ifthenelse{\value{page}=1} 302 | {\small\color{LiveCoMSMediumGrey}Received: \@publisheddatereceived \\ Accepted: \@publisheddateaccepted} 303 | {~\\~} 304 | }% 305 | \rfoot{\small\color{LiveCoMSMediumGrey}\href{https://doi.org/\@publishedDOI}{https://doi.org/\@publishedDOI}\\ 306 | {\it Living J. Comp. Mol. Sci.} ASAP Version 307 | }% 308 | \fi 309 | % 4. Page Number in center of footer 310 | \cfoot{\small\color{white} \vspace{\baselineskip} \small\color{LiveCoMSMediumGrey} \thepage\space of\space\pageref{LastPage}}% 311 | \preto{\footrule}{\color{LiveCoMSMediumGrey}} 312 | \renewcommand{\headrulewidth}{0pt}% % No header rule 313 | \renewcommand{\footrulewidth}{0.4pt}% % No footer rule 314 | %---------------------------------------------------------- 315 | 316 | % 317 | % section/subsection/paragraph set-up 318 | % Updated for LiveComs 319 | % \setcounter{secnumdepth}{0} 320 | \RequirePackage[explicit]{titlesec} 321 | \titleformat{\section} 322 | {\LARGE\bfseries\raggedright} 323 | {\thesection}{1em}{#1}[] 324 | \titleformat{\subsection} 325 | {\Large\bfseries\raggedright\color{LiveCoMSMediumGrey}} 326 | {\thesubsection}{1em}{#1}[] 327 | \titleformat{\subsubsection} 328 | {\large\raggedright\color{LiveCoMSMediumGrey}} 329 | {\thesubsubsection}{1em}{#1}[] 330 | \titleformat{\paragraph} 331 | {\large\raggedright\color{LiveCoMSMediumGrey}} 332 | {\theparagraph}{1em}{#1}[] 333 | \titlespacing*{\section}{0pc}{3ex \@plus4pt \@minus3pt}{0pt} 334 | \titlespacing*{\subsection}{0pc}{2.5ex \@plus3pt \@minus2pt}{0pt} 335 | \titlespacing*{\subsubsection}{0pc}{2ex \@plus2.5pt \@minus1.5pt}{0pt} 336 | \titlespacing*{\paragraph}{0pc}{1.5ex \@plus2pt \@minus1pt}{0pt} 337 | 338 | \RequirePackage{enumitem} 339 | \setlist{noitemsep} 340 | 341 | \RequirePackage{alphalph} 342 | \newalphalph{\fnsymbolmult}[mult]{\@fnsymbol}{5} 343 | 344 | \newcounter{authorfn} 345 | \setcounter{authorfn}{1} 346 | \newcommand{\authfn}[1]{% 347 | \fnsymbolmult{\numexpr\value{authorfn}+#1}% 348 | } 349 | 350 | \def\@correspondence{} 351 | \def\@contribution{} 352 | \def\@presentaddress{} 353 | \def\@deceased{} 354 | % Added blurb for LiveComs 355 | \def\@blurb{} 356 | \def\@orcidblock{} 357 | 358 | 359 | \newcommand{\corr}[2]{% 360 | \ifx\empty\@correspondence\else\appto{\@correspondence}{; }{}{}\fi 361 | \appto{\@correspondence}{% 362 | \url{#1}% 363 | \ifx\empty#2\else\space(#2)\fi 364 | }{}{}% 365 | } 366 | 367 | \newcommand{\contrib}[2][]{ 368 | \appto{\@contribution}{% 369 | \ifx\empty#1\else\textsuperscript{#1}\fi 370 | #2\\ 371 | }{}{} 372 | } 373 | 374 | \newcommand{\presentadd}[2][]{ 375 | \ifx\empty\@presentaddress\else\appto{\@presentaddress}{; }{}{}\fi 376 | \appto{\@presentaddress}{% 377 | \ifx\empty#1\else\textsuperscript{#1}\fi 378 | #2% 379 | }{}{} 380 | } 381 | 382 | \newcommand{\deceased}[1]{\def\@deceased{\textsuperscript{#1}Deceased}} 383 | 384 | % Added for LiveComs 385 | \newcommand{\blurb}[1]{\def\@blurb{#1}} 386 | 387 | \newcommand{\orcid}[2]{% 388 | \ifx\empty\@orcidblock\else\appto{\@orcidblock}{\\}{}{}\fi 389 | \appto{\@orcidblock}{% 390 | #1:\space% 391 | \ifx\empty#2\else\href{https://orcid.org/#2}{#2} \fi 392 | }{}{}% 393 | } 394 | 395 | 396 | 397 | \reversemarginpar 398 | 399 | % 400 | % custom title page 401 | % 402 | \renewcommand{\Authfont}{\bfseries\large\raggedright} 403 | \renewcommand{\Affilfont}{\mdseries\large\raggedright} 404 | \renewcommand{\Authands}{, } 405 | \setlength{\affilsep}{16pt} 406 | \renewcommand{\AB@affilsepx}{; \protect\Affilfont} 407 | 408 | \newcommand{\themetadata}{% 409 | \textbf{*For correspondence:\\} \@correspondence\par 410 | \ifx\empty\@contribution\else 411 | \bigskip\@contribution\par\fi 412 | \ifx\empty\@presentaddress\else 413 | \textbf{Present address: }\@presentaddress\par\fi 414 | \ifx\empty\@deceased\else\@deceased\par\fi 415 | } 416 | 417 | \patchcmd{\@author}{\AB@authlist\\[\affilsep]\AB@affillist}{\AB@authlist\\[\affilsep] 418 | %% Removed for LiveComs; will be placed after abstract in frontmatter 419 | % \marginpar{\raggedright\footnotesize\themetadata\par} 420 | \AB@affillist}{}{} 421 | 422 | %% Added for LiveComs 423 | \RequirePackage{environ} 424 | \RequirePackage{textpos} 425 | 426 | %% Abstract outside frontmatter will throw an error! 427 | \RenewEnviron{abstract}{% 428 | \ClassError{livecoms} 429 | {Nope nope nope, please put the abstract inside the frontmatter environment.} 430 | {Please put the abstract inside the frontmatter environment.} 431 | } 432 | 433 | \NewEnviron{frontmatter}{% 434 | %% Define abstract's behavior when placed in frontmatter 435 | \renewenvironment{abstract}{% 436 | \setlength{\parindent}{0pt} %\raggedright 437 | \raisebox{-16pt-\baselineskip}[0pt][0pt]{\makebox[0pt][r]{\parbox[t]{3cm}{% 438 | \raggedright\itshape\footnotesize\@blurb\par\medskip% 439 | This version dated \@date% 440 | }\hspace*{1cm}}}% 441 | \textcolor{LiveCoMSMediumGrey}{\rule{\textwidth}{2pt}} 442 | \vskip16pt 443 | \textcolor{LiveCoMSLightBlue}{\large\bfseries\abstractname\space} 444 | }{% 445 | \vskip8pt 446 | \textcolor{LiveCoMSMediumGrey}{\rule{\textwidth}{2pt}} 447 | \vskip16pt 448 | } 449 | \twocolumn[% 450 | \protecting{%\begin{minipage}[b]{3cm} 451 | % \small\itshape 452 | % \raggedright\@blurb 453 | % \end{minipage} 454 | \hfill 455 | \begin{minipage}[b]{\textwidth-4cm} 456 | \BODY 457 | \themetadata% 458 | \end{minipage}}\vspace*{2\baselineskip} 459 | ]% 460 | } 461 | 462 | \renewcommand{\maketitle}{% 463 | \vskip36pt% 464 | {\color{LiveCoMSDarkBlue}\raggedright\bfseries\fontsize{22}{27}\selectfont \@title\par}% 465 | \vskip16pt 466 | {\@author\par} 467 | \vskip8pt 468 | } 469 | 470 | \newcommand{\makeorcid}{% 471 | % \textbf{*For correspondence:\\} \@correspondence\par 472 | % \textbf{ORCID:\\} \@correspondence\par 473 | \textbf{ORCID:\\} \@orcidblock\par 474 | } 475 | 476 | %% Insert a grey line to separate floats from main text 477 | \newcommand{\topfigrule}{\vskip8pt\noindent{\rule{\linewidth}{1pt}}} 478 | \newcommand{\botfigrule}{\noindent{\rule{\linewidth}{1pt}}\vskip8pt} 479 | 480 | \RequirePackage{newfloat} 481 | \RequirePackage{wrapfig} 482 | \AtEndEnvironment{wrapfigure}{\vskip8pt\noindent{\rule{\hsize}{1pt}}} 483 | % \RequirePackage[lflt]{floatflt} 484 | % \AtEndEnvironment{floatingfigure}{\vskip8pt\noindent\textcolor{LiveCoMSMediumGrey}{\rule{\hsize}{2pt}}} 485 | 486 | \DeclareFloatingEnvironment[placement=hbt,name=Box]{featurebox} 487 | \captionsetup[featurebox]{font={Large,bf,color=LiveCoMSDarkBlue}} 488 | 489 | \newcounter{featurefigure} 490 | \newcounter{featuretable} 491 | \AtBeginEnvironment{featurebox}{% 492 | \setcounter{featurefigure}{0}% 493 | \setcounter{featuretable}{0}% 494 | \newcommand{\featurefig}[1]{% 495 | \refstepcounter{featurefigure}% 496 | \vskip\smallskipamount% 497 | {\small\textbf{\color{LiveCoMSDarkBlue}Box \arabic{featurebox} Figure \arabic{featurefigure}.}\space #1\par}\medskip} 498 | \newcommand{\featuretable}[1]{% 499 | \refstepcounter{featuretable}% 500 | \vskip\smallskipamount% 501 | {\small\textbf{\color{LiveCoMSDarkBlue}Box \arabic{featurebox} Table \arabic{featuretable}.}\space #1\par}\medskip} 502 | 503 | } 504 | \apptocmd{\featurebox}{% 505 | \begin{mdframed}[linewidth=0pt,backgroundcolor=LiveCoMSLightBlue!10,fontcolor=LiveCoMSDarkBlue] 506 | \if@reqslineno\addtolength{\linenumbersep}{1em}\internallinenumbers\fi% 507 | }{}{} 508 | \pretocmd{\endfeaturebox}{\end{mdframed}}{}{} 509 | 510 | %% Starred version for LiveComs two-column 511 | \AtBeginEnvironment{featurebox*}{% 512 | \setcounter{featurefigure}{0}% 513 | \setcounter{featuretable}{0}% 514 | \newcommand{\featurefig}[1]{% 515 | \refstepcounter{featurefigure}% 516 | \vskip\smallskipamount% 517 | {\small\textbf{\color{LiveCoMSDarkBlue}Box \arabic{featurebox} Figure \arabic{featurefigure}.}\space #1\par}\medskip} 518 | \newcommand{\featuretable}[1]{% 519 | \refstepcounter{featuretable}% 520 | \vskip\smallskipamount% 521 | {\small\textbf{\color{LiveCoMSDarkBlue}Box \arabic{featurebox} Table \arabic{featuretable}.}\space #1\par}\medskip} 522 | } 523 | \expandafter\apptocmd\csname featurebox*\endcsname{% 524 | \begin{mdframed}[linewidth=0pt,backgroundcolor=LiveCoMSLightBlue!10,fontcolor=LiveCoMSDarkBlue] 525 | \if@reqslineno\addtolength{\linenumbersep}{1em}\internallinenumbers\fi% 526 | }{}{} 527 | \expandafter\pretocmd\csname endfeaturebox*\endcsname{\end{mdframed}}{}{} 528 | 529 | %% Unnecessary for LiveComs 530 | % \newenvironment{fullwidth}{% 531 | % \begin{adjustwidth}{-4.5cm}{} 532 | % }{\end{adjustwidth}} 533 | 534 | %% Provide support for pseudocode and algorithms 535 | \RequirePackage{algorithm,algpseudocode} 536 | \captionsetup[algorithm]{% 537 | labelfont={bf},font=small,labelsep=period, 538 | justification=raggedright,singlelinecheck=false} 539 | \newcommand\fs@notopruled{\def\@fs@cfont{\bfseries}\let\@fs@capt\floatc@ruled 540 | \def\@fs@pre{}% \hrule height.8pt depth0pt \kern2pt}% 541 | \def\@fs@post{} %\kern2pt\hrule\relax}% 542 | \def\@fs@mid{\medskip\kern2pt\hrule\kern2pt}% 543 | \let\@fs@iftopcapt\iftrue} 544 | \floatstyle{notopruled} 545 | \restylefloat{algorithm} 546 | \newcommand{\algorithmautorefname}{Algorithm} 547 | \newcommand{\ALG}[1]{\autoref{alg:#1}} 548 | 549 | %% Update some appendix sectional styles 550 | \appto{\appendix}{% 551 | \@addtoreset{figure}{section} 552 | \@addtoreset{table}{section} 553 | \@addtoreset{featurebox}{section} 554 | \@addtoreset{algorithm}{section} 555 | % \numberwithin{figure}{section} 556 | % \numberwithin{table}{section} 557 | % \numberwithin{featurebox}{section} 558 | \titleformat{\section} 559 | {\LARGE\bfseries\color{LiveCoMSDarkBlue}} 560 | {\appendixname\ \thesection}{1em}{#1}[] 561 | 562 | \captionsetup*[figure]{name={Appendix \thesection\ Figure },font={color=LiveCoMSDarkBlue,small},skip=\smallskipamount}% 563 | 564 | \captionsetup*[table]{name={Appendix \thesection\ Table },font={color=LiveCoMSDarkBlue,small}}% 565 | } 566 | 567 | \newcounter{figsupp} 568 | \setcounter{figsupp}{0} 569 | \newcounter{data} 570 | \setcounter{data}{0} 571 | \def\supplist{} 572 | 573 | \RequirePackage{newfile} 574 | \newoutputstream{suppinfo} 575 | \openoutputfile{\jobname.suppinfo}{suppinfo} 576 | 577 | 578 | \AtBeginEnvironment{figure}{% 579 | \setcounter{figsupp}{0} 580 | \setcounter{data}{0} 581 | %% Updated 2017/06/30 to allow optional argument 582 | \newcommand{\figsupp}[3][]{% 583 | \refstepcounter{figsupp}% 584 | {% 585 | \ifstrequal{#1}{none}{}{% 586 | \small\textbf{Figure~\thefigure--Figure supplement \arabic{figsupp}.} \ifstrempty{#1}{#2}{#1}}\par} 587 | \addtostream{suppinfo}{% 588 | \noindent\protect\begin{minipage}{\linewidth} 589 | \protect #3\noexpand\par 590 | \textbf{Figure \thefigure--Figure supplement \arabic{figsupp}.} #2\noexpand\par 591 | \vskip8pt 592 | \protect\end{minipage} 593 | \vskip16pt 594 | } 595 | } 596 | \newcommand{\figdata}[1]{% 597 | \refstepcounter{data} 598 | {\small\textbf{Figure~\thefigure--source data \arabic{data}.} #1}\par 599 | } 600 | } 601 | 602 | %% Added for LiveComs (two columns) 603 | \AtBeginEnvironment{figure*}{% 604 | \setcounter{figsupp}{0} 605 | \setcounter{data}{0} 606 | %% Updated 2017/06/30 to allow optional argument 607 | \newcommand{\figsupp}[3][]{% 608 | \refstepcounter{figsupp}% 609 | {% 610 | \ifstrequal{#1}{none}{}{% 611 | \small\textbf{Figure~\thefigure--Figure supplement \arabic{figsupp}.} \ifstrempty{#1}{#2}{#1}}\par} 612 | \addtostream{suppinfo}{% 613 | \noindent\protect\begin{minipage}{\linewidth} 614 | \protect #3\noexpand\par 615 | \textbf{Figure \thefigure--Figure supplement \arabic{figsupp}.} #2\noexpand\par 616 | \vskip8pt 617 | \protect\end{minipage} 618 | \vskip16pt 619 | } 620 | } 621 | \newcommand{\figdata}[1]{% 622 | \refstepcounter{data} 623 | {\small\textbf{Figure~\thefigure--source data \arabic{data}.} #1}\par 624 | } 625 | } 626 | 627 | \AtBeginEnvironment{table}{% 628 | \setcounter{data}{0} 629 | \newcommand{\tabledata}[1]{% 630 | \refstepcounter{data} 631 | {\small\textbf{Table~\thetable--source data \arabic{data}.} #1}\par 632 | } 633 | } 634 | 635 | %% Added for LiveComs (twocolumns) 636 | \AtBeginEnvironment{table*}{% 637 | \setcounter{data}{0} 638 | \newcommand{\tabledata}[1]{% 639 | \refstepcounter{data} 640 | {\small\textbf{Table~\thetable--source data \arabic{data}.} #1}\par 641 | } 642 | } 643 | 644 | %% Checklists as floats 645 | \RequirePackage{fontawesome} 646 | \DeclareFloatingEnvironment[placement=hbtp,name=Checklists]{Checklists} 647 | \newcounter{checklist} 648 | \AtBeginEnvironment{Checklists}{% 649 | \setcounter{checklist}{0} 650 | \mdfsetup{skipabove=0pt,skipbelow=0pt, 651 | frametitleaboveskip=12pt,innerbottommargin=12pt, 652 | hidealllines=true, 653 | frametitlefont=\Large\bfseries\color{LiveCoMSLightBlue}} 654 | }{}{} 655 | 656 | \AtBeginEnvironment{Checklists*}{% 657 | \setcounter{checklist}{0} 658 | \mdfsetup{skipabove=0pt,skipbelow=0pt, 659 | frametitleaboveskip=12pt,innerbottommargin=12pt, 660 | hidealllines=true, 661 | frametitlefont=\Large\bfseries\color{LiveCoMSLightBlue}} 662 | }{}{} 663 | 664 | \newenvironment{checklist}[1]{% 665 | \stepcounter{checklist} 666 | \ifnumodd{\thechecklist} 667 | {\def\cl@bgcolor{gray!12}} 668 | {\def\cl@bgcolor{gray!25}} 669 | \begin{mdframed}[ 670 | frametitle=\MakeUppercase{#1}, 671 | backgroundcolor=\cl@bgcolor] 672 | \setlist[itemize]{label=$\Box$,leftmargin=*} 673 | }{\end{mdframed}} 674 | 675 | \AtEndDocument{% 676 | \closeoutputstream{suppinfo} 677 | % \pagestyle{empty} 678 | \renewcommand{\footrule}{} 679 | \rfoot{} 680 | \input{\jobname.suppinfo} 681 | } 682 | 683 | %% Use more traditional Appendix section approach 684 | % \newcounter{appendix} 685 | % \setcounter{appendix}{0} 686 | % \newenvironment{appendixbox}{% 687 | % \setcounter{figure}{0} 688 | % \setcounter{table}{0} 689 | % \refstepcounter{appendix}% 690 | % \clearpage% 691 | % \patchcmd{\ttlf@section}{LiveCoMSMediumGrey}{LiveCoMSDarkBlue}{}{} 692 | % \noindent{\bfseries\Large\color{LiveCoMSMediumGrey}Appendix \arabic{appendix}\par} 693 | % \nolinenumbers% 694 | % %% Remove box colours for LiveComs 695 | % \begin{mdframed}[hidealllines=true, 696 | % % backgroundcolor=LiveCoMSLightBlue!10, 697 | % fontcolor=LiveCoMSDarkBlue, 698 | % % leftline=true,linecolor=LiveCoMSLightBlue,linewidth=1em 699 | % ] 700 | % \if@reqslineno\addtolength{\linenumbersep}{2em}\internallinenumbers\fi 701 | % }{% 702 | % \end{mdframed} 703 | % } 704 | 705 | \RequirePackage[colorlinks=true,allcolors=black,citecolor=LiveCoMSLightBlue,linkcolor=LiveCoMSMediumGrey,urlcolor=LiveCoMSLightBlue]{hyperref} 706 | \urlstyle{sf} 707 | 708 | % Other desired commands 709 | \renewcommand{\equationautorefname}{Eq.} 710 | \newcommand{\FIG}[1]{\autoref{fig:#1}} 711 | \newcommand{\TABLE}[1]{\autoref{tab:#1}} 712 | \newcommand{\EQ}[1]{\autoref{eq:#1}} 713 | \newcommand{\BOX}[1]{\autoref{box:#1}} 714 | \let\oldautoref\autoref 715 | \renewcommand{\autoref}[1]{\emph{\textbf{\oldautoref{#1}}}} 716 | 717 | \endinput 718 | -------------------------------------------------------------------------------- /releases/LiveCoMS_Article_v1.0.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jhenin/Methods-for-enhanced-sampling-and-free-energy-calculations/8a61ca08b4a34455d6a89669feed5617afe28c5b/releases/LiveCoMS_Article_v1.0.pdf -------------------------------------------------------------------------------- /releases/header_v1.0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jhenin/Methods-for-enhanced-sampling-and-free-energy-calculations/8a61ca08b4a34455d6a89669feed5617afe28c5b/releases/header_v1.0.jpg -------------------------------------------------------------------------------- /review.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jhenin/Methods-for-enhanced-sampling-and-free-energy-calculations/8a61ca08b4a34455d6a89669feed5617afe28c5b/review.pdf -------------------------------------------------------------------------------- /vancouver-livecoms.bst: -------------------------------------------------------------------------------- 1 | %% livecoms.bst (v 1.2, 6 July 2017) is modified 2 | %% adapted from vancouver-elife from LianTze Lim (Overleaf) 3 | %% adapted from from the 4 | %% natbib-compatible BibTeX bibliography style `vancouver-authoryear' at https://github.com/gbhutani/vancouver_authoryear_bibstyle/ 5 | %% 6 | %% Use 7 | %% 8 | %% \usepackage{natbib} 9 | %% \bibliographystyle{vancouver-compatible} 10 | %% 11 | %% and cite references with (e.g.) 12 | %% 13 | %% \cite{smith77} % to get a "[1]" in the text 14 | %% \citep{smith77} % to get a "[1]" in the text 15 | %% \citet{smith77} % to get a "Smith [1]" in the text 16 | %% \citeauthor{smith77} % to get a "Smith" in the text 17 | %% 18 | %% The changes below are inspired by similar changes made to 19 | %% splncs03.bst by Maurizio "Titto" Patrignani of 20 | %% Dipartimento di Informatica e Automazione Universita' Roma Tre. 21 | %% Unfortunately, splncs03.bst was not compatible with natbib (because it 22 | %% was not built with author-year capability). 23 | %% 24 | %% This is derived from `splncsnat.bst', 25 | %--------------------------------------------------------------------- 26 | 27 | ENTRY 28 | { address 29 | assignee % for patents 30 | author 31 | booktitle % for articles in books 32 | chapter % for incollection, esp. internet documents 33 | cartographer % for maps 34 | day 35 | edition 36 | editor 37 | eid 38 | howpublished 39 | institution % for technical reports 40 | inventor % for patents 41 | journal 42 | key 43 | month 44 | note 45 | number 46 | organization 47 | pages 48 | part 49 | publisher 50 | school 51 | series 52 | title 53 | type 54 | url 55 | doi 56 | volume 57 | word 58 | year 59 | } 60 | {} 61 | { label extra.label sort.label short.list } 62 | INTEGERS { output.state before.all mid.sentence after.sentence after.block } 63 | FUNCTION {init.state.consts} 64 | { #0 'before.all := 65 | #1 'mid.sentence := 66 | #2 'after.sentence := 67 | #3 'after.block := 68 | } 69 | %% Declaration of string variables 70 | STRINGS { s t} 71 | FUNCTION {output.nonnull} 72 | { 's := 73 | output.state mid.sentence = 74 | { ", " * write$ } 75 | { output.state after.block = 76 | { add.period$ write$ 77 | newline$ 78 | "\newblock " write$ 79 | } 80 | { output.state before.all = 81 | 'write$ 82 | { " " * write$ } 83 | if$ 84 | } 85 | if$ 86 | mid.sentence 'output.state := 87 | } 88 | if$ 89 | s 90 | } 91 | FUNCTION {output} 92 | { duplicate$ empty$ 93 | 'pop$ 94 | 'output.nonnull 95 | if$ 96 | } 97 | 98 | FUNCTION {output.check} 99 | { 't := 100 | duplicate$ empty$ 101 | { pop$ "empty " t * " in " * cite$ * warning$ } 102 | 'output.nonnull 103 | if$ 104 | } 105 | 106 | %FUNCTION {fin.entry} 107 | %{ duplicate$ empty$ 108 | % 'pop$ 109 | % 'write$ 110 | % if$ 111 | % newline$ 112 | %} 113 | % 114 | FUNCTION {fin.entry} 115 | { add.period$ 116 | write$ 117 | newline$ 118 | } 119 | 120 | FUNCTION {new.block} 121 | { output.state before.all = 122 | 'skip$ 123 | { after.block 'output.state := } 124 | if$ 125 | } 126 | 127 | FUNCTION {new.sentence} 128 | { output.state after.block = 129 | 'skip$ 130 | { output.state before.all = 131 | 'skip$ 132 | { after.sentence 'output.state := } 133 | if$ 134 | } 135 | if$ 136 | } 137 | 138 | FUNCTION {add.blank} 139 | { " " * before.all 'output.state := 140 | } 141 | 142 | FUNCTION {no.blank.or.punct} 143 | { "" * before.all 'output.state := 144 | } 145 | 146 | FUNCTION {add.semicolon} 147 | { 148 | ";" * 149 | % no.blank.or.punct 150 | } 151 | 152 | FUNCTION {date.block} 153 | { 154 | "." * 155 | no.blank.or.punct 156 | } 157 | 158 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 159 | % LOGICAL `NOT', `AND', AND `OR' % 160 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 161 | 162 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 163 | % Logical 'not': 164 | % If the first element on the stack is A then this function 165 | % does the following: 166 | % push { #0 } 167 | % push { #1 } 168 | % So now the first 3 elements of the stack are 169 | % { #1 } { #0 } A 170 | % The first 3 are popped and subjected to 'if': 171 | % If A > 0 then { #0 } is executed, else { #1 } is executed: 172 | % if A > 0 173 | % then 0 174 | % else 1 175 | % So consider integers as logicals, where 1 = true and 0 = false, 176 | % then this does 177 | % (if A then false else true) 178 | % which is a logical 'not'. 179 | 180 | FUNCTION {not} 181 | { { #0 } 182 | { #1 } 183 | if$ 184 | } 185 | FUNCTION {and} 186 | { 'skip$ 187 | { pop$ #0 } 188 | if$ 189 | } 190 | FUNCTION {or} 191 | { { pop$ #1 } 192 | 'skip$ 193 | if$ 194 | } 195 | 196 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 197 | % GENERAL PURPOSE FUNCTIONS FOR FORMATTING % 198 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 199 | 200 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 201 | % issues warning if field is empty 202 | % call with 203 | % "field" field warning.if.empty 204 | % Note that the first field must be between quotes 205 | % because it is the fieldname for use in the warning message. 206 | % 207 | 208 | FUNCTION {warning.if.empty} 209 | { empty$ 210 | { "No " swap$ * " in " * cite$ * warning$ } 211 | { pop$ } 212 | if$ 213 | } 214 | 215 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 216 | % 217 | % encloses string in pre- and postfix string 218 | % call with 219 | % prefix postfix S enclose.check 220 | % delivers empty string if S empty 221 | % 222 | FUNCTION {enclose.check} 223 | { duplicate$ empty$ 224 | { pop$ pop$ pop$ 225 | "" 226 | } 227 | { swap$ * * } 228 | if$ 229 | } 230 | 231 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 232 | % 233 | % emphasizes top of stack 234 | % call with 235 | % string" emphasize.check 236 | % 237 | 238 | FUNCTION {emphasize.check} 239 | { "\Bem{" swap$ 240 | "}" swap$ 241 | enclose.check 242 | } 243 | 244 | 245 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 246 | % 247 | % brackets top of stack 248 | % call with 249 | % "string" bracket.check 250 | % 251 | FUNCTION {bracket.check} 252 | { "[" swap$ 253 | "]" swap$ 254 | enclose.check 255 | } 256 | 257 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 258 | % 259 | % parenthesizes top of stack 260 | % call with 261 | % "string" parenthesize 262 | % 263 | FUNCTION {parenthesize.check} 264 | { "(" swap$ 265 | ")" swap$ 266 | enclose.check 267 | } 268 | 269 | STRINGS {z} 270 | 271 | FUNCTION {remove.dots} 272 | { 'z := % expects string on top of the stack, pops the string and assigns it to variable z 273 | "" % push empty string 274 | { z empty$ not } % returns 0 if variable z is empty 275 | { z #1 #1 substring$ % push the first character of variable z 276 | z #2 global.max$ substring$ 'z := % assigns the 2nd to last character of variable z to variable z 277 | duplicate$ "\" = % pushes 1 if the last character is "\", otherwise 0 278 | { * % concatenates the last 2 literals 279 | z #1 #1 substring$ % push the first character of variable z 280 | z #2 global.max$ substring$ 'z := % assigns the 2nd to last character of variable z to variable z 281 | * % concatenates the last 2 literals, i.e. every character, even a dot, following a "\" will be printed 282 | } 283 | { duplicate$ "." = % pushes 1 if the last character is ".", otherwise 0 284 | 'pop$ % pushes the pop$ function 285 | { * } % concatenates the last 2 literals 286 | if$ % pops the last character if it is a dot, otherwise concatenates it with the string on top of the stack 287 | } 288 | if$ 289 | } 290 | while$ 291 | } 292 | 293 | INTEGERS {l} 294 | FUNCTION{string.length} 295 | { 296 | #1 'l := 297 | { duplicate$ duplicate$ #1 l substring$ = not } 298 | { l #1 + 'l := } 299 | while$ 300 | pop$ l 301 | } 302 | 303 | STRINGS {replace find text} 304 | INTEGERS {find_length} 305 | FUNCTION {find.replace} 306 | { 307 | 'replace := 308 | 'find := 309 | 'text := 310 | find string.length 'find_length := 311 | "" 312 | { text empty$ not } 313 | { text #1 find_length substring$ find = 314 | { 315 | replace * 316 | text #1 find_length + global.max$ substring$ 'text := 317 | } 318 | { text #1 #1 substring$ * 319 | text #2 global.max$ substring$ 'text := 320 | } 321 | if$ 322 | } 323 | while$ 324 | } 325 | 326 | FUNCTION {new.block.checka} 327 | { empty$ 328 | 'skip$ 329 | 'new.block 330 | if$ 331 | } 332 | 333 | FUNCTION {new.block.checkb} 334 | { empty$ 335 | swap$ empty$ 336 | and 337 | 'skip$ 338 | 'new.block 339 | if$ 340 | } 341 | 342 | FUNCTION {new.sentence.checka} 343 | { empty$ 344 | 'skip$ 345 | 'new.sentence 346 | if$ 347 | } 348 | 349 | FUNCTION {new.sentence.checkb} 350 | { empty$ 351 | swap$ empty$ 352 | and 353 | 'skip$ 354 | 'new.sentence 355 | if$ 356 | } 357 | 358 | FUNCTION {field.or.null} 359 | { duplicate$ empty$ 360 | { pop$ "" } 361 | 'skip$ 362 | if$ 363 | } 364 | 365 | FUNCTION {emphasize} 366 | { skip$ } 367 | 368 | FUNCTION {tie.or.space.prefix} 369 | { duplicate$ text.length$ #3 < 370 | { "~" } 371 | { " " } 372 | if$ 373 | swap$ 374 | } 375 | 376 | FUNCTION {capitalize} 377 | { "u" change.case$ "t" change.case$ } 378 | 379 | FUNCTION {space.word} 380 | { " " swap$ * " " * } 381 | 382 | % Here are the language-specific definitions for explicit words. 383 | % Each function has a name bbl.xxx where xxx is the English word. 384 | % The language selected here is ENGLISH 385 | 386 | FUNCTION {bbl.and} 387 | { "and"} 388 | 389 | FUNCTION {bbl.etal} 390 | { "et~al." } 391 | 392 | FUNCTION {bbl.editors} 393 | { "editors" } 394 | 395 | FUNCTION {bbl.editor} 396 | { "editor" } 397 | 398 | FUNCTION {bbl.cartographers} 399 | { "cartographers" } 400 | 401 | FUNCTION {bbl.cartographer} 402 | { "cartographer" } 403 | 404 | FUNCTION {bbl.inventors} 405 | { "inventors" } 406 | 407 | FUNCTION {bbl.inventor} 408 | { "inventor" } 409 | 410 | FUNCTION {bbl.assignees} 411 | { "assignees" } 412 | 413 | FUNCTION {bbl.assignee} 414 | { "assignee" } 415 | 416 | FUNCTION {bbl.edby} 417 | { "edited by" } 418 | 419 | FUNCTION {bbl.edition} 420 | { "ed." } 421 | 422 | FUNCTION {bbl.volume} 423 | { "vol." } 424 | 425 | FUNCTION {bbl.of} 426 | { "of" } 427 | 428 | FUNCTION {bbl.number} 429 | { "no." } 430 | 431 | FUNCTION {bbl.nr} 432 | { "no." } 433 | 434 | FUNCTION {bbl.in} 435 | { "in" } 436 | 437 | FUNCTION {bbl.pages} 438 | { "p." } 439 | 440 | FUNCTION {bbl.page} 441 | { "p." } 442 | 443 | FUNCTION {bbl.chapter} 444 | { "chap." } 445 | 446 | FUNCTION {bbl.techrep} 447 | { "Tech. Rep." } 448 | 449 | FUNCTION {bbl.mthesis} 450 | { "Master's thesis" } 451 | 452 | FUNCTION {bbl.phdthesis} 453 | { "Ph.D. thesis" } 454 | 455 | FUNCTION {bbl.first} 456 | { "1st" } 457 | 458 | FUNCTION {bbl.second} 459 | { "2nd" } 460 | 461 | FUNCTION {bbl.third} 462 | { "3rd" } 463 | 464 | FUNCTION {bbl.fourth} 465 | { "4th" } 466 | 467 | FUNCTION {bbl.fifth} 468 | { "5th" } 469 | 470 | FUNCTION {bbl.st} 471 | { "st" } 472 | 473 | FUNCTION {bbl.nd} 474 | { "nd" } 475 | 476 | FUNCTION {bbl.rd} 477 | { "rd" } 478 | 479 | FUNCTION {bbl.th} 480 | { "th" } 481 | 482 | MACRO {jan} {"Jan."} 483 | 484 | MACRO {feb} {"Feb."} 485 | 486 | MACRO {mar} {"Mar."} 487 | 488 | MACRO {apr} {"Apr."} 489 | 490 | MACRO {may} {"May"} 491 | 492 | MACRO {jun} {"Jun."} 493 | 494 | MACRO {jul} {"Jul."} 495 | 496 | MACRO {aug} {"Aug."} 497 | 498 | MACRO {sep} {"Sep."} 499 | 500 | MACRO {oct} {"Oct."} 501 | 502 | MACRO {nov} {"Nov."} 503 | 504 | MACRO {dec} {"Dec."} 505 | 506 | MACRO {acmcs} {"ACM Comput. Surv."} 507 | 508 | MACRO {acta} {"Acta Inf."} 509 | 510 | MACRO {cacm} {"Commun. ACM"} 511 | 512 | MACRO {ibmjrd} {"IBM J. Res. Dev."} 513 | 514 | MACRO {ibmsj} {"IBM Syst.~J."} 515 | 516 | MACRO {ieeese} {"IEEE Trans. Software Eng."} 517 | 518 | MACRO {ieeetc} {"IEEE Trans. Comput."} 519 | 520 | MACRO {ieeetcad} 521 | {"IEEE Trans. Comput. Aid. Des."} 522 | 523 | MACRO {ipl} {"Inf. Process. Lett."} 524 | 525 | MACRO {jacm} {"J.~ACM"} 526 | 527 | MACRO {jcss} {"J.~Comput. Syst. Sci."} 528 | 529 | MACRO {scp} {"Sci. Comput. Program."} 530 | 531 | MACRO {sicomp} {"SIAM J. Comput."} 532 | 533 | MACRO {tocs} {"ACM Trans. Comput. Syst."} 534 | 535 | MACRO {tods} {"ACM Trans. Database Syst."} 536 | 537 | MACRO {tog} {"ACM Trans. Graphic."} 538 | 539 | MACRO {toms} {"ACM Trans. Math. Software"} 540 | 541 | MACRO {toois} {"ACM Trans. Office Inf. Syst."} 542 | 543 | MACRO {toplas} {"ACM Trans. Progr. Lang. Syst."} 544 | 545 | MACRO {tcs} {"Theor. Comput. Sci."} 546 | 547 | FUNCTION {eng.ord} 548 | { duplicate$ "1" swap$ * 549 | #-2 #1 substring$ "1" = 550 | { bbl.th * } 551 | { duplicate$ #-1 #1 substring$ 552 | duplicate$ "1" = 553 | { pop$ bbl.st * } 554 | { duplicate$ "2" = 555 | { pop$ bbl.nd * } 556 | { "3" = 557 | { bbl.rd * } 558 | { bbl.th * } 559 | if$ 560 | } 561 | if$ 562 | } 563 | if$ 564 | } 565 | if$ 566 | } 567 | 568 | FUNCTION {bibinfo.check} 569 | { swap$ 570 | duplicate$ missing$ 571 | { 572 | pop$ pop$ 573 | "" 574 | } 575 | { duplicate$ empty$ 576 | { 577 | swap$ pop$ 578 | } 579 | { swap$ 580 | pop$ 581 | } 582 | if$ 583 | } 584 | if$ 585 | } 586 | 587 | FUNCTION {bibinfo.warn} 588 | { swap$ 589 | duplicate$ missing$ 590 | { 591 | swap$ "missing " swap$ * " in " * cite$ * warning$ pop$ 592 | "" 593 | } 594 | { duplicate$ empty$ 595 | { 596 | swap$ "empty " swap$ * " in " * cite$ * warning$ 597 | } 598 | { swap$ 599 | pop$ 600 | } 601 | if$ 602 | } 603 | if$ 604 | } 605 | INTEGERS { nameptr namesleft numnames } 606 | 607 | 608 | STRINGS { bibinfo} 609 | 610 | FUNCTION {format.names} 611 | { 'bibinfo := 612 | duplicate$ empty$ 'skip$ { 613 | "." ". " find.replace 's := 614 | "" 't := 615 | #1 'nameptr := 616 | s num.names$ 'numnames := 617 | numnames 'namesleft := 618 | { namesleft #0 > } 619 | { s nameptr 620 | "{vv~}{ll}{ f{}}{ jj}" 621 | format.name$ 622 | remove.dots 623 | bibinfo bibinfo.check 624 | 't := 625 | nameptr #1 > 626 | { 627 | nameptr #20 628 | #1 + = 629 | numnames #20 630 | > and 631 | { "others" 't := 632 | #1 'namesleft := } 633 | 'skip$ 634 | if$ 635 | namesleft #1 > 636 | { ", " * t * } 637 | { 638 | "," * 639 | s nameptr "{ll}" format.name$ duplicate$ "others" = 640 | { 't := } 641 | { pop$ } 642 | if$ 643 | t "others" = 644 | { 645 | " " * bbl.etal * 646 | } 647 | { " " * t * } 648 | if$ 649 | } 650 | if$ 651 | } 652 | 't 653 | if$ 654 | nameptr #1 + 'nameptr := 655 | namesleft #1 - 'namesleft := 656 | } 657 | while$ 658 | } if$ 659 | } 660 | 661 | FUNCTION {format.names.auth} 662 | { 'bibinfo := 663 | duplicate$ empty$ 'skip$ { 664 | "." ". " find.replace 's := 665 | "" 't := 666 | #1 'nameptr := 667 | s num.names$ 'numnames := 668 | numnames 'namesleft := 669 | { namesleft #0 > } 670 | { s nameptr 671 | "{vv~}{ll}{ f{}}{ jj}" 672 | %% Highlight first author for LiveCoMS 673 | nameptr #1 = 674 | {format.name$ "\textbf{\color{LiveCoMSMediumGrey} " swap$ * "}" * } 675 | {format.name$ } 676 | if$ 677 | remove.dots 678 | bibinfo bibinfo.check 679 | 't := 680 | nameptr #1 > 681 | { 682 | nameptr #20 683 | #1 + = 684 | numnames #20 685 | > and 686 | { "others" 't := 687 | #1 'namesleft := } 688 | 'skip$ 689 | if$ 690 | namesleft #1 > 691 | { ", " * t * } 692 | { 693 | "," * 694 | s nameptr "{ll}" format.name$ duplicate$ "others" = 695 | { 't := } 696 | { pop$ } 697 | if$ 698 | t "others" = 699 | { 700 | " " * bbl.etal * 701 | } 702 | { " " * t * } 703 | if$ 704 | } 705 | if$ 706 | } 707 | 't 708 | if$ 709 | nameptr #1 + 'nameptr := 710 | namesleft #1 - 'namesleft := 711 | } 712 | while$ 713 | } if$ 714 | } 715 | 716 | FUNCTION {format.names.org.original} 717 | { 'bibinfo := 718 | duplicate$ empty$ 'skip$ { 719 | 's := 720 | "" 't := 721 | #1 'nameptr := 722 | s num.names$ 'numnames := 723 | numnames 'namesleft := 724 | { namesleft #0 > } 725 | { s nameptr 726 | "{ff~}{vv~}{ll}" 727 | format.name$ 728 | bibinfo bibinfo.check 729 | 't := 730 | nameptr #1 > 731 | { 732 | namesleft #1 > 733 | { "; " * t * } 734 | { 735 | ";" * 736 | s nameptr "{ll}" format.name$ duplicate$ "others" = 737 | { 't := } 738 | { pop$ } 739 | if$ 740 | t "others" = 741 | { 742 | " " * bbl.etal * 743 | } 744 | { " " * t * } 745 | if$ 746 | } 747 | if$ 748 | } 749 | 't 750 | if$ 751 | nameptr #1 + 'nameptr := 752 | namesleft #1 - 'namesleft := 753 | } 754 | while$ 755 | } if$ 756 | } 757 | 758 | FUNCTION {format.names.org} 759 | { 'bibinfo := 760 | duplicate$ empty$ 'skip$ { 761 | 's := 762 | "" 't := 763 | #1 'nameptr := 764 | s num.names$ 'numnames := 765 | numnames 'namesleft := 766 | { namesleft #0 > } 767 | { s nameptr 768 | "{ff~}{vv~}{ll}" 769 | nameptr #1 = 770 | {format.name$ "\textbf{\color{LiveCoMSMediumGrey} " swap$ * "}" * } 771 | {format.name$} 772 | if$ 773 | bibinfo bibinfo.check 774 | 't := 775 | nameptr #1 > 776 | { 777 | namesleft #1 > 778 | { "; " * t * } 779 | { 780 | ";" * 781 | s nameptr "{ll}" format.name$ duplicate$ "others" = 782 | { 't := } 783 | { pop$ } 784 | if$ 785 | t "others" = 786 | { 787 | " " * bbl.etal * 788 | } 789 | { " " * t * } 790 | if$ 791 | } 792 | if$ 793 | } 794 | 't 795 | if$ 796 | nameptr #1 + 'nameptr := 797 | namesleft #1 - 'namesleft := 798 | } 799 | while$ 800 | } if$ 801 | } 802 | 803 | FUNCTION {format.names.ed} 804 | { 805 | format.names 806 | } 807 | 808 | FUNCTION {format.key} 809 | { empty$ 810 | { key field.or.null } 811 | { "" } 812 | if$ 813 | } 814 | 815 | FUNCTION {format.authors} 816 | { 817 | author "author" format.names.auth 818 | %%"." " " "author" find.replace format.names 819 | } 820 | 821 | FUNCTION {format.organizations} 822 | { organization "organization" format.names.org 823 | } 824 | 825 | FUNCTION {get.bbl.editor} 826 | { editor num.names$ #1 > 'bbl.editors 'bbl.editor if$ } 827 | 828 | FUNCTION {get.bbl.cartographer} 829 | { cartographer num.names$ #1 > 'bbl.cartographers 'bbl.cartographer if$ } 830 | 831 | FUNCTION {get.bbl.inventor} 832 | { inventor num.names$ #1 > 'bbl.inventors 'bbl.inventor if$ } 833 | 834 | FUNCTION {get.bbl.assignee} 835 | { assignee num.names$ #1 > 'bbl.assignees 'bbl.assignee if$ } 836 | 837 | FUNCTION {format.editors} 838 | { editor "editor" format.names.auth duplicate$ empty$ 'skip$ 839 | { 840 | "," * 841 | " " * 842 | get.bbl.editor 843 | * 844 | } 845 | if$ 846 | } 847 | 848 | FUNCTION {format.assignees} 849 | { assignee "assignee" format.names.org duplicate$ empty$ 'skip$ 850 | { 851 | "," * 852 | " " * 853 | get.bbl.assignee 854 | * 855 | } 856 | if$ 857 | } 858 | 859 | FUNCTION {format.cartographers} 860 | { cartographer "cartographer" format.names duplicate$ empty$ 'skip$ 861 | { 862 | "," * 863 | " " * 864 | get.bbl.cartographer 865 | * 866 | } 867 | if$ 868 | } 869 | 870 | FUNCTION {format.inventors} 871 | { inventor "inventor" format.names duplicate$ empty$ 'skip$ 872 | { 873 | "," * 874 | " " * 875 | get.bbl.inventor 876 | * 877 | } 878 | if$ 879 | } 880 | 881 | FUNCTION {format.note} 882 | { 883 | %%url empty$ 884 | %% 'skip$ 885 | %% { "\urlprefix\url{" url * "}" * output } 886 | %%if$ 887 | doi empty$ 888 | {url empty$ 889 | 'skip$ 890 | { "\urlprefix\url{" url * "}" * output } 891 | if$} 892 | { "\href{https://doi.org/" doi * "}{\doiprefix \detokenize{" * doi * "}}" * output } 893 | if$ 894 | note empty$ 895 | { "" } 896 | { note #1 #1 substring$ 897 | duplicate$ "{" = 898 | 'skip$ 899 | { output.state mid.sentence = 900 | { "l" } 901 | { "u" } 902 | if$ 903 | change.case$ 904 | } 905 | if$ 906 | note #2 global.max$ substring$ * "note" bibinfo.check 907 | } 908 | if$ 909 | } 910 | 911 | FUNCTION {format.title} 912 | { title 913 | %%duplicate$ empty$ 'skip$ 914 | %% { "t" change.case$ } 915 | %%if$ 916 | "title" bibinfo.check 917 | } 918 | 919 | 920 | FUNCTION {author.editor.key.full} 921 | { author empty$ 922 | { editor empty$ 923 | { key empty$ 924 | { cite$ #1 #3 substring$ } 925 | 'key 926 | if$ 927 | } 928 | { editor } 929 | if$ 930 | } 931 | { author } 932 | if$ 933 | } 934 | 935 | FUNCTION {author.key.full} 936 | { author empty$ 937 | { key empty$ 938 | { cite$ #1 #3 substring$ } 939 | 'key 940 | if$ 941 | } 942 | { author } 943 | if$ 944 | } 945 | 946 | FUNCTION {editor.key.full} 947 | { editor empty$ 948 | { key empty$ 949 | { cite$ #1 #3 substring$ } 950 | 'key 951 | if$ 952 | } 953 | { editor } 954 | if$ 955 | } 956 | 957 | FUNCTION {make.full.names} 958 | { type$ "book" = 959 | type$ "inbook" = 960 | or 961 | 'author.editor.key.full 962 | { type$ "proceedings" = 963 | 'editor.key.full 964 | 'author.key.full 965 | if$ 966 | } 967 | if$ 968 | } 969 | 970 | FUNCTION {output.bibitem} 971 | { newline$ 972 | "\bibitem[{" write$ 973 | label write$ 974 | ")" make.full.names duplicate$ short.list = 975 | { pop$ } 976 | { * } 977 | if$ 978 | "}]{" * write$ 979 | cite$ write$ 980 | "}" write$ 981 | newline$ 982 | "" 983 | before.all 'output.state := 984 | } 985 | 986 | FUNCTION {n.dashify} 987 | { 988 | 't := 989 | "" 990 | { t empty$ not } 991 | { t #1 #1 substring$ "-" = 992 | { t #1 #2 substring$ "--" = not 993 | { "--" * 994 | t #2 global.max$ substring$ 't := 995 | } 996 | { { t #1 #1 substring$ "-" = } 997 | { "-" * 998 | t #2 global.max$ substring$ 't := 999 | } 1000 | while$ 1001 | } 1002 | if$ 1003 | } 1004 | { t #1 #1 substring$ * 1005 | t #2 global.max$ substring$ 't := 1006 | } 1007 | if$ 1008 | } 1009 | while$ 1010 | } 1011 | 1012 | FUNCTION {word.in} 1013 | { bbl.in capitalize 1014 | ":" * 1015 | " " * } 1016 | 1017 | FUNCTION {format.journal.date} 1018 | { 1019 | %month "month" bibinfo.check %% removed to suppress month 1020 | no.blank.or.punct %% added to achieve proper ordering (journal name. Year ; ...) 1021 | "" 1022 | duplicate$ empty$ 1023 | year "year" bibinfo.check duplicate$ empty$ 1024 | { 1025 | swap$ 'skip$ 1026 | { "there's a month but no year in " cite$ * warning$ } 1027 | if$ 1028 | * 1029 | } 1030 | { swap$ 'skip$ 1031 | { 1032 | " " * swap$ 1033 | } 1034 | if$ 1035 | * 1036 | remove.dots 1037 | } 1038 | if$ 1039 | duplicate$ empty$ 1040 | 'skip$ 1041 | { 1042 | before.all 'output.state := 1043 | after.sentence 'output.state := 1044 | } 1045 | if$ 1046 | } 1047 | 1048 | FUNCTION {format.date} 1049 | { 1050 | no.blank.or.punct 1051 | ";" 1052 | duplicate$ empty$ 1053 | year "year" bibinfo.check duplicate$ empty$ 1054 | { swap$ 'skip$ 1055 | { "there's a month but no year in " cite$ * warning$ } 1056 | if$ 1057 | * 1058 | } 1059 | { swap$ 'skip$ 1060 | { 1061 | swap$ 1062 | " " * swap$ 1063 | } 1064 | if$ 1065 | * 1066 | } 1067 | if$ 1068 | } 1069 | 1070 | FUNCTION {format.btitle} 1071 | { title "title" bibinfo.check 1072 | duplicate$ empty$ 'skip$ 1073 | { 1074 | } 1075 | if$ 1076 | } 1077 | 1078 | FUNCTION {either.or.check} 1079 | { empty$ 1080 | 'pop$ 1081 | { "can't use both " swap$ * " fields in " * cite$ * warning$ } 1082 | if$ 1083 | } 1084 | 1085 | FUNCTION {format.bvolume} 1086 | { volume empty$ 1087 | { "" } 1088 | { bbl.volume volume tie.or.space.prefix 1089 | "volume" bibinfo.check * * 1090 | series "series" bibinfo.check 1091 | duplicate$ empty$ 'pop$ 1092 | { swap$ bbl.of space.word * swap$ 1093 | emphasize * } 1094 | if$ 1095 | "volume and number" number either.or.check 1096 | } 1097 | if$ 1098 | } 1099 | 1100 | FUNCTION {format.number.series} 1101 | { volume empty$ 1102 | { number empty$ 1103 | { series field.or.null } 1104 | { output.state mid.sentence = 1105 | { bbl.number } 1106 | { bbl.number capitalize } 1107 | if$ 1108 | number tie.or.space.prefix "number" bibinfo.check * * 1109 | series empty$ 1110 | { "there's a number but no series in " cite$ * warning$ } 1111 | { bbl.in space.word * 1112 | series "series" bibinfo.check * 1113 | } 1114 | if$ 1115 | } 1116 | if$ 1117 | } 1118 | { "" } 1119 | if$ 1120 | } 1121 | 1122 | FUNCTION {format.edition} 1123 | { edition duplicate$ empty$ 'skip$ 1124 | { 1125 | % convert.edition 1126 | output.state mid.sentence = 1127 | { "l" } 1128 | { "t" } 1129 | if$ change.case$ 1130 | "edition" bibinfo.check 1131 | " " * bbl.edition * 1132 | } 1133 | if$ 1134 | } 1135 | INTEGERS { multiresult } 1136 | FUNCTION {multi.page.check} 1137 | { 't := 1138 | #0 'multiresult := 1139 | { multiresult not 1140 | t empty$ not 1141 | and 1142 | } 1143 | { t #1 #1 substring$ 1144 | duplicate$ "-" = 1145 | swap$ duplicate$ "," = 1146 | swap$ "+" = 1147 | or or 1148 | { #1 'multiresult := } 1149 | { t #2 global.max$ substring$ 't := } 1150 | if$ 1151 | } 1152 | while$ 1153 | multiresult 1154 | } 1155 | 1156 | FUNCTION {format.pages} 1157 | { pages duplicate$ empty$ 'skip$ 1158 | { duplicate$ multi.page.check 1159 | { 1160 | bbl.pages swap$ 1161 | n.dashify 1162 | } 1163 | { 1164 | bbl.page swap$ 1165 | } 1166 | if$ 1167 | tie.or.space.prefix 1168 | "pages" bibinfo.check 1169 | * * 1170 | } 1171 | if$ 1172 | } 1173 | 1174 | FUNCTION {format.journal.pages} 1175 | { pages duplicate$ empty$ 'pop$ 1176 | { swap$ duplicate$ empty$ 1177 | { pop$ pop$ format.pages } 1178 | { 1179 | ":" * 1180 | swap$ 1181 | n.dashify 1182 | "pages" bibinfo.check 1183 | * 1184 | } 1185 | if$ 1186 | } 1187 | if$ 1188 | } 1189 | 1190 | FUNCTION {format.vol.num} 1191 | { volume field.or.null 1192 | duplicate$ empty$ 'skip$ 1193 | { 1194 | "volume" bibinfo.check 1195 | } 1196 | if$ 1197 | number "number" bibinfo.check duplicate$ empty$ 'skip$ 1198 | { 1199 | swap$ duplicate$ empty$ 1200 | { "there's a number but no volume in " cite$ * warning$ } 1201 | 'skip$ 1202 | if$ 1203 | swap$ 1204 | "(" swap$ * ")" * 1205 | } 1206 | if$ * 1207 | } 1208 | 1209 | FUNCTION {format.vol.num.pages} 1210 | { volume field.or.null 1211 | duplicate$ empty$ 'skip$ 1212 | { 1213 | "volume" bibinfo.check 1214 | } 1215 | if$ 1216 | number "number" bibinfo.check duplicate$ empty$ 'skip$ 1217 | { 1218 | swap$ duplicate$ empty$ 1219 | { "there's a number but no volume in " cite$ * warning$ } 1220 | 'skip$ 1221 | if$ 1222 | swap$ 1223 | "(" swap$ * ")" * 1224 | } 1225 | if$ * 1226 | format.journal.pages 1227 | } 1228 | 1229 | FUNCTION {format.volume} 1230 | { volume "\textbf{" swap$ * "}" * } 1231 | 1232 | FUNCTION {format.chapter.pages} 1233 | { chapter empty$ 1234 | 'format.pages 1235 | { type empty$ 1236 | { bbl.chapter } 1237 | { type "l" change.case$ 1238 | "type" bibinfo.check 1239 | } 1240 | if$ 1241 | chapter tie.or.space.prefix 1242 | "chapter" bibinfo.check 1243 | * * 1244 | pages empty$ 1245 | 'skip$ 1246 | { ", " * format.pages * } 1247 | if$ 1248 | } 1249 | if$ 1250 | } 1251 | 1252 | FUNCTION {format.booktitle} 1253 | { 1254 | booktitle "\emph{" swap$ * "}" * "booktitle" bibinfo.check 1255 | } 1256 | 1257 | FUNCTION {format.journal} 1258 | { 1259 | journal "\emph{" swap$ * "}" * "journal" bibinfo.check 1260 | } 1261 | 1262 | 1263 | FUNCTION {format.in.ed.booktitle} 1264 | { format.booktitle duplicate$ empty$ 'skip$ 1265 | { 1266 | editor "editor" format.names.ed duplicate$ empty$ 'pop$ 1267 | { 1268 | "," * 1269 | " " * 1270 | get.bbl.editor 1271 | ". " * 1272 | * swap$ 1273 | * } 1274 | if$ 1275 | word.in swap$ * 1276 | } 1277 | if$ 1278 | } 1279 | 1280 | FUNCTION {format.in.ed.title} 1281 | { format.title duplicate$ empty$ 'skip$ 1282 | { 1283 | editor "editor" format.names.ed duplicate$ empty$ 'pop$ 1284 | { 1285 | "," * 1286 | " " * 1287 | get.bbl.editor 1288 | ". " * 1289 | * swap$ 1290 | * } 1291 | if$ 1292 | word.in swap$ * 1293 | } 1294 | if$ 1295 | } 1296 | 1297 | FUNCTION {empty.misc.check} 1298 | { author empty$ title empty$ howpublished empty$ 1299 | month empty$ year empty$ note empty$ 1300 | and and and and and 1301 | { "all relevant fields are empty in " cite$ * warning$ } 1302 | 'skip$ 1303 | if$ 1304 | } 1305 | FUNCTION {format.thesis.type} 1306 | { type duplicate$ empty$ 1307 | 'pop$ 1308 | { swap$ pop$ 1309 | "t" change.case$ "type" bibinfo.check 1310 | } 1311 | if$ 1312 | } 1313 | FUNCTION {format.tr.number} 1314 | { 1315 | number "number" bibinfo.check 1316 | %%type duplicate$ empty$ 1317 | %%{ pop$ bbl.techrep } 1318 | %%'skip$ 1319 | %%if$ 1320 | %%"type" bibinfo.check 1321 | %%swap$ duplicate$ empty$ 1322 | %%{ pop$ "t" change.case$ } 1323 | %%{ tie.or.space.prefix * * } 1324 | %%if$ 1325 | } 1326 | 1327 | FUNCTION {format.org.or.pub} 1328 | { 't := 1329 | "" 1330 | address empty$ t empty$ and 1331 | 'skip$ 1332 | { 1333 | address "address" bibinfo.check * 1334 | t empty$ 1335 | 'skip$ 1336 | { address empty$ 1337 | 'skip$ 1338 | { ": " * } 1339 | if$ 1340 | t * 1341 | } 1342 | if$ 1343 | } 1344 | if$ 1345 | } 1346 | 1347 | FUNCTION {format.publisher.address} 1348 | { publisher "publisher" bibinfo.warn format.org.or.pub 1349 | } 1350 | 1351 | FUNCTION {format.organization.address} 1352 | { organization "organization" bibinfo.check format.org.or.pub 1353 | } 1354 | 1355 | FUNCTION {format.institution.address} 1356 | { institution "institution" bibinfo.check format.org.or.pub 1357 | } 1358 | FUNCTION {format.article.crossref} 1359 | { 1360 | word.in 1361 | " \cite{" * crossref * "}" * 1362 | } 1363 | FUNCTION {format.book.crossref} 1364 | { volume duplicate$ empty$ 1365 | { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ 1366 | pop$ word.in 1367 | } 1368 | { bbl.volume 1369 | capitalize 1370 | swap$ tie.or.space.prefix "volume" bibinfo.check * * bbl.of space.word * 1371 | } 1372 | if$ 1373 | " \cite{" * crossref * "}" * 1374 | } 1375 | FUNCTION {format.incoll.inproc.crossref} 1376 | { 1377 | word.in 1378 | " \cite{" * crossref * "}" * 1379 | } 1380 | FUNCTION {misc} 1381 | { output.bibitem 1382 | format.authors "author" output.check 1383 | format.editors "author and editor" output.check 1384 | format.title "title" output.check 1385 | type missing$ 1386 | { skip$ } 1387 | % { format.type "type" output.check } 1388 | { "type" output.check } 1389 | %%{ inbrackets type output } 1390 | if$ 1391 | new.block 1392 | format.publisher.address output 1393 | format.date "year" output.check 1394 | new.block 1395 | format.note output 1396 | new.block 1397 | howpublished new.block.checka 1398 | howpublished "howpublished" bibinfo.check output 1399 | % output.web.refs % urlbst 1400 | fin.entry 1401 | empty.misc.check 1402 | } 1403 | 1404 | FUNCTION {article} 1405 | { output.bibitem 1406 | format.authors "author" output.check 1407 | organization empty$ 1408 | 'skip$ 1409 | { author empty$ 1410 | { 1411 | format.organizations "organization" output.check 1412 | } 1413 | { 1414 | "; " * 1415 | no.blank.or.punct 1416 | format.organizations "organization" output.check 1417 | } 1418 | if$ 1419 | } 1420 | if$ 1421 | new.block 1422 | format.title "title" output.check 1423 | type missing$ 1424 | { skip$ } 1425 | { "type" output.check } 1426 | if$ 1427 | new.block 1428 | journal 1429 | remove.dots 1430 | ". " * 1431 | "journal" bibinfo.check 1432 | "journal" output.check 1433 | new.block 1434 | format.journal.date 1435 | "year" output.check 1436 | no.blank.or.punct 1437 | add.semicolon 1438 | add.blank 1439 | format.vol.num.pages output 1440 | new.block 1441 | format.note output 1442 | % output.web.refs % urlbst 1443 | fin.entry 1444 | } 1445 | 1446 | FUNCTION {book} 1447 | { output.bibitem 1448 | author empty$ 1449 | { editor empty$ 1450 | { format.organizations "organization" output.check } 1451 | { format.editors "author and editor" output.check } 1452 | if$ 1453 | } 1454 | { format.authors output.nonnull 1455 | "author and editor" editor either.or.check 1456 | } 1457 | if$ 1458 | new.block 1459 | format.btitle "title" output.check 1460 | format.bvolume output 1461 | new.block 1462 | format.edition output 1463 | new.sentence 1464 | author empty$ not 1465 | editor empty$ not 1466 | and 1467 | { format.editors "author and editor" output.check } 1468 | 'skip$ 1469 | if$ 1470 | format.number.series output 1471 | format.publisher.address output 1472 | format.date "year" output.check 1473 | new.block 1474 | format.note output 1475 | % output.web.refs % urlbst 1476 | fin.entry 1477 | } 1478 | FUNCTION {booklet} 1479 | { misc } 1480 | 1481 | FUNCTION {dictionary} 1482 | { output.bibitem 1483 | format.booktitle "booktitle" output.check 1484 | format.bvolume output 1485 | new.block 1486 | format.edition output 1487 | new.sentence 1488 | format.publisher.address output 1489 | format.date "year" output.check 1490 | format.btitle "title" output.check 1491 | add.semicolon 1492 | add.blank 1493 | format.pages "pages" output.check 1494 | new.block 1495 | format.note output 1496 | % output.web.refs % urlbst 1497 | fin.entry 1498 | } 1499 | 1500 | FUNCTION {inbook} 1501 | { output.bibitem 1502 | format.authors "author" output.check 1503 | new.block 1504 | chapter "chapter" output.check 1505 | new.block 1506 | format.in.ed.title "title" output.check 1507 | format.bvolume output 1508 | format.edition output 1509 | new.sentence 1510 | format.number.series output 1511 | format.publisher.address output 1512 | format.date "year" output.check 1513 | date.block 1514 | add.blank 1515 | format.pages "pages" output.check 1516 | new.block 1517 | format.note output 1518 | % output.web.refs % urlbst 1519 | fin.entry 1520 | } 1521 | 1522 | FUNCTION {incollection} 1523 | { output.bibitem 1524 | format.authors "author" output.check 1525 | new.block 1526 | format.title "title" output.check 1527 | new.block 1528 | format.in.ed.booktitle "booktitle" output.check 1529 | format.bvolume output 1530 | format.edition output 1531 | new.sentence 1532 | format.number.series output 1533 | format.publisher.address output 1534 | format.date "year" output.check 1535 | date.block 1536 | % add.blank 1537 | format.pages "pages" output.check 1538 | new.block 1539 | format.note output 1540 | fin.entry 1541 | } 1542 | FUNCTION {inproceedings} 1543 | { output.bibitem 1544 | format.authors "author" output.check 1545 | new.block 1546 | format.title "title" output.check 1547 | new.block 1548 | format.in.ed.booktitle "booktitle" output.check 1549 | format.bvolume output 1550 | new.sentence 1551 | format.number.series output 1552 | publisher empty$ 1553 | { format.organization.address output } 1554 | { organization "organization" bibinfo.check output 1555 | format.publisher.address output 1556 | } 1557 | if$ 1558 | format.date "year" output.check 1559 | date.block 1560 | add.blank 1561 | format.pages "pages" output.check 1562 | new.block 1563 | format.note output 1564 | % output.web.refs % urlbst 1565 | fin.entry 1566 | } 1567 | FUNCTION {conference} { inproceedings } 1568 | FUNCTION {manual} 1569 | { output.bibitem 1570 | format.authors output 1571 | author format.key output 1572 | % add.colon 1573 | new.block 1574 | format.btitle "title" output.check 1575 | organization address new.block.checkb 1576 | organization "organization" bibinfo.check output 1577 | address "address" bibinfo.check output 1578 | format.edition output 1579 | format.date "year" output.check 1580 | % new.block ++++ REMOVED (to get comma before note) 1581 | format.note output 1582 | fin.entry 1583 | } 1584 | 1585 | FUNCTION {phdthesis} 1586 | { output.bibitem 1587 | format.authors "author" output.check 1588 | new.block 1589 | format.btitle "title" output.check 1590 | new.block 1591 | "PhD thesis" format.thesis.type output.nonnull 1592 | school "school" bibinfo.warn output 1593 | % address "address" bibinfo.check output 1594 | format.date "year" output.check 1595 | % new.block 1596 | % format.note output 1597 | % output.web.refs % urlbst 1598 | fin.entry 1599 | } 1600 | 1601 | FUNCTION {proceedings} 1602 | { output.bibitem 1603 | format.editors output 1604 | editor format.key output 1605 | % add.colon 1606 | new.block 1607 | format.btitle "title" output.check 1608 | format.bvolume output 1609 | new.sentence 1610 | format.number.series output 1611 | publisher empty$ 1612 | { format.organization.address output } 1613 | { organization "organization" bibinfo.check output 1614 | format.publisher.address output 1615 | } 1616 | if$ 1617 | format.date "year" output.check 1618 | % new.block ++++ REMOVED (to get comma before note) 1619 | format.note output 1620 | fin.entry 1621 | } 1622 | 1623 | FUNCTION {techreport} 1624 | { output.bibitem 1625 | format.authors "author" output.check 1626 | new.block 1627 | format.title 1628 | "title" output.check 1629 | new.block 1630 | format.institution.address output 1631 | format.date "year" output.check 1632 | % format.tr.number output.nonnull 1633 | new.block 1634 | format.note output 1635 | % output.web.refs % urlbst 1636 | fin.entry 1637 | } 1638 | 1639 | FUNCTION {unpublished} 1640 | { output.bibitem 1641 | format.authors "author" output.check 1642 | author format.key output 1643 | % add.colon 1644 | new.block 1645 | format.title "title" output.check 1646 | format.date "year" output.check 1647 | % new.block ++++ REMOVED (to get comma before note) 1648 | format.note "note" output.check 1649 | fin.entry 1650 | } 1651 | 1652 | FUNCTION {default.type} { misc } 1653 | READ 1654 | FUNCTION {sortify} 1655 | { purify$ 1656 | "l" change.case$ 1657 | } 1658 | INTEGERS { len } 1659 | FUNCTION {chop.word} 1660 | { 's := 1661 | 'len := 1662 | s #1 len substring$ = 1663 | { s len #1 + global.max$ substring$ } 1664 | 's 1665 | if$ 1666 | } 1667 | FUNCTION {format.lab.names} 1668 | { 's := 1669 | "" 't := 1670 | s #1 "{vv~}{ll}" format.name$ 1671 | s num.names$ duplicate$ 1672 | #2 > 1673 | { pop$ 1674 | " " * bbl.etal * 1675 | } 1676 | { #2 < 1677 | 'skip$ 1678 | { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = 1679 | { 1680 | " " * bbl.etal * 1681 | } 1682 | { bbl.and space.word * s #2 "{vv~}{ll}" format.name$ 1683 | * } 1684 | if$ 1685 | } 1686 | if$ 1687 | } 1688 | if$ 1689 | } 1690 | 1691 | FUNCTION {author.key.label} 1692 | { author empty$ 1693 | { key empty$ 1694 | { cite$ #1 #3 substring$ } 1695 | 'key 1696 | if$ 1697 | } 1698 | { author format.lab.names } 1699 | if$ 1700 | } 1701 | 1702 | FUNCTION {author.editor.key.label} 1703 | { author empty$ 1704 | { editor empty$ 1705 | { key empty$ 1706 | { cite$ #1 #3 substring$ } 1707 | 'key 1708 | if$ 1709 | } 1710 | { editor format.lab.names } 1711 | if$ 1712 | } 1713 | { author format.lab.names } 1714 | if$ 1715 | } 1716 | 1717 | FUNCTION {editor.key.label} 1718 | { editor empty$ 1719 | { key empty$ 1720 | { cite$ #1 #3 substring$ } 1721 | 'key 1722 | if$ 1723 | } 1724 | { editor format.lab.names } 1725 | if$ 1726 | } 1727 | 1728 | FUNCTION {calc.short.authors} 1729 | { type$ "book" = 1730 | type$ "inbook" = 1731 | or 1732 | 'author.editor.key.label 1733 | { type$ "proceedings" = 1734 | 'editor.key.label 1735 | 'author.key.label 1736 | if$ 1737 | } 1738 | if$ 1739 | 'short.list := 1740 | } 1741 | 1742 | FUNCTION {calc.label} 1743 | { calc.short.authors 1744 | short.list 1745 | "(" 1746 | * 1747 | year duplicate$ empty$ 1748 | { pop$ "????" } 1749 | 'skip$ 1750 | if$ 1751 | * 1752 | 'label := 1753 | } 1754 | 1755 | FUNCTION {sort.format.names} 1756 | { 's := 1757 | #1 'nameptr := 1758 | "" 1759 | s num.names$ 'numnames := 1760 | numnames 'namesleft := 1761 | { namesleft #0 > } 1762 | { s nameptr 1763 | "{ll{ }}{ ff{ }}{ jj{ }}" 1764 | format.name$ 't := 1765 | nameptr #1 > 1766 | { 1767 | " " * 1768 | namesleft #1 = t "others" = and 1769 | { "zzzzz" * } 1770 | { t sortify * } 1771 | if$ 1772 | } 1773 | { t sortify * } 1774 | if$ 1775 | nameptr #1 + 'nameptr := 1776 | namesleft #1 - 'namesleft := 1777 | } 1778 | while$ 1779 | } 1780 | 1781 | FUNCTION {sort.format.title} 1782 | { 't := 1783 | "A " #2 1784 | "An " #3 1785 | "The " #4 t chop.word 1786 | chop.word 1787 | chop.word 1788 | sortify 1789 | #1 global.max$ substring$ 1790 | } 1791 | FUNCTION {author.sort} 1792 | { author empty$ 1793 | { key empty$ 1794 | { "to sort, need author or key in " cite$ * warning$ 1795 | "" 1796 | } 1797 | { key sortify } 1798 | if$ 1799 | } 1800 | { author sort.format.names } 1801 | if$ 1802 | } 1803 | FUNCTION {author.editor.sort} 1804 | { author empty$ 1805 | { editor empty$ 1806 | { key empty$ 1807 | { "to sort, need author, editor, or key in " cite$ * warning$ 1808 | "" 1809 | } 1810 | { key sortify } 1811 | if$ 1812 | } 1813 | { editor sort.format.names } 1814 | if$ 1815 | } 1816 | { author sort.format.names } 1817 | if$ 1818 | } 1819 | FUNCTION {editor.sort} 1820 | { editor empty$ 1821 | { key empty$ 1822 | { "to sort, need editor or key in " cite$ * warning$ 1823 | "" 1824 | } 1825 | { key sortify } 1826 | if$ 1827 | } 1828 | { editor sort.format.names } 1829 | if$ 1830 | } 1831 | FUNCTION {presort} 1832 | { calc.label 1833 | % label sortify 1834 | % " " 1835 | % * 1836 | % type$ "book" = 1837 | % type$ "inbook" = 1838 | % or 1839 | % 'author.editor.sort 1840 | % { type$ "proceedings" = 1841 | % 'editor.sort 1842 | % 'author.sort 1843 | % if$ 1844 | % } 1845 | % if$ 1846 | % #1 entry.max$ substring$ 1847 | % 'sort.label := 1848 | % sort.label 1849 | % * 1850 | % " " 1851 | % * 1852 | % title field.or.null 1853 | % sort.format.title 1854 | % * 1855 | % #1 entry.max$ substring$ 1856 | % 'sort.key$ := 1857 | } 1858 | 1859 | ITERATE {presort} 1860 | SORT 1861 | STRINGS { last.label next.extra } 1862 | INTEGERS { last.extra.num number.label } 1863 | FUNCTION {initialize.extra.label.stuff} 1864 | { #0 int.to.chr$ 'last.label := 1865 | "" 'next.extra := 1866 | #0 'last.extra.num := 1867 | #0 'number.label := 1868 | } 1869 | FUNCTION {forward.pass} 1870 | { last.label label = 1871 | { last.extra.num #1 + 'last.extra.num := 1872 | last.extra.num int.to.chr$ 'extra.label := 1873 | } 1874 | { "a" chr.to.int$ 'last.extra.num := 1875 | "" 'extra.label := 1876 | label 'last.label := 1877 | } 1878 | if$ 1879 | number.label #1 + 'number.label := 1880 | } 1881 | FUNCTION {reverse.pass} 1882 | { next.extra "b" = 1883 | { "a" 'extra.label := } 1884 | 'skip$ 1885 | if$ 1886 | extra.label 'next.extra := 1887 | extra.label 1888 | duplicate$ empty$ 1889 | 'skip$ 1890 | { "{\natexlab{" swap$ * "}}" * } 1891 | if$ 1892 | 'extra.label := 1893 | label extra.label * 'label := 1894 | } 1895 | EXECUTE {initialize.extra.label.stuff} 1896 | ITERATE {forward.pass} 1897 | REVERSE {reverse.pass} 1898 | FUNCTION {bib.sort.order} 1899 | { sort.label 1900 | " " 1901 | * 1902 | year field.or.null sortify 1903 | * 1904 | " " 1905 | * 1906 | title field.or.null 1907 | sort.format.title 1908 | * 1909 | #1 entry.max$ substring$ 1910 | 'sort.key$ := 1911 | } 1912 | % ITERATE {bib.sort.order} 1913 | % SORT 1914 | FUNCTION {begin.bib} 1915 | { preamble$ empty$ 1916 | 'skip$ 1917 | { preamble$ write$ newline$ } 1918 | if$ 1919 | "\begin{thebibliography}{" number.label int.to.str$ * "}" * 1920 | write$ newline$ 1921 | "\providecommand{\natexlab}[1]{#1}" 1922 | write$ newline$ 1923 | % "\providecommand{\url}[1]{\texttt{#1}}" 1924 | % write$ newline$ 1925 | % "\providecommand{\urlprefix}{URL }" ++++ EMPTIED by default 1926 | "\providecommand{\urlprefix}{}" 1927 | write$ newline$ 1928 | "\providecommand{\doiprefix}{https://doi.org/}" 1929 | write$ newline$ 1930 | } 1931 | EXECUTE {begin.bib} 1932 | EXECUTE {init.state.consts} 1933 | ITERATE {call.type$} 1934 | FUNCTION {end.bib} 1935 | { newline$ 1936 | "\end{thebibliography}" write$ newline$ 1937 | } 1938 | EXECUTE {end.bib} 1939 | %% End of customized bst file 1940 | %% 1941 | %% End of file `splncsnat.bst'. 1942 | --------------------------------------------------------------------------------