1/* Test file for kate's stata syntax highlighting 2*/ 3*! version 1.2.0 2mar2003 E. Leuven 4program define spellsplit 5 version 7 6 syntax [anything], spell(varlist min=2 max=2) [ by(varlist)] 7 tokenize `spell' 8 local date0 `1' 9 local date1 `2' 10 local f0 : format `date0' 11 local f1 : format `date1' 12 13 /* set default statistic */ 14 local current "mean" 15 16 gettoken left anything : anything, match(prns) 17 while "`left'"!="" { 18 if "`prns'"!="" { 19 if !inlist("`left'","mean","sum") { 20 di as error "Statistic `left' not supported" 21 exit 198 22 } 23 local current "`left'" 24 } 25 else { 26 local `current'vars ``current'vars' `left' 27 } 28 gettoken left anything : anything, match(prns) 29 } 30 if ("`meanvars'"!="") { 31 confirm var `meanvars' 32 unab meanvars : `meanvars' 33 } 34 if ("`sumvars'"!="") { 35 confirm var `sumvars' 36 unab sumvars : `sumvars' 37 } 38 39 quietly { 40 g _count = 1 41 local xvars `meanvars' `sumvars' _count 42 43 /* create dummy by-var if no by option is specified */ 44 if "`by'"=="" { 45 tempvar by 46 g byte `by' = 1 47 } 48 tempvar `xvars' `by' 49 50 /* create negative for subtraction when spell ends */ 51 cap foreach v of varlist `xvars' { 52 g double ``v'' = -`v' 53 local txvars `txvars' ``v'' 54 } 55 cap foreach v of varlist `by' { 56 g double ``v'' = `v' 57 local txvars `txvars' ``v'' 58 } 59 60 stack `date0' `xvars' `by' `date1' `txvars', into(`date0' `xvars' `by') clear 61 62 /* calculate totals per date */ 63 cap foreach v of varlist `xvars' { 64 egen double ``v'' = sum(`v'), by(`by' `date0') 65 } 66 67 /* unique dates only */ 68 by `by' `date0', sort: keep if _n==1 69 70 /* calculate totals (+ when spell starts - when ends) */ 71 sort `by' 72 cap foreach v of varlist `xvars' { 73 by `by': replace `v' = sum(``v'') 74 } 75 by `by': g `date1' = `date0'[_n + 1] 76 77 drop if `date0'>`date1' 78 drop _stack 79 drop if _count==0 80 order `by' `date0' `date1' `xvars' 81 format `date0' `f0' 82 format `date1' `f1' 83 84 cap for var `meanvars': replace X = X/_count 85 86 compress 87 } 88 89end