*! outreg2 2.2.2 18nov2009 by roywada@hotmail.com
*! based on outreg 3.0.6/4.0.0 by john_gallup@alum.swarthmore.edu

program define outreg2, by(onecall) sortpreserve
	versionSet
	version `version'

*** per Richard W., store the currently active estimates to be restored later
tempname coefActive
* capture for prior to Stata 8.2
cap _estimates hold `coefActive', restore copy nullok

* getting the colon : parsings
/* not version 7 friendly
_on_colon_parse `0'
local 0 `"`s(before)'"'
local rest `"`s(after)'"'
outreg2 : `"`rest'"' if `touse'==1 */

if "`Version7'"=="" {
	local bind ""
}
else {
	local bind "bind"
}

local behind `"`0'"'
local 0 ""
gettoken front behind: behind, parse(" ,")
local 0 ""
local done 0
while `"`front'"'~="" & `done'==0 {
	if `"`front'"'=="using" {
		
		gettoken rest behind: behind, parse(" ,")
		* strip off quotes
		gettoken first second: rest, parse(" ")
		cap local rest: list clean local(rest)
		
		* take off colon at the end
		local goldfish ""
		if index(`"`rest'"',":")~=0 {
			local end=substr(`"`rest'"',length(`"`rest'"'),length(`"`rest'"'))
			if "`end'"==":" {
				local rest=substr(`"`rest'"',1,`=length(`"`rest'"')-1')
				local goldfish " : "
			}
		}
		
		* colon reattached with a space at the end
		* .txt attached here for seeout working with _pref.ado
		local rabbit `"""'
		if index(`"`rest'"', ".")==0 {
			local using `"`rabbit'`rest'.txt`rabbit'`goldfish'"'
		}
		else {
			local using `"`rabbit'`rest'`rabbit'`goldfish'"'
		}
		local 0 `"`0' using `using' `behind'"'
		local done 1
	}
	else {
		local 0 `"`0' `front'"'
		gettoken front behind: behind, parse(" ,")
	}
}


gettoken first second : 0, parse(":") `bind' match(par) quotes
local 0 `"`first'"'
while `"`first'"'~=":" & `"`first'"'~="" {
	gettoken first second : second, parse(":") `bind' match(par) quotes
}
if `"`0'"'==":" {
	* colon only when shorthand combined with prefix
	local 0
}
else {
	local _0 `"`0'"'
}


*** shorthand syntax if [using] is missing
syntax [anything] [using] [if] [in] [pweight aweight iweight] [, SEEout REPLACE NOSEEOUT NOREPLACE CROSStab AGAIN * ]


*** bys( ): by(onecall) indicated by `_byvars' only

* goes with `second'
if `"`second'"'~="" {
	local _colon ":"
}

if "`_byvars'"~="" {
	bys `_byvars' : outreg2_by `0' `_colon' `second'
}
else if "`crosstab'"~="" {
	outreg2_by `0' `_colon' `second'
}
else {
	* regular stuff
	if `"`using'"'~="" {
		* both prefix full syntax and regular non-prefix usage
		* `second' could contain " " only
		`second'
		_outreg2 `0'
	}
	else {
		* prefix shorthand synatx
		syntax [anything] [, REPLACE SEEout APpend]
		
		`second'
		
		*** read the set preference if not out of date
		
		* NOTE: `0' is written over below
		
		cap quietly findfile outreg2.pref
		if _rc~=0 & "`Version7'"~="" {
			* create it if missing
			findfile outreg2.ado
			local place=substr(`"`r(fn)'"',1,`=length(`"`r(fn)'"')-11')
			
			tempname myplace
			cap file open `myplace' using `"`place'outreg2.pref"', write text replace
			cap file write `myplace' "" _n
			cap file write `myplace' "" _n
			cap file write `myplace' ""
			cap file close `myplace'
		}
		
		tempname myfile
		cap file open `myfile' using `"`r(fn)'"', read text
		cap file read `myfile' date
		cap file read `myfile' pref
		cap file read `myfile' options
		cap file close `myfile'
		
		* fix _comma
		local _comma ""
		if `"`macval(options)'"'~="" | "`replace'"~="" | "`seeout'"~="" {
			local _comma ","
		}
		
		if "`date'"== "`c(current_date)'" {
			local seecommand "outreg2"
			local precommand "_outreg2"
			foreach var in anything  macval(pref) _comma macval(options) replace seeout {
				if `"``var''"'~="" {
					if `"``var''"'=="," {
						local seecommand `"`seecommand'``var''"'
						local precommand `"`precommand'``var''"'
					}
					else {
						local seecommand `"`seecommand' ``var''"'
						local precommand `"`precommand' ``var''"'
					}
				}
			}
			*local cl `"{stata `"`seecommand'"':  `seecommand'}"'
			*di as txt `"`cl'"'
			di in white `"  `seecommand'"'
			`precommand'
		}
		else {
			di in red "must specify the full syntax (the last preference has expired)"
			exit 100
		}
	}
}
	
*** saving the current preferences
if `"`using'"'=="" {
	local _0 `"`seecommand'"'
}

local 0 `"`_0'"'

* take out sum/crosstab and
* take out [if] [in] [pweight aweight iweight] 
* take out non-user specified options: replace/noreplace seeout/noseeout 
syntax [anything] [using] [if] [in] [pweight aweight iweight] [, REPLACE NOREPLACE SUM SUM2(string) CROSStab SEEout /*
	*/ NOSEEOUT CTTOP *]

local pref `"`using'"'

* NOTE: `0' has been overwritten long ago
		
		cap quietly findfile outreg2.pref
		if _rc~=0 & "`Version7'"~="" {
			* create it if missing
			findfile outreg2.ado
			local place=substr(`"`r(fn)'"',1,`=length(`"`r(fn)'"')-11')
			
			tempname myplace
			cap file open `myplace' using `"`place'outreg2.pref"', write text replace
			cap file write `myplace' "" _n
			cap file write `myplace' "" _n
			cap file write `myplace' ""
			cap file close `myplace'
		}
		
cap quietly findfile outreg2.pref
tempname myfile

* capture for write protected files
cap file open `myfile' using `"`r(fn)'"', write text replace
cap file write `myfile' `"`c(current_date)'"' _n
cap file write `myfile' `"`pref'"' _n
cap file write `myfile' `"`options'"'
cap file close `myfile'

*** display clickables
foreach var in tex word excel {
	if `"`cl_`var''"'~="" {
		noi di as txt `"`cl_`var''"' 
	}
}

*** cdout thing
noi _cdout, cont

foreach var in see {
	if `"`cl_`var''"'~="" {
		noi di as txt `"`cl_`var''"' 
	}
}


* restoring the currently active estimate here
cap _estimates unhold `coefActive'

end /* end of outreg2 */


********************************************************************************************


program define outreg2_by, by(recall, nohead)
	versionSet
	version `version'

preserve

gettoken first second : 0, parse(":") `bind' match(par) quotes
local 0 `"`first'"'
while `"`first'"'~=":" & `"`first'"'~="" {
	gettoken first second : second, parse(":") `bind' match(par) quotes

}

if `"`0'"'==":" {
	* colon only when shorthand combined with prefix
	local 0
}
else {
	local _0 `"`0'"'
}

*** shorthand syntax if [using] is missing
syntax [anything] [using] [if] [in] [pweight aweight iweight] [, SEEout REPLACE NOSEEOUT NOREPLACE CROSStab AGAIN * ]

*** bys( ) clean up: touse, ctitle/cctop, replace/noreplace, seeout/noseeout
if `=_by()'==1 {
	
	marksample touse
	
	* generate column heading when -by- specified
	if `"`cttop'"'~="" {
		local cc=1
		
		tokenize `_byvars'
		while "``cc''"~="" {
			
			* should there be `touse' here?
			qui sum ``cc'' if `_byindex' == `=_byindex()' & `touse', meanonly
			if r(N)<. {
				local actual`cc' =r(mean)
			}
			else {
				local actual`cc' =.
			}
			
			* place cttop in there
			local _comma
			if `cc'~=1 {
				local _comma ","
			}
			
			local cttop "`cttop'`_comma' ``cc'' `actual`cc'' "
			*local cttop "`cttop'`_comma' ``cc'', `actual`cc'' "
			local cc=`cc'+1
		}
	}
	else {
		local cc=1
		local cttop ""
		
		tokenize `_byvars'
		while "``cc''"~="" {
			
		* should there be `touse' here?
		qui sum ``cc'' if `_byindex' == `=_byindex()' & `touse', meanonly
			if `r(N)'<. {
				local actual`cc' =r(mean)
			}
			else {
				local actual`cc' =.
			}
			
			* place cttop in there
			local _comma
			if `cc'~=1 {
				local _comma ","
			}
			
			local cttop "`cttop'`_comma' ``cc'' `actual`cc'' "
			*local cttop "`cttop'`_comma' ``cc'', `actual`cc'' "
			local cc=`cc'+1
		}
	}
	
	* lazy
	qui keep if `touse'==1
	
	local 0 `0' cttop(`cttop')
	
	* drop bys( ) from ctitles
	if "`drop'"=="" {
		local drop `"`_byvars'"'
		local 0 `0' drop(`drop')
	}
	
	* replace first when -by- specified
	if `=_byindex()'==1 {
		local noreplace ""
	}
	else {
		local noreplace "noreplace"
	}
	
	* seeout last when -by- specified
	if `=_bylastcall()'==0 {
		local noseeout "noseeout"
	}
	else {
		local noseeout ""
	}
	
	
	* pass an embedded indicator to the second runs
	if "`again'"=="" {
		local again "again"
	}
	
	* simplify by dropping them
	drop `touse' `_byindex'
}

* this will include the outputs from bys( ) routine above:
local 0 `0' `noreplace' `noseeout'

* for multiple tabs
local names `"`anything'"'
if "`crosstab'"=="crosstab" & `"`names'"'=="" {
	noi di in red "varlist required for {opt crosstab} option"
	exit 100
}

* separate the first variable from the rest, which are for the bys( )
gettoken first rest : names, parse(" ")
if "`crosstab'"=="crosstab" & "`first'"~="" & "`rest'"~="" {
	cap drop _fillin
	cap fillin `rest'
	if "`replace'"=="replace" {
		
	}
	*local 0 `first' `if' `in' [`weight'`exp'] `using', `seeout' `replace' `crosstab' nonotes `options' cttop(`cttop')
	local 0 `first' `using', `seeout' `replace' `crosstab' nonotes `options' cttop(`cttop')
	
	if `"`second'"'=="" {
		qui bys `rest' : outreg2_by `0'
	}
	else {
		noi bys `rest' : outreg2_by `0' : `second'
	}
}
else {
	* single tabs or no crosstab at all
	if (`"`second'"'=="" | `"`second'"'==" ") & `"`using'"'~="" {
		* non-prefix
		_outreg2 `0'
	}
	else {
		`second'
		_outreg2 `0'
	}
} /* no crosstab */


*** pass it forward
foreach var in tex word excel see {
	c_local cl_`var' `"`cl_`var''"' 
}

end /* end of outreg2_by */


********************************************************************************************


program define _outreg2
	* write formatted regression output to file
	
	versionSet
	version `version'
	
syntax [anything] using  [if] [in] [pweight aweight iweight] [,			/*
*/ eqdrop(string) eqkeep(string) drop(string) keep(string)				/*
*/ matrix(string)	noNOBS noOBS								/*
*/ COEfastr APpend REPLACE NOREPLACE SEEout NOSEEOUT						/*
*/ LABel LABelA(passthru) TItle(passthru) CTitle(string) CTTOP(string)		/*
*/ TEX TEX1(passthru) WORD EXCEL TEXT EQuationsA(passthru)				/*
*/ Onecol LONG SIDEway COMma Quote noNOTes ADDNote(passthru) 			/*
*/ STats(string asis) ESTATS(passthru)	noSE TSTAT Pvalue CI BEta		/*
*/ Level(integer $S_level) 									/*
*/ noPAren PARenthesis(string asis) BRacket BRacketA(string)			*]

local usingTemp `"`using'"'
local ifTemp `"`if'"'
local inTemp `"`in'"'
local weightTemp `"`weight'"'
local expTemp `"`exp'"'

local cttop1 `"`cttop'"'
local cttop

local drop1 `"`drop'"'
local drop

* cascading options:
local 0 `", `options'"'
syntax [, noASter	2aster ALPHA(passthru) SYMbol(passthru) 10pct 			/*
*/ ASTERisk(passthru)										/*
*/ noCONs noNI noR2 ADJr2 E(string)								/*
*/ ADDStat(passthru)	ADDText(string) 							/*
*/ EForm MFX Margin1 Margin2(string)							/*
*/ SUM SUM2(string) CROSStab TAB3(string)							/*
*/ sortcol(string) sortvar(string) groupvar(string)					/*
*/ CTTOP(string) drop(string)									/*
*/ again leave(string)										/*
*/ pivot xpose slow(numlist) raw								*] 

* cascading options:
local 0 `", `options'"'
syntax [, DEC(numlist int >=0 <=11 max=1) FMT(passthru) 				/*
*/ BDec(numlist int >=0 <=11) BFmt(string asis) 					/*
*/ SDec(numlist int >=0 <=11) SFmt(string asis) 					/*
*/ Tdec(numlist int >=0 <=11 max=1) TFmt(string asis)					/*
*/ PDec(numlist int >=0 <=11 max=1) PFmt(string asis) 				/*
*/ CDec(numlist int >=0 <=11 max=1) CFmt(string asis) 				/*
*/ ADec(numlist int >=0 <=11 max=1)	AFmt(string asis)					/*
*/ RDec(numlist int >=0 <=11 max=1) RFmt(string asis)					/*
*/ AUTO(integer 3) LESS(integer 0) NOAUTO							]

local using `"`usingTemp'"'
local using `"`usingTemp'"'
local if `"`ifTemp'"'
local in `"`inTemp'"'
local weight `"`weightTemp'"'
local exp `"`expTemp'"'

* consolidate twice-mentioned options by double bys( )
if `"`cttop'"'=="" {
	local cttop `"`cttop1'"'
}
else if `"`cttop1'"'~="" {
	local cttop `"`cttop1', `cttop'"'
}

if `"`drop'"'=="" {
	local drop `"`drop1'"'
}
else if `"`drop1'"'~="" {
	local drop `"`drop1', `drop'"'
}

* name of 1st column containing variable names
local VARIABLES "VARIABLES"
local VARIABLES1 "VARIABLES"

***  a partial list of original macro names
* neq is the number of equation
* numi is e(N_g), the xt number of groups
* noNI is user request to not to report xt number of groups
* ivar is the e(ivar), the id for xt

*** the original ctitle
local ctitle0 `"`ctitle'"'

*** replace/noreplace seeout/noseeout
if "`noreplace'"=="noreplace" {
	local replace ""
	local noreplace ""
}
if "`noseeout'"=="noseeout" {
	local seeout ""
	local noseeout ""
}

*** default warnings
if "`replace'"=="replace" & "`append'"=="append" {
	di in green "replaced when both {opt replace} and {opt append} chosen"
	local replace "replace"
	local append ""
}

*** set default options
if "`replace'"=="" & "`append'"=="" {
	local append "append"
}

*** betaco option into beta
if "`betaco'"=="betaco" {
	local beta "beta" {
}

*** no observation
if "`nobs'"=="nonobs" {
	* recycling the original outreg option
	local obs "noobs"
	local nobs ""
}
* casewise and raw
if "`raw'"=="raw" & "`casewise'"=="casewise" {
	noi di in red "cannot choose {opt case:wise} and {opt raw} at the same time"
	exit 198
}
* laptop slowdown
if "`slow'"=="" {
	local slow 1
}

*** separate the varist from the estimates names
local open=index("`anything'","[")
local close=index("`anything'","]")

if `open'~=0 & `close'~=0 {
	local estimates=trim(substr("`anything'",`open'+1,`close'-`open'-1))
	local temp1=trim(substr("`anything'",1,`open'-1))
	local temp2=trim(substr("`anything'",`close'+1,length("`anything'")))
	local varlist=trim("`temp1' `temp2'")
}
else {
	local varlist "`anything'"
}

*** varlist, keep, drop, eqkeep, eqdrop
if "`varlist'"~="" & "`keep'"~="" {
	di in yellow "{opt keep( )} supersedes {opt varlist} when both specified"
}
if "`drop'"~="" & "`keep'"~="" {
	di in red "cannot specify both {opt keep( )} and {opt drop( )}"
	exit 198
}

/******* allow this for now due to drop(`_byvars')
if "`drop'"~="" & "`varlist'"~="" {
	* crosstab exception for MISSING
	if "`crosstab'"~="crosstab" {
		di in red "cannot specify both {it:varlist} and {opt drop( )}"
		exit 198
	}
}
*/

if "`eqdrop'"~="" & "`eqkeep'"~="" {
	di in red "cannot specify both {opt eqkeep( )} and {opt eqdrop( )}"
	exit 198
}

*** pre-clean (while data is available)
* unambiguate them
if "`keep'"~="" {
	tsunab keep : `keep'
	macroUnique `keep', names(keep)
}
if "`drop'"~="" {
	* one by one to accomodate MISSING from _tab3
	foreach var in `drop' {
		cap tsunab temp : `var'
		local tempDrop "`tempDrop' `temp'"
	}
	local drop "`tempDrop'"
	macroUnique `drop', names(drop)
}
if "`sortvar'"~="" {
/*	gettoken first second: sortvar, parse(" ")
	local sortvar
	while `"`first'"'~="" {
		cap tsunab temp : `sortvar'
		if !_rc {
			local sortvar `"`sortvar' `temp'"'
		}
		gettoken first second: second, parse(" ")
	}
*/
	tokenize `sortvar'
	local num 1
	local collect ""
	while "``num''"~="" {
		cap tsunab temp : ``num''
		if !_rc {
			local collect "`collect' `temp'" 
		}
		else {
			local collect "`collect' ``num''" 	
		}
		local num=`num'+1
	}
	local sortvar "`collect'"
	macroUnique `sortvar', names(sortvar)
}
if "`sortvar'"~="" & "`groupvar'"~="" {
	noi di in red "cannot choose both {opt sortvar} and {opt groupvar}"
	exit 198
}
if "`groupvar'"~="" {
	tokenize `groupvar'
	local num 1
	local collect ""
	while "``num''"~="" {
		cap tsunab temp : ``num''
		if !_rc {
			local collect "`collect' `temp'" 
		}
		else {
			local collect "`collect' ``num''" 	
		}
		local num=`num'+1
	}
	local groupvar "`collect'"
	macroUnique `groupvar', names(groupvar)
}

* unambiguate the names of stored estimates (wildcards)
if "`estimates'"~="" {
	local collect ""
	foreach var in `estimates' {
		local temp "_est_`var'"
		local collect "`collect' `temp'"
	}
	unab estimates : `collect'
	local collect ""
	foreach var in `estimates' {
		local temp=substr("`var'",6,length("`var'")-4)
		local collect "`collect'`temp' "
	}
	local estimates=trim("`collect'")
}

* or use est_expand


tempname estnameUnique
* a place holding name to the current estimates that has no name entered into the outreg

if "`estimates'"=="" {
	local estStored 0
	local estimates="`estnameUnique'"
}
else {
	if "`Version7'"=="" {
		* it is version 7
		noi di in red "version 7 cannot specify stored estimates: " in white "`estimates'"
		exit 198
	}
	local estStored 1
	*cap local estimates: list uniq local(estimates)
	macroUnique `estimates', names(estimates)
}

*** checking sum and crosstab
local check1 `=("`crosstab'"~="" | "`tab3'"~="")'
local check2 `=("`sum'"~="" | "`sum2'"~="")'
local check3 `=("`mfx'"~="")'
local checks=`check1'+`check2'+`check3'

if `checks'>=2 {
	di in yel "cannot specify more than one of {opt sum}, {opt crosstab}, or {opt mfx} options"
	exit 198
}


if "`sum'"=="sum" & "`sum2'"=="" {
	local sum2 "regress"
}

*** get crosstab
if "`crosstab'"=="crosstab" {
	qui _tab3 `varlist' `if' `in' [`weight'`exp']
	
	local ebnames "e(freq)"
	local eVnames "e(percent)"
	local r2 "nor2"
	local sortcol "name"
	local obs "noobs"
	if `"`addstat'"'=="" {
		local addstat `"addstat("Total", e(total))"'
	}
	else {
		gettoken part rest: addstat, parse(" (")
		gettoken part rest: rest, parse(" (") /* strip off "addstat(" */
		local addstat `"addstat("Total", e(total), `rest'"'
	}
	
	* augment (usually has bys( ) variables in them)
	if `e(total)'==0 {
		local drop `"MISSING `drop'"'
	}
	
	if `"`ctitle0'"'=="" {
		if `"`cttop'"'~="" {
			* this is ugly; put in VARIABLES cell below
			*local ctitle `"`cttop', `varlist'"'
		}
		else {
			local ctitle `"`varlist'"'
		}
	}
	
	local VARIABLES `"`varlist'"'
	local notes "nonotes"
	
	local varlist ""
}
else if "`sum2'"~="" {
	
	local r2 "nor2"
	
	* allowable: log regress noindep detail
	optionSyntax, valid(log regress noindep detail) name(sum2) nameShow(sum( )) content(`sum2')
	
	if "`noindep'"=="noindep" & "`detail'"=="" {
		local regress "regress"
	}
	
	if "`log'"=="log" & "`detail'"=="detail" {
		di in red "cannot use both {opt log} and {opt detail} for {opt sum( )} option"
		exit 198
	}
	if "`log'"=="log" {
		
		* always raw because e(sample) might be empty for version 11
		noi _sum2 `if' `in' [`weight'`exp'], `log' raw
		
		local r2 "nor2"
		local notes "nonotes"
		local aster "noaster"
		local stats "coef"
		local obs "noobs"
		if `"`ctitle0'"'=="" {
			local ctitle `"`cttop', \`depvar'"'
		}
		di
	}
	if "`detail'"=="detail" {
		* always raw because e(sample) might be empty for version 11
		noi _sum2 `if' `in' [`weight'`exp'], `detail' raw
		
		local r2 "nor2"
		local notes "nonotes"
		local aster "noaster"
		local stats "coef"
		local obs "noobs"
		if `"`ctitle0'"'=="" {
			local ctitle `"`cttop', \`depvar'"'
		}
		di
	}
	if "`regress'"=="regress" {
******************** take off the number in the front for reg3 dependent variables 2price 3price etc
******************** unab, tsuab
		
		if "`e(depvar)'"~="" | "`e(depvar)'"~="." {
			local sumVar1 `e(depvar)'
		}
			
			* borrowed from below (for multiple equations)
			* workaround for 8.0: e(b) must be converted to a regular matrix to get at it
			tempname tempMatrix
			mat `tempMatrix'=e(b)
			local sumVar2: colnames `tempMatrix'
			
			* workaround for 8.0: e(b) must be converted to a regular matrix to get at it
			local eqlist: coleq `tempMatrix'
			
			if "`Version7'"~="" {
				local eqlist: list clean local(eqlist)
				local eqlist: list uniq local(eqlist)
			}
			else {
				* probably needed for the first character
				local temp=index("`eqlist'","_")
				if `temp'==1 {
					local eqlist=subinstr("`eqlist'", "_", "", .)
				}
				* also make unique
				macroUnique `eqlist', names(eqlist7) number(eqnum7)
				local eqlist `eqlist7'
			}
			
			* counting the number of equation
			local eqnum: word count `eqlist'
			* local eqnum : list sizeof eqlist
		
		* redundant subtractions
		*local minus "_cons"
		*local sumVar2: list sumVar2 - minus
		* do it by hand:
		tokenize `sumVar2'
		local num 1
		local sumVar2 ""
		while "``num''"~="" {
			if "``num''"~="_cons" {
				local sumVar2 "`sumVar2' ``num''"
			}
			local num=`num'+1
		}
		
		if "`noindep'"=="noindep" {
			noi _sum2 `sumVar2' `if' `in' [`weight'`exp'],  `raw'
		}
		else {
			noi _sum2 `sumVar1' `sumVar2' `if' `in' [`weight'`exp'],  `raw'
		}
		
		if 1<`eqnum' & `eqnum'<. {
			noi di in yel "Check your results; -sum- option not meant for multiple equation model"
		}
	}
	
	local ebnames "e(mean)"
	local eVnames "e(Var)"
	
	if `"`ctitle'"'=="" {
		if `"`cttop'"'=="" {
			local cttop `"mean, (sd)"'
			if `"`if'"'~="" {
				gettoken first second: if, parse(" ")
				local cttop `"`cttop', `second'"'
			}
			if `"`in'"'~="" {
				local cttop `"`cttop', `in'"'
			}
		}
		else {
			local cttop `"`cttop', mean, (sd)"'
			if `"`if'"'~="" {
				gettoken first second: in, parse(" ")
				local cttop `"`cttop', `second'"'
			}
			if `"`in'"'~="" {
				local cttop `"`cttop', `in'"'				
			}
		}
	}
	
	loca sum_N
	local r2 "nor2"
	local notes "nonotes"
	local aster "noaster"
	local sortcol "later"
}
else {

if "`matrix'"~="" {
*** matrix names
	local ebnames "`matrix'"
	local eVnames "e(V)"
	
	if "`stats'"=="" {
		local stats "coef"
	}
	if "`r2'"=="" {
		local r2 "nor2"
	}
	if "`aster'"=="" {
		local aster "noaster"
	}
	if "`notes'"=="" {
		local notes "nonotes"
	}
	if "`ctitle'"=="" {
		local ctitle "`matrix'"
	}
	if "`obs'"=="" {
		local obs "noobs"
	}
}
else {
	*** ereturn matrix names
	if "`mfx'"~="mfx" {
		cap confirm matrix e(b)
		if _rc & "`Version7'"~="" & "`sum2'"=="" {
			if "`varlist'"~="" {
				* sets e(sample)
				di in red "matrix e(b) not found; run or post a regression first"
				exit 111
				*eretSet `varlist'
			}
			else {
				* it does not exist
				di in red "matrix e(b) not found; run or post a regression first"
				exit 111
			}
		}
	}
	*************************** get user specified matrices
	local ebnames "e(b)"
	local eVnames "e(V)"
	
	if "`mfx'"=="mfx" {
		if "`Version7'"~="" {
			cap confirm matrix e(Xmfx_dydx)
			if _rc {
				* it does not exist
				di in red "matrix e(Xmfx_dydx) not found; need to run {cmd:mfx} first"
				exit 111
			}
		}
		local ebnames "e(Xmfx_dydx)"
		local eVnames "e(Xmfx_se_dydx)"
		local eXnames "e(Xmfx_X)"
	}
}
}

* noSE: because se indicates stn.err, convert noSE into something else
if "`se'"=="nose" {
	local se_skip "se_skip"
}

* stats( ) is not compatible with two-column options
if "`stats'"~="" {
	if "`se'"=="nose" {
		di in red "cannot specify both {opt st:ats( )} and {opt nose} options"
		exit 198
	}
	if "`ci'"=="ci" {
		di in red "cannot specify both {opt st:ats( )} and {opt ci} options"
		exit 198
	}
	if "`tstat'"=="tstat" {
		di in red "cannot specify both {opt st:ats( )} and {opt tstat} options"
		exit 198
	}
	if "`pvalue'"=="pvalue" {
		di in red "cannot specify both {opt st:ats( )} and {opt p:value} options"
		exit 198
	}
	if "`beta'"=="beta" {
		di in red "cannot specify both {opt st:ats( )} and {opt be:ta} options"
		exit 198
	}
}

* always se instead of tstat
if "`tstat'"~="tstat" & "`pvalue'"~="pvalue" & "`ci'"~="ci" & "`beta'"~="beta" {
	if "`stats'"=="" {
		local se "se"
	}
}
else {
	local se ""
}

if "`parenthesis'"=="" & "`paren'"~="noparen" {
	if "`ci'"~="" {
		local parenthesis "ci"
	}
	if "`pvalue'"~="" {
		local parenthesis "pval"
	}
	if "`tstat'"~="" {
		local parenthesis "tstat"
	}
	if "`beta'"~="" {
		local parenthesis "beta"
	}
	if "`se'"=="se" {
		local parenthesis "se"
	}
}


*** clean up file name, enclose .txt if no file type is specified
*** else take care of user-specified extension names for excel tex word files
local rest "`using'"
* strip off "using"
gettoken part rest: rest, parse(" ")
* strip off quotes
gettoken first second: rest, parse(" ")
cap local rest: list clean local(rest)

local rabbit `"""'
if index(`"`using'"', ".")==0 {
	local file = `"`rabbit'`first'.txt`rabbit'"'
	local using = `"using `file'"'
}
else {
	local file = `"`rabbit'`first'`rabbit'"'
	local using = `"using `file'"'
	
	* strip off quotes and extension
	gettoken first second: file, parse(" ")
	local temp = `"`first'"'
	
	local next_dot = index(`"`temp'"',".")
	local next_strip = substr(`"`temp'"',1,`=`next_dot'-1')
	local strippedname = substr(`"`temp'"',1,`=`next_dot'-1')
	
	* check for more dots
	local change 0
	while `change'==0 {
		local temp = substr(`"`temp'"',`=`next_dot'+1',.)
		if index(`"`temp'"', ".")~=0 {
			local next_dot = index(`"`temp'"',".")
			local next_strip = substr(`"`temp'"',1,`=`next_dot'-1')
			local strippedname = `"`strippedname'.`next_strip'"'
		}
		else {
			* no change
			local last_strip = `"`temp'"'
			local change 1
		}
	}
	
	*** check for manual rtf doc xlm xls csv extensions
	if `"`last_strip'"'=="rtf" | `"`last_strip'"'=="doc" {
		local word "word"
		
		local file = `"`rabbit'`strippedname'.txt`rabbit'"'
		local using = `"using `file'"'
		local wordFile "`last_strip'"
	}
	if `"`last_strip'"'=="xls" | `"`last_strip'"'=="xml" | `"`last_strip'"'=="xlm" | `"`last_strip'"'=="csv" {
		local excel "excel"
		
		local file = `"`rabbit'`strippedname'.txt`rabbit'"'
		local using = `"using `file'"'
		local excelFile "`last_strip'"
	}
	if `"`last_strip'"'=="tex" {
		if `"`tex1'"'=="" {
			local tex "tex"
		}
		
		local file = `"`rabbit'`strippedname'.txt`rabbit'"'
		local using = `"using `file'"'
		local texFile "`last_strip'"
	}
}

*noi di in red "`next_strip'"
*noi di in red "`last_strip'"
*noi di in red "`strippedname'"


*** confirm the output file existance, to be adjusted later
cap confirm file `file'
if !_rc {
	* it exists
	local fileExist 1
}
else {
	local fileExist 0
}

*** mainfile
* cleaning the user provided inputs

if "`long'"=="long" & "`onecol'"=="onecol" {
	di in yellow "{opt long} implies {opt o:necol} (no need to specify both)"
}
if "`long'"=="long" & "`onecol'"~="onecol" {
	local onecol "onecol"
}

if ("`tstat'"!="")+("`pvalue'"!="")+("`ci'"!="")+("`beta'"!="")>1 {	
	di in red "choose only one of tstat, pvalue, ci, or beta"
	exit 198
}

if `level'<10 | `level'>99 {
	di in red "level() invalid"
	exit 198
}

if `"`paren'"'=="noparen" & `"`parenthesis'"'~="" {
	di in red "cannot choose both {opt nopa:ren} and {opt paren:thesis()} option"
	exit 198
}
if `"`paren'"'=="noparen" & `"`bracketA'"'~="" {
	di in red "cannot choose both {opt nopa:ren} and {opt br:acket()} option"
	exit 198
}
if  `"`bracket'"'~="" & `"`bracketA'"'~="" {
	di in red "cannot choose both {opt br:acket} and {opt br:acket()} option"
	exit 198
}

if "`symbol'"=="" & "`sigsymb'"~= "" {
	local symbol "`sigsymb'"
}
if `"`10pct'"'~="" & "`sigsymb'"~="" {
	di in red "cannot choose both {opt 10pct} and {opt sigsymb( )}"
	exit 198
}

if `"`10pct'"'~="" & "`symbol'"~="" {
	di in red "cannot choose both {opt 10pct} and {opt symbol( )}"
	exit 198
}
if `"`10pct'"'~="" & "`symbol'"=="" {
	local symbol `"symbol(**, *, +)"'
}
if "`aster'"=="noaster" & ("`asterisk'"~="" | "`symbol'"!="") {
	if "`asterisk'"~="" {
		di in red "cannot choose both {opt noaster} and {opt asterisk( )}"
	}
	else {
		di in red "cannot choose both {opt noaster} and {opt symbol( )}"
	}
	exit 198
}

if (`"`addnote'"'!="" & "`append'"=="append" & `fileExist'==1) {
	di in yellow "warning: addnote ignored in appended columns"
}

*** LaTeX options
local tex = ("`tex'"!="")
if "`tex1'"!="" {
	if `tex' {
		di in red "may not specify both {opt tex} and {opt tex()} options"
		exit 198
	}
	local tex 1
	
	gettoken part rest: tex1, parse(" (")
	gettoken texopts zilch: rest, parse(" (") match(parns) /* strip off "tex1()" */
}

_texout_parse, `texopts'

* insert nopretty
local check=index(`"`tex1'"',"nopretty")
if `check'==0 {
	local check=index(`"`tex1'"',"pretty")
	if `check'==0 {
		* neither
		local texopts "nopretty `texopts'"
	}
}


*** label options
if "`label'"=="label" & "`labelA'"~="" {
	di in red "cannot specify both {opt lab:el} and {opt lab:el()} options"
	exit 198
}
if "`labelA'"~="" {
	gettoken part rest: labelA, parse(" (")
	gettoken labelOption zilch: rest, parse(" (") match(parns) /* strip off "label()" */
	local labelOption=trim("`labelOption'")
	if "`labelOption'"~="insert" {
		di in red "cannot specify any option other than {opt insert} for {opt lab:el( )}"
		exit 198
	}
	else if "`labelOption'"~="insert" {
		local label "label"
	}
}

*** equationsA options
if "`equationsA'"~="" {
	gettoken part rest: equationsA, parse(" (")
	gettoken equationsOption zilch: rest, parse(" (") match(parns) /* strip off "label()" */
	local equationsOption=trim("`equationsOption'")
	
	if "`equationsOption'"~="auto" {
		di in red "cannot specify any option other than {opt auto} for {opt eq:uation( )}"
		exit 198
	}
	else if "`equationsOption'"~="auto" {
		*local label "label"
	}
}


if (`"`addstat'"'=="" & "`adec'"!="" & "`e'"=="" ) {
	di in red "cannot choose adec option without addstat option"
	exit 198
}
if "`adec'"=="" {
	* disabled
	* local adec = `dec'
}

if "`quote'"!="quote" {
	local quote "noquote"
}

tempname df_r

if "`margin1'"~="" | "`margin2'"~="" {
	if "`mfx'"=="mfx" {
		di in red "cannot specify both {opt mfx} and {opt margin} options"
		exit 198
	}
	
	local margin = "margin"
	if "`margin2'"~="" {
		local margucp "margucp(_`margin2')"
		scalar `df_r' = .
		if "`margin1'"~="" {
			di in red "may not specify both margin and margin()"
			exit 198
		}
	}
	else {
		if "`cmd'"=="tobit" {
			di in red "dtobit requires margin({u|c|p}) after dtobit command"
			exit 198
		}
	}
}


*** titlefile needs set out here
tempfile titlefile
	
	*** logistic reports coeffients in exponentiated form (odds ratios)
	if "`cmd'"=="logistic" {
		local eform "eform"
		
		* report no cons
		if "`eform'"=="eform" {
			local cons "nocons"
		}
	}
	
	*** stats( ) option cleanup : dealing with rows/stats to be reported per variable/coeff
	local statsValid "coef se tstat pval ci aster blank beta ci_low ci_high N sum_w mean Var sd skewness kurtosis sum min max p1 p5 p10 p25 p50 p75 p90 p95 p99 corr pwcorr spearman "
	
	* level coef_eform se_eform coef_beta se_beta"
	
	local asterAsked 0
	local betaAsked ""
	
	/*
	if `"`estats'"'~="" {
		* the names of the available stats in e(matrices)
		local ematrices ""
		local var: e(matrices)
		
		*noi di in yellow "`var'"
		
		tokenize `var'
		local i=1
		while "``i''"~="" {
			*** di "e(``i'')" _col(25) "`e(``i'')'"
			local ematrices="`ematrices'``i'' "
			local i=`i'+1
		}
	}
	*/
	
	if `"`stats'"'~="" {
		* take out commas
		gettoken one two: stats, `bind' parse(", ")
		gettoken comma rest: two, `bind' parse(", ")
		if "`comma'"=="," {
			local two `"`rest'"'
		}
		local tempList `"`one'"'
		while `"`two'"'~="" {
			gettoken one two: two, `bind' parse(", ")
			gettoken comma rest: two, `bind' parse(", ")
			if "`comma'"=="," {
				local two `"`rest'"'
			}
			local tempList `"`tempList' `one'"'
		}
		local stats `"`tempList'"'
		local tempList
		
		local matlist
		
		
		* need to count using -gettoken, bind- instead of merely -local statsMany : word count `stats'-
		
		local num=1
		local statsMany 1
		
		gettoken one two: stats, `bind'
		local stats`num' `"`one'"'
		local two=trim(`"`two'"')
		
		local stats`num' `"`one'"'
		
		* okay to add:
		local statsList "`statsList' `stats`num''"
		local two=trim(`"`two'"')
		
		while `"`two'"'~="" {
			local num=`num'+1
			local statsMany=`statsMany'+1
			
			gettoken one two: two, `bind' parse(", ")
			gettoken comma rest: two, `bind' parse(", ")
			if "`comma'"=="," {
				local two `"`rest'"'
			}
			
			local stats`num' `"`one'"'
			
			* it must be one of the list
			local test 0
			foreach var in `statsValid' {
				if "`var'"=="`stats`num''" & `test'==0 {
					local test 1
				}
				
				* checking if aster/beta specified
				if "`stats`num''"=="aster" {
					local asterAsked 1
				}
				if "`stats`num''"=="beta" {
					local betaAsked "betaAsked"
				}
			}
			if `test'==0 {
				* not on the list of valid ones
				capture confirm matrix `stats`num''
				if !_rc {
					* matrix exists
					local matlist `"`matlist' `stats`num''"'
	               	}
				else {
					* send it to parser
					cap _stats_parse, `stats`num''
					if _rc~=0 {
						noi di in white "`stats`num''" in red " is not a valid sub-option, matrix, str( ), or cmd( ) for {opt stats( )}"
						exit 198
					}
				}
			}
			
			* okay to add:
			local statsList "`statsList' `stats`num''"
			
			local two=trim(`"`two'"')
		}
	}
	else if "`se_skip'"=="se_skip" {
		local statsMany 1
		local statsList "coef"
	}
	else {
		local statsMany 2
		
		if "`ci'"=="ci" {
			if "`eform'"=="eform" {
				local statsList "coefEform ciEform"
			}
			else {
				local statsList "coef ci"
			}
		}
		else if "`beta'"=="beta" {
			local statsList "coef beta"
		}
		
		* regular: tstat, pval, or se
		else if "`eform'"=="eform" {
			local statsList "coefEform seEform"
			
			if "`tstat'"=="tstat" {
				local statsList "coefEform tstat"
			}
			else if "`pvalue'"=="pvalue" {
				local statsList "coefEform pval"
			}
		}
		else {
			local statsList "coef se"
			
			if "`tstat'"=="tstat" {
				local statsList "coef tstat"
			}
			else if "`pvalue'"=="pvalue" {
				local statsList "coef pval"
			}
		}
	}
	
	* when stats(aster) specified, aster( ) should not be attached to coef unless asked
	if `asterAsked'==1 & "`asterisk'"=="" {
		* the encased blank will trigger the parsing codes in makeFile
		local asterisk " "
	}
	
	
	* update when eform specified
	if "`eform'"=="eform" {
		* blank at end
		local statsList "`statsList' "
		local statsList : subinstr local statsList "coef " "coefEform ", all
		local statsList : subinstr local statsList "ci " "ciEform ", all
		local statsList : subinstr local statsList "se " "seEform ", all
		
		local statsList : subinstr local statsList "ci_high " "ci_highEform ", all
		local statsList : subinstr local statsList "ci_low " "ci_lowEform ", all
	}
	
	* parenthesis locations moved to makeFile
	
	* check that nothing appears in parenthesis( ) does not appear in stats( )
	macroMinus `parenthesis', names(temp) subtract(`statsList' `stats')
	if "`temp'"~="" & "`stats'"~="" {
		noi di in red "`temp' appears in parenthesis( ) but not in stats( )"
		exit 198
	}
	
	
	
	* clean up matlist
	if `"`matlist'"'~="" {
		tokenize `matlist'
		local rnum 1
		local num 1
		while `"``num''"'~="" {
			* take off the parenthesis crap
			local temp
			local temp = substr(`"``num''"',1,2)
			if "`temp'"=="r(" {
				* r( ) matrix
				local content = substr(`"``num''"',3,length("``num''")-3)
				* not currently accepting
				di in red "r-class matrix " in white "``num''" in red " not accepted by {opt stats( )}"
				exit 198
				local rnum=`rnum'+1
			}
			if "`temp'"=="e(" {
				* r( ) matrix
				local content = substr(`"``num''"',3,length("``num''")-3)
				* not currently accepting
				di in red "e-class matrix " in white "``num''" in red " not accepted by {opt stats( )}"
				exit 198
				local rnum=`rnum'+1
			}
			local num=`num'+1
		}
	}
	
	
	*** expand statsList and statsMany according to vector/nonvec matrices
	
	* these two are collected, but not used here
	local vectorList
	local nonvecList
	
	if "`matlist'"~="" {
		tempname matdown
		foreach matname in `matlist' {
			mat `matdown'=`matname'		/* NOT transposed */
			local temp= colsof(`matdown')
			
			if `temp'==1 {
				* it's a vector
				local vectorList "`vectorList' `matname'"
			}
			else {
				* it's a non-vector matrix
				local cc= colsof(`matdown')
				local temp0 : colnames(`matdown')
				local temp
				foreach var in `temp0' {
					local temp "`temp' `matname'_`var'"
				}
				local nonvecList "`nonvecList' `temp'"
				
				* add the empty space at end
				local statsList =`"`statsList' "'
				local statsList =subinstr("`statsList'"," `matname' "," `temp' ",.)
				local statsMany `=`statsMany'+`cc'-1'
			}
		}
	}
	
	
	*** run each estimates consecutively
	local estmax: word count `estimates'
	forval estnum=1/`estmax' {
		local estname: word `estnum' of `estimates'
		if "`estimates'"~="`estnameUnique'" {
			qui estimates restore `estname'
		}
		* to avoid overwriting after the first time, append from the second time around (1 of 3)
		if `estnum'==2 & "`replace'"=="replace" {
			local append "append"
			local replace ""
		}
		
		* the names of the available stats in e( )
		local result "scalars"
			* took out macros from the local result
		local elist=""
		foreach var in `result' {
			local var: e(`var')
			tokenize `var'
			local i=1
			while "``i''"~="" {
				*** di "e(``i'')" _col(25) "`e(``i'')'"
				local elist="`elist'``i'' "
				local i=`i'+1
			}
		}
		*cap local elist: list uniq local(elist)
		macroUnique `elist', names(elist)
		
		* take out N (because it is always reported)
		local subtract "N"
		*cap local elist : list elist - subtract
		macroMinus `elist', names(elist) subtract(`subtract')
		
		* r2 option
		* save the original for the first run and restore prior to each subsequent run
		if `estnum'==1 {
			local r2Save `"`r2'"'
		}
		else {
			local r2 `"`r2Save'"'
		}
		
		*** e(all) option
		* save the original for the first run and restore prior to each subsequent run
		if `estnum'==1 {
			local addstatSave `"`addstat'"'
		}
		else {
			local addstat `"`addstatSave'"'
		}
		
		*** dealing with e( ) option: put it through addstat( )
		* local = expression restricts the length
		*	requires a work-around to avoid subinstr/substr functions
		
		* looking for "all" anywhere
		if "`Version7'"=="" {
			local position=index("`e'","all")
		}
		else {
			local position: list posof "all" in e
		}
		
		if `"`addstat'"'~="" {
			if "`e'"~="" {
				local e: subinstr local e "," " ",all
				*cap local e: list uniq local(e)
				macroUnique `e', names(e)
				
				if `position'~=0 {
					local count: word count `elist'
					local addstat=substr("`addstat'",1,length("`addstat'")-1)
					forval num=1/`count' {
						local wordtemp: word `num' of `elist'
						local addstat "`addstat',`wordtemp',e(`wordtemp')"
					}
				}
				else { /* other than all */
					local count: word count `e'
					local addstat=substr("`addstat'",1,length("`addstat'")-1)
					forval num=1/`count' {
						local wordtemp: word `num' of `e'
						local addstat "`addstat',`wordtemp',e(`wordtemp')"
					}
				}
				local addstat "`addstat')"
			}
		}
		
		* if addstat was previously empty
		else if "`addstat'"=="" {
			if "`e'"~="" {
				local e: subinstr	local e "," " ",all
				*cap local e: list uniq local(e)
				macroUnique `e', names(e)
				if `position'~=0 {
					local count: word count `elist'
					local addstat "addstat("
					forval num=1/`count' {
						local wordtemp: word `num' of `elist'
						local addstat "`addstat'`wordtemp',e(`wordtemp')"
						if `num'<`count' {
							local addstat "`addstat',"
						}
					}
				}
				else {
					local count: word count `e'
					local addstat "addstat("
					forval num=1/`count' {
						local wordtemp: word `num' of `e'
						local addstat "`addstat'`wordtemp',e(`wordtemp')"
						if `num'<`count' {
							local addstat "`addstat',"
						}
					}
				}
				local addstat "`addstat')"
			}
		}
		
		*** dealing with single/multiple equations
		*** also dealing with non-vector matrices, i.e. multiple columns
		
		
		
		
		* getting equation names
		tempname mainMatrix
		mat `mainMatrix'=`ebnames'
		
		* workaround for 8.0: e(b) must be converted to a regular matrix to get at it
		local eqlist: coleq `mainMatrix'
		
		if "`Version7'"~="" {
			local eqlist: list clean local(eqlist)
			local eqlist: list uniq local(eqlist)
		}
		else {
			* probably needed for the first character
			local temp=index("`eqlist'","_")
			if `temp'==1 {
				local eqlist=subinstr("`eqlist'", "_", "", .)
			}
			* also make unique
			macroUnique `eqlist', names(eqlist7) number(eqnum7)
			local eqlist `eqlist7'
		}
		
		* counting before eqkeep/eqdrop
		local eqnum_original: word count `eqlist'
		
		* drop some of multiple equations: 1 of 2
		
		if "`eqdrop'"~="" {
			* may not be a variable
			cap tsunab eqdrop : `eqdrop'
			*cap local eqlist : list eqlist - eqdrop
			macroMinus `eqlist', names(eqlist) subtract(`eqdrop')
			macroUnique `eqlist', names(eqlist)
		}
		
		if "`eqkeep'"~="" {
			* may not be a variable
			cap tsunab eqkeep : `eqkeep'
			local eqlist `"`eqkeep'"'
			macroUnique `eqlist', names(eqlist)
		}
		
		* counting the number of equation
		local eqnum: word count `eqlist'
		* local eqnum : list sizeof eqlist
		
		if "`Version7'"=="" {
			local eqnum `eqnum7'
		}
		
		* 0 if it is multiple equations; 1 if it is a single
		*if 1<`eqnum' & `eqnum'<. {
		if 1<`eqnum_original' & `eqnum_original'<. {
			local univar=0
		}
		else {
			local univar=1
		}
		
		tempname regN rsq numi r2mat    b vc b_alone convert
		*coefcol varname
		
		**** snipped portion moved here from above
		* for svy commands with subpop(), N_sub is # of obs used for estimation
		local cmd = e(cmd)
		
		local svy = substr("`cmd'",1,3)
		if "`svy'"=="svy" & e(N_sub) != . {
			scalar `regN' = e(N_sub)
		}  
		else {
			if "`sum2'"=="" {
				scalar `regN' = e(N)
			}
			else {
				scalar `regN' = e(sum_N)
			}
		}
		
		scalar `df_r' = e(df_r)
		local	depvar  = e(depvar)
		
		mat `b'=`ebnames'
		mat `vc'=`eVnames'
		
		if "`mfx'"=="mfx" {
			mat `vc' = `vc'' * `vc'
		}
		
		local bcols=colsof(`b')	/* cols of b */
		local bocols=`bcols'	/* cols of b only, w/o other stats */
		
		* the work around for xtmixed
		if "`e(N_g)'"=="matrix" {
			mat `convert'=e(N_g)
			scalar `numi'=`convert'[1,1]
		}
		else {
			scalar `numi'	= e(N_g)
		}
		
		local	robust  = e(vcetype)
		if "`robust'"=="." {
			local robust "none"
		}
		local	ivar	 = e(ivar)
		* equals one if true	
		capture local fracpol = (e(fp_cmd)=="fracpoly")
		
		
		*** parse addstat to convert possible r(), e(), and s() macros to numbers
		* (to avoid conflicts with r-class commands used in this program)
		if `"`addstat'"'!="" {
			*** PRE-PARSE with autodigit disabled because r( ) needs to be evaluated before r-class autodigit
			local newadd=""
						
			gettoken part rest: addstat, parse(" (")
			gettoken part rest: rest, parse(" (") /* strip off "addstat(" */
			local i = 1
			while `"`rest'"' != "" {
				gettoken name rest : rest, parse(",") quote
				if `"`name'"'=="" {
					di in red "empty strings not allowed in addstat() option"
					exit 6
				}
				gettoken acomma rest : rest, parse(",")
				gettoken valstr rest : rest, parse(",")
				if `"`rest'"' == "" { /* strip off trailing parenthesis */
					local valstr = substr(`"`valstr'"',1,length(`"`valstr'"')-1)
					local comma2 ""
				}
				else {
					gettoken comma2 rest: rest, parse(",")
				}
				
				* creating e(p) if missing
				if ("`valstr'"=="e(p)" | trim("`valstr'")=="e(p)") & "`e(p)'"=="" {
					if "`e(df_m)'"~="" & "`e(df_r)'"~="" & "`e(F)'"~="" {
						local valstr = Ftail(`e(df_m)',`e(df_r)',`e(F)')
					}
					else if "`e(df_m)'"~="" & "`e(chi2)'"~="" {
						local valstr = chi2tail(`e(df_m)',`e(chi2)')
					}
					* update if xtreg, fe is messing with it
					if "`e(df_m)'"~="" & "`e(df_b)'"~="" & "`e(F)'"~="" {
						local valstr = Ftail(`e(df_b)',`e(df_r)',`e(F)')
					}
					else if "`e(df_b)'"~="" & "`e(chi2)'"~="" {
						local valstr = chi2tail(`e(df_b)',`e(chi2)')
					}
				}
				
				*local value = `valstr'
				*capture confirm number `value'
				*if _rc!=0 {
				* 	* di in red `"`valstr' found where number expected in addstat() option"'
				* 	* exit 7
				*}
				
				local value=`valstr'
				capture confirm number `value'
				
				if _rc==0 {
					* it's a number
					
					local value = `valstr'
					
					local count: word count `adec'
					local aadec : word `i' of `adec'
					
					* coding check: di "adec `adec' i `i' count `count' name `name' value `value'"
					* runs only if the user defined adec is absent for that number
					if `i'>`count' & `i'<. {
						
						* auto-digits: auto( )
						*autodigits2 `value' `auto'
						* needs to be less than 11
						*local valstr = string(`value',"%12.`r(valstr)'")
						local valstr = string(`value')
						if "`valstr'"=="" {
							local valstr .
						}
						local newadd `"`newadd'`name'`acomma'`valstr'`comma2'"'
					}
					else {
						* using previous ones if no other option
						if "`aadec'"=="" {
							local aadec `prvadec'
						}
						local valstr = string(`value',"%12.`aadec'f")
						local newadd `"`newadd'`name'`acomma'`valstr'`comma2'"'
						local prvadec = `aadec'
					}
				}
				else {
					* it's a non-number
					local index=index(`"`valstr'"',"e(")
					if `index'~=0 {
						if `"``valstr''"'=="" {
							* put a dot in there
							local value `"`valstr'"'
							local newadd `"`newadd'`name'`acomma'.`comma2'"'
							noi di in yel `"check {stata eret list} for the existence of `valstr'"'
						}
						else {
							* passthru `valstr'
							local value `"`valstr'"'
							local newadd `"`newadd'`name'`acomma'`valstr'`comma2'"'
						}
					}
					else {
						* evaluate ``valstr''
						local value `"`valstr'"'
						local newadd `"`newadd'`name'`acomma'``valstr''`comma2'"'
					}
				}
				
				local i = `i'+1
			}
			local addstat `"`newadd'"'
			
			*** do it again with autodigit enabled
			local addstat `"addstat(`addstat')"'
			
			local newadd=""
			gettoken part rest: addstat, parse(" (")
			gettoken part rest: rest, parse(" (") /* strip off "addstat(" */
			local i = 1
			while `"`rest'"' != "" {
				gettoken name rest : rest, parse(",") quote
				if `"`name'"'=="" {
					di in red "empty strings not allowed in addstat() option"
					exit 6
				}
				gettoken acomma rest : rest, parse(",")
				gettoken valstr rest : rest, parse(",")
				if `"`rest'"' == "" { /* strip off trailing parenthesis */
					local valstr = substr(`"`valstr'"',1,length(`"`valstr'"')-1)
					local comma2 ""
				}
				else {
					gettoken comma2 rest: rest, parse(",")
				}
				
				* creating e(p) if missing
				if ("`valstr'"=="e(p)" | trim("`valstr'")=="e(p)") & "`e(p)'"=="" {
					if "`e(df_m)'"~="" & "`e(df_r)'"~="" & "`e(F)'"~="" {
						local valstr = Ftail(`e(df_m)',`e(df_r)',`e(F)')
					}
					else if "`e(df_m)'"~="" & "`e(chi2)'"~="" {
						local valstr = chi2tail(`e(df_m)',`e(chi2)')
					}
					* update if xtreg, fe is messing with it
					if "`e(df_m)'"~="" & "`e(df_b)'"~="" & "`e(F)'"~="" {
						local valstr = Ftail(`e(df_b)',`e(df_r)',`e(F)')
					}
					else if "`e(df_b)'"~="" & "`e(chi2)'"~="" {
						local valstr = chi2tail(`e(df_b)',`e(chi2)')
					}
				}
							
				*local value = `valstr'
				*capture confirm number `value'
				*if _rc!=0 {
				* 	* di in red `"`valstr' found where number expected in addstat() option"'
				* 	* exit 7
				*}
				
				local value=`valstr'
				capture confirm number `value'
				
				if _rc==0 {
					* it's a number
					
					local value = `valstr'
					
					local count: word count `adec'
					local aadec : word `i' of `adec'
					
					* coding check: di "adec `adec' i `i' count `count' name `name' value `value'"
					* runs only if the user defined adec is absent for that number
					if `i'>`count' & `i'<. {
						
						* auto-digits: auto( )
						autodigits2 `value' `auto'
						* needs to be less than 11
						local valstr = string(`value',"%12.`r(valstr)'")
						if "`valstr'"=="" {
							local valstr .
						}
						local newadd `"`newadd'`name'`acomma'`valstr'`comma2'"'
					}
					else {
						* using previous ones if no other option
						if "`aadec'"=="" {
							local aadec `prvadec'
						}
						local valstr = string(`value',"%12.`aadec'f")
						local newadd `"`newadd'`name'`acomma'`valstr'`comma2'"'
						local prvadec = `aadec'
					}
				}
				else {
					* it's a non-number
					local index=index(`"`valstr'"',"e(")
					if `index'~=0 {
						if `"``valstr''"'=="" {
							* put a dot in there
							local value `"`valstr'"'
							local newadd `"`newadd'`name'`acomma'.`comma2'"'
							noi di in yel `"`valstr' does not exist; check {stata eret list}"'
						}
						else {
							* passthru `valstr'
							local value `"`valstr'"'
							local newadd `"`newadd'`name'`acomma'``valstr''`comma2'"'
						}
					}
					else {
						* evaluate ``valstr''
						local value `"`valstr'"'
						local newadd `"`newadd'`name'`acomma'`valstr'`comma2'"'
					}
				}
				
				local i = `i'+1
			}
			local addstat `"`newadd'"'
		}
		
		*** to deal with eq(auto)
		if `univar'==0 & "`equationsOption'"=="auto" {
			* this means run once, as if it was a single equation
			local univar 1
		}
		
		/*
		*** to deal with eq(auto)
		if `univar'==0 & "`equationsOption'"=="auto" {
			
			forval count=1/`eqnum' {
				
				local temp_eqname: word `count' of `eqlist'
				tempname temp_eq
				mat `temp_eq' = `b'[.,"`temp_eqname':"]
				
				local these: coleq `temp_eq'
				
				
				* remove roweq for explicit varlist
				mat colnames `temp_eq' = _:
				
				local names: colnames `temp_eq'
				*noi di "colnames `colnames'"
				*local bocols = colsof(`b_eq')
			}
		}
		*/
		
	if "`crosstab'"=="" & "`sum2'"=="" {
		*** ad hoc fixes for various multi-equation models
		if "`cmd'"=="mvreg" | "`cmd'"=="sureg" | "`cmd'"=="reg3" {
			local univar = 0 /* multivariate regression (multiple equations) */
			if "`onecol'" != "onecol" {
				mat `r2mat' = `ebnames' /* get column labels */
				local neq = e(k_eq)
				local depvar = "`eqlist'"
				if "`cmd'"=="mvreg" {
					local r2list = e(r2)
				}
				local eq = 1
				while `eq' <= `neq' {
					if "`cmd'"=="mvreg" {
						local r2str: word `eq' of `r2list'
						scalar `rsq' = real("`r2str'")
					}
					else {
						scalar `rsq' = e(r2_`eq')
					}
					mat `r2mat'[1,`eq'] = `rsq'
					local eq = `eq' + 1
				}
			}
			else {
				/* if onecol */
				local r2 = "nor2"	
				scalar `rsq' = .
			}
		} /* `rsq' after `r2list' to avoid type mismatch */
		
		else if "`adjr2'"=="adjr2" {
			scalar `rsq' = e(r2_a)
			if `rsq' == . {
				di in red "Adjusted R-squared (e(r2_a)) not defined; cannot use adjr2 option"
				exit 198
			}
		}
		else {
			scalar `rsq' = e(r2)
		}
		
		if ("`cmd'"=="intreg" | "`cmd'"=="svyintrg" | "`cmd'"=="xtintreg") {
			local depvar : word 1 of `depvar' /* 2 depvars listed */
		}
		
		* nolabels for anova and fracpoly
		if ("`cmd'"=="anova" | `fracpol' | "`cmd'"=="nl") {
			/* e(fp_cmd)!=. means fracpoly */
			local cons "nocons"
		}
		
		*** margin or dprobit: substitute marginal effects into b and vc
		else if ("`cmd'"=="dprobit" | "`margin'"=="margin") {
			if "`cmd'"=="dlogit2" | "`cmd'"=="dprobit2" | "`cmd'"=="dmlogit2" {
				di in yellow "warning: margin option not needed"
			}
			else {
				marginal2, b(`b') vc(`vc') `se' `margucp'
				local bcols = colsof(`b') /* cols of b */
				local bocols = `bcols' /* cols of b only, w/o other stats */
				if "`cmd'"=="dprobit" {
					local cons "nocons"
				}
			}
		}
	} /* not crosstab or sum */
		
		
		*** to handle single or multiple equations
		local neq = `eqnum'
		local eqlist "`eqlist'"
		if "`onecol'"=="onecol" | `univar'==1 {
			if "`depvar'"=="" {
				local depvar: rowname `ebnames'
				local depvar: word 1 of `depvar'
			}
		}
		
		
		
		*** the column title:
		* save the original ctitle for the first run and restore prior to each subsequent run
		if `estnum'==1 {
			local ctitleSave `"`ctitle'"'
		}
		else {
			local ctitle `"`ctitleSave'"'
		}
		
		local ctitleList `"`ctitle'"'
		
		*** clean up column titles
		* from current, non-stored estimates
		if (`univar'==1 | "`onecol'"=="onecol") & `estStored'==0 {
			if `"`ctitle0'"'=="" & `"`ctitleList'"'=="" {
				if `"`cttop'"'~="" {
					local ctitleList `"`cttop'"'
				}
				if `"`cttop'"'~="" & "`sum'"=="" & "`sum2'"=="" & "`crosstab'"=="" & "`tab3'"=="" {
					local ctitleList `"`cttop', `depvar'"'
				}
				if `"`cttop'"'=="" & "`sum'"=="" & "`sum2'"=="" & "`crosstab'"=="" & "`tab3'"=="" {
					* sometimes multiple depvar, i.e. reg3
					local count: word count `depvar'
					if `count'>=1 & `count'<. {
						local temp: word 1 of `depvar'
						local ctitleList `"`ctitleList' `temp'"'
						forval num=2/`count' {
							local temp: word `num' of `depvar'
							local ctitleList `"`ctitleList', `temp'"'
						}
					}
					else {
						local ctitleList `"`depvar'"'
					}
				}
			}
		}
		else {
			if `"`ctitle0'"'=="" & `estStored'==0 {
				if "`eqname'"~="" {
					* sometimes multiple depvar, i.e. reg3
					local count: word count `depvar'
					if `count'>=1 & `count'<. {
						local temp: word 1 of `depvar'
						local ctitleList `"`eqname', `temp'"'
						forval num=2/`count' {
							local temp: word `num' of `depvar'
							local ctitleList `"`ctitleList' ; `eqname', `temp'"'
						}
					}
				}
				else {
					* sometimes multiple depvar, i.e. reg3
					local count: word count `depvar'
					if `count'>=1 & `count'<. {
						local temp: word 1 of `depvar'
						local ctitleList `"`ctitleList' `temp'"'
						forval num=2/`count' {
							local temp: word `num' of `depvar'
							local ctitleList `"`ctitleList' ; `temp'"'
						}
					}
				}
			}
			else if `"`ctitle0'"'=="" {
				* when from stored estimates
				local ctitleList=`"`estname', `depvar'"'
				if `"`eqname'"'~="" {
					local ctitleList=`"`estname', `eqname', `depvar'"'
				}
			}
		}
		
		if `"ctitleList'"'=="" {
			local ctitleList `"`depvar'"'					
		}
		
		*** when `ebnames' includes extra statistics (which don't have variable labels)
		capture mat `b_alone' = `b'[1,"`depvar':"]
		
		if _rc==0 {
			local bocols = colsof(`b_alone')
		}
		else if ("`cmd'"=="ologit" | "`cmd'"=="oprobit") {
			local bocols = e(df_m)
			mat `b_alone' = `b'[1,1..`bocols']
		}
		else if ("`cmd'"=="cnreg" | ("`cmd'"=="tobit" & "`margin'"~="margin")) {
			local bocols = `bocols'-1 /* last element of `ebnames' is not est coef */
			mat `b_alone' = `b'[1,1..`bocols']
		}
		else if ("`cmd'"=="intreg" | "`cmd'"=="svyintrg") {
			mat `b_alone' = `b'[1,"model:"]
			local bocols = colsof(`b_alone')
		}
		else if ("`cmd'"=="truncreg") {
			mat `b_alone' = `b'[1,"eq1:"]
			local bocols = colsof(`b_alone')
		}
		
		* keep these here for sideway option
		if "`statsListKeep'"=="" {
			local statsListKeep "`statsList'"
			local statsManyKeep "`statsMany'"
		}
		if "`ctitleListKeep'"=="" {
			local ctitleListKeep "`ctitleList'"
		}
		
		
		if "`Version7'"=="" {
			local eqlist "`eqlist7'"
		}
		
		*** create table with makeFile and append to existing table
		* NOTE: makeFile command is rclass
		qui {
			cap preserve
			
			*** make univariate regression table (single equation or single column)
			if `univar'==1 | "`onecol'"=="onecol" {
				
				* changing the equation name of univariate case for housekeeping purposes
				if `univar'==1 & "`onecol'"=="onecol" {
					* attach equation marker for onecol output; it sorts better
					mat colnames `b'= "`depvar':"
				}
				
				*** sideway single equation
				
				if "`sideway'"=="sideway" {
					local sidewayRun "`statsManyKeep'"
					local statsMany 1
				}
				else {
					local sidewayRun 1
				}
				
				forval sidewayWave=1/`sidewayRun' {
					if "`sideway'"=="sideway" {
						* must do it by hand to handle cmd( ) - but "ad hoc" fix inside makeFile
						*local var: word `sidewayWave' of `statsListKeep'
						local statsTwo `"`statsListKeep'"'
						forval temp=1/`sidewayWave' {
							gettoken one statsTwo : statsTwo, `bind'
						}
						local var `"`one'"'
						local statsList `"`var'"'
												
						* parsing ctitleList contents (1.1 of 2), parsing by ";"
						local ctitleTwo `"`ctitleListKeep'"'
						forval temp=1/`=`sidewayWave'*2-1' {
							gettoken one ctitleTwo: ctitleTwo, `bind' parse(";")
						}
						local ctitleList `"`one'"'
						
						if "`crosstab'"=="crosstab" {
							if `sidewayRun'==1 {
								local ctitleList `"`cttop', Freq, (Percent)"'
							}
							else {
								if `sidewayWave'==1 {
									local ctitleList `"`cttop', Freq"'
								}
								else {
									local ctitleList `"`cttop', Percent"'
								}
							}
						}
						else if `"`ctitleList'"'=="" & `"`cttop'"'~="" {
							if `sidewayWave'==1 {
								local ctitleList `"`cttop', `depvar', `var'"'
							}
							else {
								local ctitleList `"`var'"'
							}
						}
						else if `"`ctitleList'"'=="" {
							if `sidewayWave'==1 {
								local ctitleList "`depvar', `var'"
							}
							else {
								local ctitleList `"`var'"'
							}
						}
						if `"`ctitleList'"'=="" {
							local ctitleList `"`ctitleListKeep'"'
						}
					}
					
					* to avoid overwriting after the first time, append from the second time around (2 of 3)
					if `sidewayWave'==2 & "`replace'"=="replace" {
						local append "append"
						local replace ""
					}
				if "`Version7'"=="" {
					* it is version 7
					* b(`b') instead of b(`b_eq'), vc(`vc') instead of vc(`vc_eq')
					makeFile `varlist', equationsOption(`equationsOption') keep(`keep') drop(`drop') 					/*
						*/ eqkeep(`eqkeep') eqdrop(`eqdrop') eqlist(`eqlist') 								/*
						*/ `betaAsked' statsMany(`statsMany') statsList(`statsList') `se_skip' `beta' level(`level')		/*
						*/ dec(`dec') fmt(`fmt') bdec(`bdec') bfmt(`bfmt') sdec(`sdec') sfmt(`sfmt') 					/*
						*/ tdec(`tdec') 			pdec(`pdec') 										/*
						*/ rdec(`rdec') 			adec(`adec') 										/*
						*/ `paren' parenthesis(`parenthesis') `bracket'										/*
						*/ bracketA(`bracketA') `aster' `symbol' `cons' `eform' `obs' `ni' `r2' `adjr2' 				/*
						*/ ctitleList(`ctitleList') auto(`auto') `noauto'											/*
						*/ addstat(`addstat') addtext(`addtext') `notes'									/*
						*/ `addnote' `append' regN(`regN') df_r(`df_r') rsq(`rsq') numi(`numi') ivar(`ivar') depvar(`depvar')	/*
						*/ robust(`robust') borows(`bocols') b(`b') vc(`vc') 									/*
						*/ univar(`univar') `onecol' estname(`estname') estnameUnique(`estnameUnique')				/*
						*/ fileExist(`fileExist') less(`less') alpha(`alpha') asterisk(`asterisk') `2aster'				/*
						*/ variables(`VARIABLES') matlist(`matlist') leave(`leave') sidewayWave(`sidewayWave')
					* taken out: `se' `pvalue' `ci' `tstat'
				}
				else {
					* b(`b') instead of b(`b_eq'), vc(`vc') instead of vc(`vc_eq')
					makeFile `varlist', equationsOption(`equationsOption') keep(`keep') drop(`drop') 					/*
						*/ eqkeep(`eqkeep') eqdrop(`eqdrop') eqlist(`eqlist') 								/*
						*/ `betaAsked' statsMany(`statsMany') statsList(`statsList') `se_skip' `beta' level(`level')		/*
						*/ dec(`dec') fmt(`fmt') bdec(`bdec') bfmt(`bfmt') sdec(`sdec') sfmt(`sfmt') 					/*
						*/ tdec(`tdec') tfmt(`tfmt') pdec(`pdec') pfmt(`pfmt') 								/*
						*/ rdec(`rdec') rfmt(`rfmt') adec(`adec') afmt(`afmt')								/*
						*/ `paren' parenthesis(`parenthesis') `bracket'										/*
						*/ bracketA(`bracketA') `aster' `symbol' `cons' `eform' `obs' `ni' `r2' `adjr2' 				/*
						*/ ctitleList(`ctitleList') auto(`auto') `noauto'											/*
						*/ addstat(`addstat') addtext(`addtext') `notes'									/*
						*/ `addnote' `append' regN(`regN') df_r(`df_r') rsq(`rsq') numi(`numi') ivar(`ivar') depvar(`depvar')	/*
						*/ robust(`robust') borows(`bocols') b(`b') vc(`vc') 									/*
						*/ univar(`univar') `onecol' estname(`estname') estnameUnique(`estnameUnique')				/*
						*/ fileExist(`fileExist') less(`less') alpha(`alpha') asterisk(`asterisk') `2aster'				/*
						*/ variables(`VARIABLES') matlist(`matlist') leave(`leave') sidewayWave(`sidewayWave')
					* taken out: `se' `pvalue' `ci' `tstat'
				}
					
					*if "`append'"~="append" {
					if "`append'"~="append" & `sidewayWave'==1 {
						* replace
						
						sleep `slow'	/* wait 1000 ms = 1 second before trying again */
						outsheet nameCol reportCol `using', nonames `quote' `comma' replace
						local fileExist 1
					}
					
					else {
						*** appending
						* confirm the existence of the output file
						local rest "`using'"
						* strip off "using"
						gettoken part rest: rest, parse(" ")
						if `fileExist'==1 {
							appendFile `using',   titlefile(`titlefile') /*
								*/`sideway' `onecol' sortcol(`sortcol') sortvar(`sortvar') groupvar(`groupvar') `quote' `comma' slow(`slow')
							
							sleep `slow'	/* wait 1000 ms = 1 second before trying again */
							outsheet v* reportCol `using', nonames `quote' `comma' replace
							*drop v*
						}
						else {
							* does not exist and therefore needs to be created
							sleep `slow'	/* wait 1000 ms = 1 second before trying again */
							outsheet nameCol reportCol `using', nonames `quote' `comma' replace
							local fileExist 1
						}
					}
					restore, preserve
				} /* sideway single equation */
			}
			
			*** make multiple equation regression table
			else {
				
				tempname b_eq vc_eq
				
				* getting the depvar list from eqlist
				local eq = 1
				while `eq' <= `neq' {
					
					local eqname: word `eq' of `eqlist'
					local depvar: word `eq' of `eqlist'
					
					if `eq'==1 {
						if `estStored'==1 & "`estname'"~="" {
							if `"`ctitle0'"'=="" & `eq'==1 {
								*local ctitleList "`estname', `depvar'"
								local ctitleList "`estname', `depvar'"
							}
						}
						else {
							if `"`cttop'"'~="" {
								local ctitleList "`cttop', `depvar'"
							}
							else {
								local ctitleList "`depvar'"
							}
						}
					}
					else {
						* subsequent columns
						if `estStored'==1 & "`estname'"~="" {
							local ctitleList ", `depvar'"
						}
						else {
							local ctitleList "`depvar'"
						}
					}
					
					*** r2mat doesn't exist for mlogit ="capture" 
					capture scalar `rsq' = `r2mat'[1,`eq']
					mat `b_eq' = `b'[.,"`eqname':"]
					
					* remove roweq from b_eq for explicit varlist
					matrix colnames `b_eq' = _:
					mat `vc_eq' = `vc'["`eqname':","`eqname':"]
					local bocols = colsof(`b_eq')
					
					*** sideway multiple equation
					
					if "`sideway'"=="sideway" {
						local sidewayRun "`statsManyKeep'"
						local statsMany 1
					}
					else {
						local sidewayRun 1
					}
					
					forval sidewayWave=1/`sidewayRun' {
						if "`sideway'"=="sideway" {
							* must do it by hand to handle cmd( ) - but "ad hoc" fix inside makeFile
							*local var: word `sidewayWave' of `statsListKeep'
							local statsTwo `"`statsListKeep'"'
							forval temp=1/`sidewayWave' {
								gettoken one statsTwo : statsTwo, `bind'
							}
							local var `"`one'"'
							local statsList "`var'"
							
							/*
							* parsing ctitleList contents (1.2 of 2), parsing by ";"
							local ctitleTwo `"`ctitleListKeep'"'
							forval temp=1/`=`sidewayWave'*2-1' {
								gettoken one ctitleTwo: ctitleTwo, `bind' parse(";")
							}
							local ctitleList1 `"`ctitleList', `one'"'
							*/
							
							local ctitleList1 `"`ctitleList'"'
							if `"`ctitleList1'"'=="" {
								local ctitleList1 "`var'"
							}
						}
						else {
							local ctitleList1 `"`ctitleList'"'
						}
						
						* to avoid overwriting after the first time, append from the second time around (3 of 3)
						if `sidewayWave'==2 & "`replace'"=="replace" {
							local append "append"
							local replace ""
						}
						
						if `eq'>1 & `sidewayWave'>1 {
							local addstat ""
						}
						
						if `eq' == 1 & "`append'"!="append" & `sidewayWave'==1 {
							local apptmp ""
						}
						else {
							local apptmp "append"
						}
						
					if "`Version7'"=="" {
						* it is version 7
						makeFile `varlist', equationsOption(`equationsOption') keep(`keep') drop(`drop')					/*
							*/ eqkeep(`eqkeep') eqdrop(`eqdrop') eqlist(`eqlist')									/*
							*/ `betaAsked' statsMany(`statsMany') statsList(`statsList') `se_skip' `beta' level(`level')		/*
							*/ dec(`dec') fmt(`fmt') bdec(`bdec') bfmt(`bfmt') sdec(`sdec') sfmt(`sfmt') 					/*
							*/ tdec(`tdec') 			pdec(`pdec') 										/*
							*/ rdec(`rdec') 			adec(`adec') 										/*
							*/ `paren' parenthesis(`parenthesis') `bracket'										/*
							*/ bracketA(`bracketA') `aster' `symbol' `cons' `eform' `obs' `ni' `r2' `adjr2'				/*
							*/ ctitleList(`ctitleList1') auto(`auto') `noauto'											/*
							*/ addstat(`addstat') addtext(`addtext') `notes'									/*
							*/ `addnote' `apptmp' regN(`regN') df_r(`df_r') rsq(`rsq') numi(`numi') ivar(`ivar') depvar(`depvar')	/*
							*/ robust(`robust') borows(`bocols') b(`b_eq') vc(`vc_eq') 								/*
							*/ univar(`univar') `onecol' estname(`estname') estnameUnique(`estnameUnique')				/*
							*/ fileExist(`fileExist') less(`less') alpha(`alpha') asterisk(`asterisk') `2aster'				/*
							*/ variables(`VARIABLES') matlist(`matlist') leave(`leave') sidewayWave(`sidewayWave')
						* taken out: `se' `pvalue' `ci' `tstat'
					}
					else {
						makeFile `varlist', equationsOption(`equationsOption') keep(`keep') drop(`drop')					/*
							*/ eqkeep(`eqkeep') eqdrop(`eqdrop') eqlist(`eqlist')									/*
							*/ `betaAsked' statsMany(`statsMany') statsList(`statsList') `se_skip' `beta' level(`level')		/*
							*/ dec(`dec') fmt(`fmt') bdec(`bdec') bfmt(`bfmt') sdec(`sdec') sfmt(`sfmt') 					/*
							*/ tdec(`tdec') tfmt(`tfmt') pdec(`pdec') pfmt(`pfmt') 								/*
							*/ rdec(`rdec') rfmt(`rfmt') adec(`adec') afmt(`afmt')								/*
							*/ `paren' parenthesis(`parenthesis') `bracket'										/*
							*/ bracketA(`bracketA') `aster' `symbol' `cons' `eform' `obs' `ni' `r2' `adjr2'				/*
							*/ ctitleList(`ctitleList1') auto(`auto') `noauto'											/*
							*/ addstat(`addstat') addtext(`addtext') `notes'									/*
							*/ `addnote' `apptmp' regN(`regN') df_r(`df_r') rsq(`rsq') numi(`numi') ivar(`ivar') depvar(`depvar')	/*
							*/ robust(`robust') borows(`bocols') b(`b_eq') vc(`vc_eq') 								/*
							*/ univar(`univar') `onecol' estname(`estname') estnameUnique(`estnameUnique')				/*
							*/ fileExist(`fileExist') less(`less') alpha(`alpha') asterisk(`asterisk') `2aster'				/*
							*/ variables(`VARIABLES') matlist(`matlist') leave(`leave') sidewayWave(`sidewayWave')
						* taken out: `se' `pvalue' `ci' `tstat'
					}
					
						* create new file: replace and the first equation		
						if `eq' == 1 & "`append'"!="append" & `sidewayWave'==1 {
							sleep `slow'	/* wait 1000 ms = 1 second before trying again */
							outsheet nameCol reportCol `using', nonames `quote' `comma' `replace'
							local fileExist 1
						}
						* appending here: another estimates or another equation
						else {
							* confirm the existence of the output file
							local rest "`using'"
						 	* strip off "using"
							gettoken part rest: rest, parse(" ")
							if `fileExist'==1 {
								* it exists: keep on appending even if it's the first equation
								appendFile `using', titlefile(`titlefile') `sideway' /*
									*/ `onecol' sortcol(`sortcol') sortvar(`sortvar') groupvar(`groupvar') `quote' `comma' slow(`slow')
								sleep `slow'	/* wait 1000 ms = 1 second before trying again */
								outsheet v* reportCol `using', nonames `quote' `comma' replace
								*drop v*
							}
							else {
								* does not exist and specified append: need to be created for the first equation only
								*if `eq' == 1 & "`append'"=="append" {
								if `eq' == 1 & "`append'"=="append" & `sidewayWave'==1 {
									sleep `slow'	/* wait 1000 ms = 1 second before trying again */
									outsheet nameCol reportCol `using', nonames `quote' `comma' `replace'
									local fileExist 1
								}
							}
						}
						
						restore, preserve
					}  /* sideway multiple equation */
					
					local eq = `eq' + 1
					
					*restore, preserve /* to access var labels after first equation */
				}
			}	
		}		/* for quietly */
	}		/* run each estimates consecutively */
	
	
	quietly {
		
		*** clean the files to be preared for output
		if "`pivot'"=="pivot" {
			
			*** pivot and xpose here
			_sxpose `using', `quote' `comma' title(`title') titlefile(`titlefile') `label' /*
				*/ labelOption(`labelOption')
			* c_locals titleWide headRow bottomRow
		}
		else {
			cleanFile `using', `quote' `comma' title(`title') titlefile(`titlefile') `label' /*
				*/ labelOption(`labelOption') slow(`slow')
			* c_locals titleWide headRow bottomRow
		}
		
		
		*** preparing for outputs and seeout
		ren v1 coef
		cap ren v0 eq
		
		unab vlist : v*
		local count: word count `vlist'
		forval num=1/`count' {
			local vname: word `num' of `vlist'
			ren `vname' v`num'
		}
		
		
		* number of columns
		describe, short
		local numcol = `r(k)'
		
		
		tempvar blanks rowmiss
		gen int `blanks' = (trim(v1)=="")
		
		foreach var of varlist v* {
			replace `blanks' = `blanks' & (trim(`var')=="")
		}
		
		replace `blanks'=0 if coef==`"`VARIABLES'"' | coef[_n-1]==`"`VARIABLES'"'
		
		* fix blanks==1 for groupvar( )
		count if `blanks'==1
		local rN=`r(N)'+1
		forval num=1/`rN' {
			replace `blanks'=0 if `blanks'[_n+1]==0 & `blanks'==1
		}
		
		* headBorder & bottomBorder
		local headBorder=`headRow'+`titleWide'
		local bottomBorder=`bottomRow'+`titleWide' /* add eqAdded later */
		
		
		*** making alternative output files
		if "`long'"=="long" | `tex'==1 | "`word'"=="word" | "`excel'"=="excel" | "`text'"=="text" | "`pivot'"=="pivot" {
			
			if "`text'"=="text" | ("`long'"=="long" & "`onecol'"=="onecol") {
				local dot=index(`"`using'"',".")
				if `dot'~=0 {
					local before=substr(`"`using'"',1,`dot'-1)
					local after=substr(`"`using'"',`dot'+1,length("`using'"))
					
					*local usingLong=`"`before'_long.`after'"'
					local usingLong=`"`before'_exact.`after'"'
				}
			}
			
			local eq_exist
			capture confirm variable eq
			*if _rc~=0 & "`long'"=="long" {
			*	noi di in yellow "equation not detected; {opt long} may not be needed"
			*}
			
			*** convert the data into long format (insert the equation names if they exist)
			if _rc==0 & "`long'"=="long" & "`onecol'"=="onecol" {		
				* a routine to insert equation names into coefficient column
				count if `blanks'==0 & eq~="" & eq~="EQUATION"
				
				gen float id5=_n
				local _firstN=_N
				set obs `=_N+`r(N)''
				local times 1
				forval num=2/`_firstN' {
					if eq[`num']~="" & eq[`num']~="EQUATION" {
						replace id5=`num'-.5 in `=`_firstN'+`times''
						local times=`times'+1
					}
				}
				* eqAdded here:
				local bottomBorder=`bottomBorder'+`r(N)'

				count if `blanks'==0 & eq~="" & eq~="EQUATION"
				local _firstN=_N
				set obs `=_N+`r(N)''
				local times 1
				forval num=2/`_firstN' {
					if eq[`num']~="" & eq[`num']~="EQUATION" {
						replace id5=`num'-.75 in `=`_firstN'+`times''
						replace coef=eq[`num'] in `=`_firstN'+`times'' 
						local times=`times'+1
					}
				}
				
				
				sort id5
				
				drop eq id5 `blanks'
				
				* change `bottomBorder' by the number of equations inserted
				local bottomBorder=`bottomBorder'+`r(N)'
				
				* v names
				unab vlist : *
				local count: word count `vlist'
				forval num=1/`count' {
					local vname: word `num' of `vlist'
					ren `vname' c`num'
				}
				forval num=1/`count' {
					local vname: word `num' of `vlist'
					ren c`num' v`num'
				}
				
				if "`text'"=="text" {
					sleep `slow'	/* wait 1000 ms = 1 second before trying again */
					outsheet v* `usingLong', nonames `quote' `comma' replace
				}
				
			} /* long format */
			
			else {
				drop `blanks'
				
				* v names
				unab vlist : *
				local count: word count `vlist'
				forval num=1/`count' {
					local vname: word `num' of `vlist'
					ren `vname' c`num'
				}
				forval num=1/`count' {
					local vname: word `num' of `vlist'
					ren c`num' v`num'
				}
			}
			
			*** label replacement
			if "`label'"=="label" {
				if ("`long'"~="long" & "`onecol'"~="onecol") | ("`long'"=="long" & "`onecol'"=="onecol") {
					replace v2=v1 if v2==""
					drop v1
					describe, short
					forval num=1/`r(k)' {
						ren v`=`num'+1' v`num'
					}
					
					* change LABELS to VARIABLES in 1/3
					replace v1=`"`VARIABLES'"' if v1=="LABELS"
				}
				else if "`long'"~="long" & "`onecol'"=="onecol" {
					replace v3=v2 if v3==""
					drop v2
					describe, short
					forval num=2/`r(k)' {
						ren v`=`num'+1' v`num'
					}
					
					* change LABELS to VARIABLES
					replace v2=`"`VARIABLES'"' if v2=="LABELS"
				}
				
				* create new text file
				* do it for _long file as well
				if "`text'"=="text" {
					
				}
			}
			else if "`labelOption'"=="insert" {
				* label inserted earlier
			}
			
			tempfile outing
			save `outing'
			
			
			*** Pivot thing
			if "`pivot'"=="pivot" {
				* produce verbatim text
				
			}
			
			
			*** Text thing
			if "`text'"=="text" & "`label'"=="label" {
				* produce verbatim text
				sleep `slow'	/* wait 1000 ms = 1 second before trying again */
				outsheet v* `usingLong', nonames `quote' `comma' replace
			}
			
			*** LaTeX thing
			if `tex' {
				
				* make certain `1' is not `using' (another context)
				
				_texout v* using `"`strippedname'"', texFile(`texFile') titleWide(`titleWide') headBorder(`headBorder') bottomBorder(`bottomBorder') `texopts' replace
				
				if `"`texFile'"'=="" {
					local endName "tex"
				}
				else {
					local endName "`texFile'"
				}
				
				local usingTerm `"`strippedname'.`endName'"'
				
				c_local cl_tex `"{stata `"shellout using `"`usingTerm'"'"':`usingTerm'}"'
				*noi di as txt `"`cl_tex'"'
			}
			
			*** Word rtf file thing
			if "`word'"=="word" {
				use `outing',clear
				
				* there must be varlist to avoid error
				*out2rtf2 v* `using',  titleWide(`titleWide') headBorder(`headBorder') bottomBorder(`bottomBorder') replace nopretty
				out2rtf2 v* using `"`strippedname'"', wordFile(`wordFile') titleWide(`titleWide') /*
					*/ headBorder(`headBorder') bottomBorder(`bottomBorder') replace nopretty
				local temp `r(documentname)'
				
				* strip off "using" and quotes
				gettoken part rest: temp, parse(" ")
				gettoken usingTerm second: rest, parse(" ")
				
				* from school
				*local cl `"{stata shell winexec cmd /c tommy.rtf & exit `usingTerm' & EXIT :`usingTerm' }"'
				* these work but leaves the window open
				*local cl `"{stata winexec cmd /c "`usingTerm'" & EXIT :`usingTerm'}"'
				*local cl `"{stata shell "`usingTerm'" & EXIT :`usingTerm'}"'
				*local cl `"{stata shell cmd /c "`usingTerm'" & EXIT :`usingTerm'}"'
				
				c_local cl_word `"{stata `"shellout using `"`usingTerm'"'"':`usingTerm'}"'
				*noi di as txt `"`cl_word'"'
			}
			
			*** Excel xml file thing
			if "`excel'"=="excel" {
				use `outing',clear
				
				*tempfile fileXml
				*xmlsave `"`strippedname'.xml"',doctype(excel) replace legible
				
				_xmlout using `"`strippedname'"', excelFile(`excelFile') nonames titleWide(`titleWide') /*
					*/ headBorder(`headBorder') bottomBorder(`bottomBorder') 
				
				if `"`excelFile'"'=="" {
					local endName "xml"
				}
				else {
					local endName "`excelFile'"
				}
				
				local usingTerm `"`strippedname'.`endName'"'
				
				*c_local cl_excel `"{stata `"shellout using `"`usingTerm'"'"':`usingTerm'}"'
				c_local cl_excel `"{browse `"`usingTerm'"'}"'
				*noi di as txt `"`cl_excel'"'
			}
		} /* output files */
	}  /* quietly */


*** see the output
if "`label'"=="label" | "`labelOption'"=="insert" {
	if "`seeout'"=="seeout" {
		if "`label'"=="label" {
			seeing `using', label
		}
		else {
			seeing `using', label(`labelOption')
		}
	}
	if "`label'"=="label" {
		c_local cl_see `"{stata `"seeout using `file', label"':seeout}"'
	}
	else {
		c_local cl_see `"{stata `"seeout using `file', label(`labelOption')"':seeout}"'
	}
	*di as txt `"`cl'"'
}
else {
	if "`seeout'"=="seeout" {
		seeing `using'
	}
	c_local cl_see `"{stata `"seeout using `file'"':seeout}"'
	*di as txt `"`cl'"'
}

end		/* end of _outreg2 */


********************************************************************************************


program define appendFile
* previously appfile2

	versionSet
	version `version'

* append regression results to pre-existing file

syntax using/, titlefile(string) [sideway onecol sortcol(string) sortvar(string) groupvar(string) /*
	*/  noQUOte comma slow(numlist)]

*** take out VARIABLES as the column heading and restore later
*local VARIABLES2 "`variables'"

* first name is the VARIABLES
local content
local num 1
local N=_N
while `"`content'"'=="" & `num'<=`N' {
	local content=nameCol[`num']
	local num=`num'+1
}
local VARIABLES2 `"`content'"'
replace nameCol = "" if nameCol==`"`VARIABLES2'"' & rowtype2==-1


* column number rows
* pre-create Vorder here
gen Vorder2=0 if rowtype2==0
while Vorder2[1]==. {
	replace Vorder2=Vorder2[_n+1]-1 if rowtype2==-1
}
egen min=min(Vorder2)
replace Vorder2=-99 if Vorder2==min
drop min

* Constant is now done as eqOrder0 + .5
*replace Vorder2=2 if nameCol=="Constant" /* ok because equation names would still be attached if present */

* orders bottom row, Observations, r2, and else
replace Vorder2=3.8 if rowtype2>=2 
replace Vorder2=Vorder2[_n-1]+.0001 if Vorder2>=3.8 & rowtype2==3
replace Vorder2=2 if rowtype2==2
replace Vorder2=3.5 if nameCol=="Observations"
replace Vorder2=3.6 if nameCol=="R-squared"

replace Vorder2=1 if Vorder2==. & (Vorder2[_n-1]<1 | Vorder2[_n-1]==1)
replace Vorder2=2.5 if nameCol=="" & (Vorder2[_n-1]==2 | Vorder2[_n-1]==2.5)


* genderate eq_order2 (handles Constant within each equation)
local N=_N
gen eq_order2=0 in 3/`N' if eqName~=""
replace eq_order2=1 in 3/`N' if eqName[_n]~=eqName[_n-1] & eqName~=""
replace eq_order2=eq_order2+eq_order2[_n-1] if eq_order2+eq_order2[_n-1]~=.

* generating order within each coefficient, use sortvar( ) if available
gen Vorder2_0=.
local maxnum 1
if "`sortvar'"~="" {
	tokenize `sortvar'
	local num 1
	while "``num''"~="" {
		replace Vorder2_0=`num' if VarName=="``num''"
		local num=`num'+1
	}
	if `num'>`maxnum' {
		local maxnum `num'
	}
}

* the evil twin of sortvar that will insert blanks/groups as well as order the existing variables 
if "`groupvar'"~="" {
	* stats rows per variable
	count if nameCol~="" & rowtype2==1
	local nom `r(N)'
	count if rowtype2==1
	if `nom'~=0 {
		local rN=`r(N)'
		*local many=int(round(`rN'/`nom'))
		local many=int(round(`rN'/`nom',1))
	}
	else {
		local many 2
	}
				
				* eqnames for multiple equation
				tab eqName if rowtype2==1
				local rr=`r(r)'
				local tempList
				local orderlist
				if `rr'> 0 {
					* get eq names
					
					gen str5 temp=""
					replace temp=eqName if eqName~=eqName[_n-1] & rowtype2==1
					sort temp
					local N=_N
					forval num=1/`rr' {
						local content=temp[`N'-`num'+1]
						local tempList="`tempList' `content'"
						local content=eq_order2[`N'-`num'+1]
						local orderlist="`orderlist' `content'"
					}
					drop temp
					sort mrgrow
					local times `rr'
				}
				else {
					* it's a single equation, run it once
					local times 1
				}
				
				
	tokenize `groupvar'
	forval kk=1/`times' {
		local order: word `kk' of `orderlist'
		local temp: word `kk' of `tempList'
		
		local num 1
		local count0 0
		while "``num''"~="" {
			replace Vorder2_0=`num' if VarName=="``num''" & eqName=="`temp'"
			count if Vorder2_0~=. & eqName=="`temp'"
			if `r(N)'==`count0' {
				forval cc=1/`many' {
					* insert this many blank var
					local N=_N
					set obs `=`N'+1'
					local N=_N
					if `cc'==1 {
						replace nameCol="``num''" in `N'
					}
					replace VarName="``num''" in `N'
					replace rowtype2=1 in `N'
					replace Vorder2=1 in `N'
					replace Vorder2_0=`num' in `N'
					
					* for multiple equation only
					if `rr'>0 {
						if `cc'==1 {
							replace nameCol="`temp':" + nameCol in `N'
						}
						replace eq_order2=`order' in `N'
						replace eqName="`temp'" in `N'
					}
				}
			}
			count if Vorder2_0~=. & eqName=="`temp'"
			local count0 `r(N)'
			local num=`num'+1
		}
		if `num'>`maxnum' {
			local maxnum `num'
		}
	}
}


* own column to handle sortvar (to handle in mutliple equation)
gen sortvarCol2=Vorder2_0

gen temp=_n
replace Vorder2_0 = temp+`maxnum' if Vorder2==1 & nameCol~="" & Vorder2_0==.
replace Vorder2_0 = Vorder2_0[_n-1]     if Vorder2_0==. & Vorder2==1
drop temp

replace sortvarCol2=Vorder2_0 if sortvarCol2~=.

gen double Vorder2_1 = Vorder2_0 if Vorder2==1 & nameCol~=""
replace Vorder2_1 = Vorder2_1[_n-1]+.01 if Vorder2_1==. & Vorder2==1

* for groupvar( ) above
sort Vorder2 eq_order2 Vorder2_1 mrgrow
replace mrgrow=_n


tempfile tmpf1

gen str8 mergeOn = ""
replace mergeOn = nameCol				/* room for "!" at end */

gen str8 varsml=""
replace varsml = trim(mergeOn)

* fill the spaces between the names
local N=_N

replace mergeOn = mergeOn[_n-1]+"!" if varsml==""
replace mergeOn = "bottomRow" if rowtype2==2
replace mergeOn = "topRow" if rowtype2==0
replace mergeOn = "_000" if rowtype2==-1
gen varnum = Vorder2 if Vorder2<1

* add "!" to variable name to make it sort after previous variable name
* will cause bug if both "varname" and "varname!" already exist

count if (varsml=="" | (varsml[_n+1]=="" & _n!=_N))
local ncoeff2 = r(N)				/* number of estimated coefficients in file 2 */
local N2 = _N					/* number of lines in file 2 */
gen Vord2 = _n					/* ordering variable for file 2 */

ren VarName VarName2
ren eqName eqName2

drop varsml

* eqName vs eqName2
keep nameCol reportCol mergeOn varnum Vord2 Vorder2 Vorder2_0 Vorder2_1 VarName2 eqName2 eq_order2 rowtype2 sortvarCol2

tempfile mergeVarFile mergeEqFile
gen str8 mergeVar=""
gen str8 mergeEq=""

* two sorting/merging mechanism
local N=_N
count if eqName2=="" | eqName2=="EQUATION"
if `N'==`r(N)' {
	* single equation
	local usingSingle 1
	replace mergeVar=mergeOn
	
	sort mergeVar varnum
	save `mergeVarFile', replace
}
else {
	* multiple equations
	local usingSingle 0
	replace mergeEq=mergeOn
	
	replace mergeVar = mergeOn
	replace mergeVar = VarName2 if VarName2~="" & Vorder2==1
	replace mergeVar = "Constant" if VarName2=="_cons" &  Vorder2==1
	replace mergeVar = mergeVar[_n-1]+"!" if mergeVar==mergeVar[_n-1] & mergeVar~="" & Vorder2==1
	
	sort mergeVar varnum
	save `mergeVarFile', replace
	
	sort mergeEq varnum
	save `mergeEqFile', replace
}




*** prepare the original file for merging

if "`Version7'"=="" {
	* it is version 7
	sleep `slow'	/* wait 1000 ms = 1 second before trying again */
	insheet using `"`using'"', nonames clear
}
else {
	* requires 8 or above
	_chewfile using `"`using'"', semiclear
	local num 1
	foreach var of varlist _all {
		ren `var' v`num'
		local num=`num'+1
	}
}

if "`sideway'"=="sideway" {
	* if sideway, need to split eqname and varname, no label or title here
	cleanFile using `"`using'"', `quote' `comma' notitle slow(`slow')
	
	* get ride of v0 in case of equation
	sleep `slow'	/* wait 1000 ms = 1 second before trying again */
	insheet using `"`using'"', nonames clear
}

*** save equation column if it exists before dropping it
local exists_eq=0
count if v1=="EQUATION"
if `r(N)'~=0 {
	gen str8 v0=""
	replace v0=v1
	local exists_eq=1
	drop v1
	* count v0 as well
	describe, short
	forval num=2/`r(k)' {
		ren v`num' v`=`num'-1'
	}
}

*** strip labels columns
count if v2=="LABELS"
if `r(N)'~=0 {
	drop v2
	* count v0 as well
	* cap is added to avoid the last column v0 being misnamed
	describe, short
	forval num=2/`r(k)' {
		cap ren v`=`num'+1' v`num'
	}
}

*** save title first one only, before stripping coef columns
cap save `titlefile'

*** must drop title first
if `exists_eq'==1 {
	if v0[1]~="" {
		* there may be a title
		while v0[1]~="" & v2=="" {
			drop in 1
		}
	}
}
if v1[1]~="" {
	* there may be a title
	while v1[1]~="" & v2=="" {
		drop in 1
	}
}	


*local VARIABLES "`variables'"
* first name is the VARIABLES
local content
local num 1
local N=_N
while `"`content'"'=="" & `num'<=`N' {
	local content=v1[`num']
	local num=`num'+1
}
local VARIABLES1 `"`content'"'


*** drop titles and establish the top row
*egen `rowmiss'=rowmiss(_all)
* rowmiss option not available in 8.2 or 8.0, do it by hand
gen rowmiss=0
foreach var of varlist v* {
	replace rowmiss=rowmiss+1 if `var'~=""
}

* rowmiss will not catch if ctitles are blank for the first column (1), count down from the top (already done for VARIABLES1)
*replace rowmiss=1 if v1[_n-1]~="VARIABLES"
replace rowmiss=1 if v1[_n-1]~=`"`VARIABLES1'"'

* NOTE: "VARIABLES" is no longer taken off; it merely gets written over in the same spot later on
while v1[1]~="" & rowmiss==1 {
	drop in 1
}

*** finish cleaning the equation columns

gen str8 VarName1=""
gen str8 eqName1=""

gen rowtype1=-1
replace rowtype1=0 if rowmiss==0
replace rowtype1=999 if rowmiss[_n-1]==0 | rowtype1[_n-1]==999
replace rowtype1=. if rowtype1==999
drop rowmiss


*** establish the bottom row
local N=_N
local num = `N'
local temp=v1[`num']
while `"`temp'"'~="" & `num'>=1 {
	* keep counting until empty
	local num=`num'-1
	local temp=v1[`num']
}
else {
	* already empty
	local num=`num'-1
}

local num=`num' + 1
replace rowtype1= 1 if rowtype1==.
replace rowtype1= 2 if _n==`num'
replace rowtype1= 3 if _n>`num'


if "`exists_eq'"=="1" {
	*** Strip the equation names and slap it back onto the variable column
	local N=_N
	order v0
	
	replace v0=v0[_n-1] if v0=="" & v0[_n-1]~="" & rowtype1==1
	gen eq_order1=0 if rowtype1==1
	replace eq_order1=1 if v0[_n]~=v0[_n-1] & v0~="" & rowtype1==1
	replace eq_order1=1 if v0[_n]~=v0[_n-1] & v0~="" & rowtype1==1
	
	replace eq_order1=eq_order1+eq_order1[_n-1] if eq_order1+eq_order1[_n-1]~=.
	
	replace eqName1=v0
	replace VarName1=v1
	replace VarName1=VarName1[_n-1] if VarName1=="" & VarName1[_n-1]~="" & rowtype1==1
	replace v1=v0 + ":" + v1 if v0~="" & v1~="" & rowtype1==1
	
	drop v0
}

* not needed, replaced with colonSplit
/*else if "`sideway'"=="sideway" & "`onecol'"=="onecol" {
	* special case for sideway and onecol
	* because sideway loops internally, EQUATION and LABELS columns does not exist
	* eqName and VarName are still joined, they need to separated
	* v1 is as it should be
	
	*** borrowed from:
	*** clean up equation names, title, label
	gen id1=_n
	gen str8 equation=""
	gen str8 variable=""
	
	local N=_N
	forval num=1/`N' {
		local name=trim(v1[`num'])
		local column=index("`name'",":")
		if `column'~=0 {
			local equation=trim(substr("`name'",1,`column'-1))
			local variable=trim(substr("`name'",`column'+1,length("`name'")))
			replace equation="`equation'" in `num'
			replace variable="`variable'" in `num'
		}
	}
	replace equation=equation[_n-1] if equation=="" & equation[_n-1]~="" & rowtype1~=2
	
	replace eqName1=equation if equation~=""
	replace VarName1=variable if variable~=""
	drop equation variable id1
	
	local N=_N
	gen eq_order1=0 in 3/`N' if eqName1~=""
	replace eq_order1=1 in 3/`N' if eqName1[_n]~=eqName1[_n-1] & eqName1~=""
	replace eq_order1=eq_order1+eq_order1[_n-1] if eq_order1+eq_order1[_n-1]~=.
}
*/
else {
	*** eq names not present
	gen eq_order1=1
	replace eq_order1=. if rowtype1==2
}




*** take out COEFFICIENT/VARIABLES as the column heading and restore later
replace v1 = "" if rowtype1==-1

* getting the characteristics
describe, short
*local numcol = `r(k)'				/* number of columns already in file 1 */

* subtract 4 to account for eq_order1, VarName1, eqName1, rowtype1
local numcol = `r(k)'-4				/* number of columns already in file 1 */

gen str8 mergeOn = ""
replace mergeOn=v1
local titleWide = (v1[1]!="")

* `titleWide'	is assumed to be zero
local frstrow = 1 + `titleWide'			/* first non-title row */

gen long Vord1 = _n
gen str8 v2plus = ""
replace v2plus=trim(v2)

local col = 3
if `col'<=`numcol' {
	replace v2plus = v2plus + trim(v`col')
	local col = `col'+1
}

gen topoff=1 if v1~=""
replace topoff=1 if topoff[_n-1]==1
replace topoff=sum(topoff)
count if (topoff==0 | (v1=="" & v2plus!="") | (v1[_n+1]=="" & (v2plus[_n+1]!=""|_n==1) & _n!=_N))
drop topoff

local ncoeff1 = r(N)

gen str8 varsml=""
replace varsml = trim(mergeOn)

summ Vord1 if Vord1>`ncoeff1' & v2plus!=""	/* v2plus for addstat */
local endsta1 = r(max)					/* calc last row of statistics before notes */

if `endsta1'==. {
	local endsta1 = `ncoeff1'
}

replace mergeOn = mergeOn[_n-1]+"!" if varsml==""
replace mergeOn = "bottomRow" if rowtype1==2
replace mergeOn = "topRow" if rowtype1==0
replace mergeOn = "_000" if rowtype1==-1

* pre-create Vorder here
*gen Vorder1 = _n/100 if rowtype1==-1
*replace Vorder1 = .99 if rowtype1==0
gen Vorder1=0 if rowtype1==0

local mm 1
while Vorder1[1]==. & `mm'<100 {
	local mm=`mm'+1
	replace Vorder1=Vorder1[_n+1]-1 if rowtype1==-1
}

egen min=min(Vorder1)
replace Vorder1=-99 if Vorder1==min
drop min

gen varnum = Vorder1 if Vorder1<1

* Constant is now done as eqOrder0 + .5
*replace Vorder1=2 if v1=="Constant" /* ok because equation names would still be attached if present */

* orders bottom row, Observations, r2, and else
replace Vorder1=3.7 if rowtype1>=2 
replace Vorder1=Vorder1[_n-1]+.0001 if Vorder1>=3.7 & rowtype1==3
replace Vorder1=2 if rowtype1==2
replace Vorder1=3.5 if v1=="Observations"
replace Vorder1=3.6 if v1=="R-squared"

replace Vorder1=1 if Vorder1==. & (Vorder1[_n-1]<1 | Vorder1[_n-1]==1)
* a fix for addstat sorting Jan 2009
*replace Vorder1=4 if v2=="" & Vorder1==3.5
replace Vorder1=4 if v2=="" & v2plus=="" & Vorder1>3.5

* Constant is now done as eqOrder0 + .5
*replace Vorder1=2.5 if v1=="" & (Vorder1[_n-1]==2 | Vorder1[_n-1]==2.5)

* generating order within each coefficient, use sortvar( ) if available
gen Vorder1_0=.
local maxnum 1
if "`sortvar'"~="" {
	tokenize `sortvar'
	local num 1
	while "``num''"~="" {
		replace Vorder1_0=`num' if v1=="``num''" | VarName1=="``num''" & Vorder1==1
		local num=`num'+1
	}
	if `num'>`maxnum' {
		local maxnum `num'
	}
}

* the evil twin of sortvar that will insert blanks/groups as well as order the existing variables 
if "`groupvar'"~="" {
	* stats rows per variable
	count if v1~="" & rowtype1==1
	local nom `r(N)'
	count if rowtype1==1
	if `nom'~=0 {
		local many=int(round(`r(N)'/`nom'),1)
	}
	else {
		local many 2
	}
				
				* eqnames for multiple equation
				tab eqName if rowtype1==1
				local rr=`r(r)'
				local tempList
				local orderlist
				if `rr'> 0 {
					* get eq names
					
					gen str5 temp=""
					replace temp=eqName if eqName~=eqName[_n-1] & rowtype1==1
					sort temp
					local N=_N
					forval num=1/`rr' {
						local content=temp[`N'-`num'+1]
						local tempList="`tempList' `content'"
						local content=eq_order1[`N'-`num'+1]
						local orderlist="`orderlist' `content'"
					}
					drop temp
					sort Vord1
					local times `rr'
				}
				else {
					* it's a single equation, run it once
					local times 1
				}
				
	tokenize `groupvar'
	forval kk=1/`times' {
		local order: word `kk' of `orderlist'
		local temp: word `kk' of `tempList'
		
		local num 1
		local count0 0
		while "``num''"~="" {
			replace Vorder1_0=`num' if (v1=="``num''" | VarName1=="``num''" ) & eqName=="`temp'"
			count if Vorder1_0~=. & eqName=="`temp'"
			if `r(N)'==`count0' {
				forval cc=1/`many' {
					* insert this many blank var
					local N=_N
					set obs `=`N'+1'
					local N=_N
					if `cc'==1 {
						replace v1="``num''" in `N'
					}
					replace VarName="``num''" in `N'
					replace rowtype1=1 in `N'
					replace Vorder1=1 in `N'
					replace Vorder1_0=`num' in `N'
					
					* for multiple equation only
					if `rr'>0 {
						if `cc'==1 {
							replace v1="`temp':" + v1 in `N'
						}
						replace eq_order1=`order' in `N'
						replace eqName="`temp'" in `N'
					}
				}
			}
			count if Vorder1_0~=. & eqName=="`temp'"
			local count0 `r(N)'
			local num=`num'+1
		}
		if `num'>`maxnum' {
			local maxnum `num'
		}
	}
}

* must be filled:
replace mergeOn=v1 if Vord1==.
replace mergeOn=mergeOn[_n-1]+"!" if Vord1==. & mergeOn==""

* own column to handle sortvar (to handle in mutliple equation)
gen sortvarCol1=Vorder1_0

gen temp=_n
replace Vorder1_0 = temp+`maxnum' if Vorder1==1 & varsml~="" & Vorder1_0==.
replace Vorder1_0 = Vorder1_0[_n-1]     if Vorder1_0==. & Vorder1==1
drop temp

replace sortvarCol1=Vorder1_0 if Vorder1_0<`maxnum' 

gen double Vorder1_1 =Vorder1_0 if Vorder1==1 & v1~=""
replace Vorder1_1=Vorder1_1[_n-1]+.01 if Vorder1_1==. & Vorder1==1

* for groupvar( ) above
sort Vorder1 eq_order1 Vorder1_1 Vord1
replace Vord1=_n

drop varsml


*** merging the two files
* two sorting/merging mechanism
local N=_N
count if eqName1=="" & eqName1=="EQUATION"
local rN=`r(N)'
if `N'==`rN' & `usingSingle'==1 {
	* single equation in both files
	gen str8 mergeVar=""
	replace mergeVar = mergeOn
	sort mergeVar varnum
	
	merge mergeVar varnum using "`mergeVarFile'"
	drop mergeEq mergeVar
}
else if `N'~=`rN' & `usingSingle'==1 {
	* this one's multiple merged to earlier single
	
	gen str8 mergeVar=""
	replace mergeVar = mergeOn
	replace mergeVar = VarName1 if VarName1~="" & Vorder1==1
	replace mergeVar = "Constant" if VarName1=="_cons" &  Vorder1==1
	replace mergeVar = mergeVar[_n-1]+"!" if mergeVar==mergeVar[_n-1] & mergeVar~="" & Vorder1==1
	sort mergeVar varnum
	
	merge mergeVar varnum using "`mergeVarFile'"
	drop mergeEq mergeVar
}
else if `N'==`rN' & `usingSingle'==0 {
	* this one's multiple merged to earlier single
	gen str8 mergeVar=""
	replace mergeVar = mergeOn
	replace mergeVar = VarName1 if VarName1~="" & Vorder1==1
	replace mergeVar = "Constant" if VarName1=="_cons" &  Vorder1==1
	replace mergeVar = mergeVar[_n-1]+"!" if mergeVar==mergeVar[_n-1] & mergeVar~="" & Vorder1==1
	sort mergeVar varnum
	
	merge mergeVar varnum using "`mergeVarFile'"
	drop mergeEq mergeVar
}
else {
	* both files are multiple equations
	ren mergeOn mergeEq
	sort mergeEq varnum
	
	merge mergeEq varnum using "`mergeEqFile'"
	drop mergeEq mergeVar
}



*** clean up and sort the merged files
* Vorder2 has the information for the top 0.01-0.03
* but Vorder1 has the bottom notes
gen Vorder=Vorder2
replace Vorder=Vorder1 if Vorder==. | (Vorder1>3.5 & Vorder1<4)

gen byte merge2 = _merge==2

* Notes and defintions:
* Vorder2    _n for master file
* Vorder1    _n for using file

* Vorder2_0  identifier for each coefficient (using _n for the top most stats)
* Vorder2_1  added 0.01 consequtively to bysort Vorder2_0

* Vorder1_0  identifier for each coefficient (using _n for the top most stats)
* Vorder1_1  added 0.01 consequtively to bysort Vorder1_0

*** this fills up the potential gaps in Vord1 and Vord2 if the number of stats( ) per coefficient is different
*order eq_order* Vorder Vord1 Vord2 Vord* 

sort eq_order2 Vorder2_1
replace Vord1=Vord1[_n-1]+.01 if (Vorder2_0==Vorder2_0[_n-1] & Vorder2_0~=.) & (Vord1==. & Vord1[_n-1]~=.) & Vorder==1

sort eq_order1 Vorder1_1
replace Vord2=Vord2[_n-1]+.01 if (Vorder1_0==Vorder1_0[_n-1] & Vorder1_0~=.) & (Vord2==. & Vord2[_n-1]~=.) & Vorder==1

* it's off by 1; replace them all
replace Vorder2_1=Vord2 if Vorder==1
replace Vorder1_1=Vord1 if Vorder==1


*** new sorting rules
*** June 2008 Version
gen str8 eqName0=""
replace eqName0=eqName2
replace eqName0=eqName1 if eqName0=="" & eqName1~=""

sort eqName0 Vorder1_1
gen eq_order0=.
gen eq_temp=1 if eqName0[_n]~=eqName0[_n-1] & Vorder1_1~=.

************ sort to the existing column?
sort eq_temp Vorder1_1

*** get all constant rows
local count 0
gen constant=0
replace constant=1 if (v1=="Constant" | v1=="_cons" | nameCol=="Constant" | nameCol=="_cons" | VarName1=="Constant" | VarName2=="Constant" | VarName1=="_cons" | VarName2=="_cons") & Vorder==1
replace constant=1 if mergeOn==mergeOn[_n-1]+"!" & constant[_n-1]==1 & Vorder==1


************* needs beter levelsof code?
if "`exists_eq'"=="1" | ("`sideway'"=="sideway" & "`onecol'"=="onecol") {
	count if eq_temp==1
	if r(N)~=0 {
		forval num=1/`=r(N)' {
			local temp=eqName0[`num']
			
			* collecting names
			*local eqOrderList "`temp' `eqOrderList'"
			replace eq_order0=`num' if eqName0=="`temp'"
		}
		replace eq_order0=eq_order0+.5 if constant==1
	}
}
else {
	* pushes _cons toward the bottom
	replace eq_order0=1
	replace eq_order0=eq_order0+.5 if constant==1
}


count if Vorder2_0>=1 & Vorder2_0<.
local countV2=r(N)

count if Vorder1_0>=1 & Vorder1_0<.
local countV1=r(N)

*** sort( ) takes "name later"
* sort according to varname for _tab3
if "`sortcol'"=="name" {
	* do this by replacing these:
	sort mergeOn
	replace Vorder2_1=_n if Vorder==1
	replace Vorder1_1=_n if Vorder==1
}

* consolidate sortvarCol info
gen sortvarCol=sortvarCol1
replace sortvarCol=sortvarCol2 if sortvarCol==.


* temporary fix for Partha Deb: Aug 2008 version
if `countV2'>`countV1' | "`sortcol'"=="later" {
	*sort Vorder eq_order0 Vorder2_1 Vorder1_1 merge2 Vord2
	* Jan 2009 Mohl
	*sort Vorder eq_order0 Vorder2_1 Vorder1_1 merge2 Vord2 Vord1
	sort Vorder eq_order0 sortvarCol Vorder2_1 Vorder1_1 merge2 Vord2 Vord1
*order Vorder eq_order0 sortvarCol Vorder2_1 Vorder1_1 merge2 Vord2 Vord1
*browse
}
else {
	*sort Vorder eq_order0 Vorder1_1 Vorder2_1 merge2 Vord1
	* Jan 2009 Mohl
	*sort Vorder eq_order0 Vorder1_1 Vorder2_1 merge2 Vord1 Vord2
	sort Vorder eq_order0 sortvarCol Vorder1_1 Vorder2_1 merge2 Vord1 Vord2
*order Vorder eq_order0 sortvarCol Vorder1_1 Vorder2_1 merge2 Vord1 Vord2
*browse
}



*** fill in if it was a single equation combining with a multiple equation
count if eqName0~="EQUATION" & eqName0~=""
if `r(N)'>0 {
	replace nameCol = "SINGLE:"+nameCol if Vorder==1 & eqName0=="" & nameCol~=""
	replace v1 = "SINGLE:"+v1 if Vorder==1 & eqName0=="" & v1~=""
}



replace v1 = nameCol if v1=="" & nameCol!=""
*drop nameCol mergeOn varsml Vorder Vord1 Vord2 merge2 _merge v2plus
drop nameCol mergeOn varnum        Vorder Vord1 Vord2 merge2 _merge v2plus Vorder1* Vorder2* eq* *Name*
cap drop sort*
cap drop group*

	* add the head column numbers
	if (`numcol'==2) {
		replace v2 = "(1)" if _n==`frstrow'
		replace reportCol = "(2)" if _n==`frstrow'
	}
	else {
		replace reportCol = "(" + string(`numcol') + ")" if _n==`frstrow'
	}



*** restore COEFFICIENT and 0 head
replace v1=`"`VARIABLES2'"' if rowtype1[_n+1]==0
replace v1=`"`VARIABLES2'"' if rowtype1==0 & v1[_n-1]~=`"`VARIABLES2'"'

drop rowtype1 rowtype2 constant

c_local VARIABLES `"`VARIABLES2'"'

end /* appendFile */


********************************************************************************************


program define marginal2
	versionSet
	version `version'

* put marginal effects (dfdx) into b and vc matrices 

syntax , b(string) vc(string) [se margucp(string)]

tempname dfdx se_dfdx new_vc dfdx_b2		
capture mat `dfdx' = e(dfdx`margucp')
if _rc==0 {
	local cnam_b : colnames `dfdx'
	local cnam_1 : word 1 of `cnam_b'
}
if _rc!=0 {
	if "`cnam_1'"=="c1" {
		di in yellow `"Update dprobit ado file: type "help update" in Stata"'
	}
		else {
		di in yellow "{opt margin} option invalid: no marginal effects matrix e(dfdx`margucp') exists"
	}
	exit
}

/* create matrix of diagonals for vc */
if "`se'"=="se" {
	if e(cmd)=="dprobit" | e(cmd)=="tobit" {
		if e(cmd)=="dprobit" {
			local margucp "_dfdx"
		}
		mat `se_dfdx' = e(se`margucp')
		mat `vc' = diag(`se_dfdx')
		mat `vc' = `vc' * `vc'
	}
	else {
		mat `vc' = e(V_dfdx)
	}
	mat colnames `vc' = `cnam_b'
}
else {
	/* if t or p stats reported then trick `cv' into giving the right t stat */
	local coldfdx = colsof(`dfdx')
	mat `new_vc' = J(`coldfdx',`coldfdx',0)
	local i = 1
	while `i' <= `coldfdx' {
		scalar `dfdx_b2' = (el(`dfdx',1,`i')/el(`b',1,`i'))^2
		mat `new_vc'[`i',`i'] = `dfdx_b2'*`vc'[`i',`i']
		local i = `i'+1
	}
	mat colnames `new_vc' = `cnam_b'
	mat `vc' = `new_vc'
}  
mat `b' = `dfdx'
end


********************************************************************************************


program define partxtl2, rclass
	versionSet
	version `version'


*** parse text list to find number of text elements and return them
	local ntxt = 0
	gettoken part rest: 1, parse(" (") 
	gettoken part rest: rest, parse(" (")		/* strip off "option(" */
	while `"`rest'"' != "" {
		local ntxt = `ntxt'+1
		gettoken part rest: rest, parse(",)") 
		return local txt`ntxt' `"`part'"'
		gettoken part rest: rest, parse(",)")	/* strip off "," or "(" */
	}
	return local numtxt `ntxt'
end


********************************************************************************************


*** this one avoids stripping the wrong parenthesis
program define partxtl3, rclass
	versionSet
	version `version'


*** parse text list to find number of text elements and return them
	local ntxt = 0

	* CANNOT use these functions because of string length limitation
	*local begin = index(`"`1'"',`"("')
	*local length : length local 1
	*local rest=substr(`"`1'"',`begin'+1,`length'-`begin'-1)

	local rest `"`1'"'
	
	gettoken part rest: 1, parse(" (") 
	gettoken part rest: rest, parse(" (")		/* strip off "option(" */
	while `"`rest'"' != "" {
		local ntxt = `ntxt'+1
		gettoken part rest: rest, parse(",") 
		return local txt`ntxt' `"`part'"'
		local last_part `"`part'"'
		gettoken part rest: rest, parse(",")
	}
	
	* fix the last one by stripping the ending parenthesis
	gettoken part last_part: last_part, parse(")")
	
	* takes off too much
	if "`last_part'"=="))" {
		local part `"`part')"'
	}
	return local txt`ntxt' `"`part'"'
	
	return local numtxt `ntxt'
end


********************************************************************************************


program define makeFile
* previously coeftxt2
	versionSet
	version `version'

* getting the coefficient name, values, and t-statistics

syntax [varlist(default=none ts)] , *

syntax [varlist(default=none ts)] , variables(string)			/*
*/ [equationsOption(string)							/*
*/ keep(string) drop(string) eqkeep(string) eqdrop(string)		/*
*/ eqlist(string) betaAsked							/*
*/ statsMany(integer 2) statsList(str asis) se_skip			/*
*/ BEta Level(integer $S_level) 						/*
*/ DEC(numlist) FMT(string) 							/*
*/ BDec(numlist) BFmt(string) 						/*
*/ SDec(numlist) SFmt(string) 						/*
*/ Tdec(numlist) TFmt(string)							/*
*/ PDec(numlist) PFmt(string) 						/*
*/ CDec(numlist) CFmt(string) 						/*
*/ ADec(numlist) AFmt(string)							/*
*/ RDec(numlist) RFmt(string)							/*
*/ AUTO(integer 3) LESS(integer 0) NOAUTO					/*
*/ noPAren parenthesis(str asis) BRacket BRacketA(passthru) 	/*
*/ noASter SYMbol(passthru) noCONs EForm noobs noNI 			/*
*/ noR2 ADJr2 ctitleList(string)							*]

local varlistTemp `"`varlist'"'

* cascading options:
local 0 `", `options'"'
syntax [, ADDStat(passthru) ADDText(passthru) noNOTes			/*
*/ ADDNote(passthru) APpend regN(string) df_r(string) rsq(string) /*
*/ numi(string) ivar(string) depvar(string) robust(string) 		/*
*/ BOROWS(string) b(string) vc(string) 					/*
*/ univar(string) Onecol estname(string) 					/*
*/ estnameUnique(string) fileExist(integer 1) 				/*
*/ ALPHA(string) asterisk(passthru) 2aster				/*
*/ matlist(string) leave(string) sidewayWave(integer 1)		]

* options taken out: SE Pvalue CI Tstat

local varlist `"`varlistTemp'"'
local VARIABLES "`variables'"

tempvar b_coefficient b_st_err
tempname b_alone vc_alon b_xtra vc_xtra

* avoid re-transposing them later by giving distinct names
tempname b_transpose vc_diag_transpose

mat `b_transpose' = `b''
mat `vc_diag_transpose' = vecdiag(`vc')
mat `vc_diag_transpose' = `vc_diag_transpose''

local brows = rowsof(`b_transpose')

*** xt options
if (`numi'!=. & "`ni'"!="noni") {
	if `"`iname'"'=="" {
		local iname "`ivar'"
	}
	if `"`iname'"'=="." {
		local iname "groups"
	}
}

*** disabled, taken out xstats


*** replacement codes
* populate with values from e(b) and e(V)

tempvar firstCol secondCol varKeepDrop nameCol

*** fill in variables names column
gen str5 `nameCol' = ""
gen str5 `firstCol' = ""
gen str5 `secondCol' = ""

local Names : rowfullnames(`b_transpose')
local Rows = rowsof(`b_transpose')

* extender making sure the obs > columns & obs > `Rows'
local N=_N
if `Rows'>`N'+1 & `Rows'<. {
	set obs `=`Rows'+1'
}
if `N'<1 {
	set obs 1
}

forval num=1/`Rows' {
	local temp : word `num' of `Names'
	
	tokenize "`temp'", parse(":")
	
	if "`2'"==":" {
		replace `firstCol' = "`1'" in `num'
		replace `secondCol' = "`3'" in `num'
	}
	else {
		replace `secondCol' = "`temp'" in `num'
		replace `nameCol' = "`temp'" in `num'
	}
}
replace `nameCol' = "Constant" if `firstCol'=="" & `secondCol'=="_cons"
replace `nameCol' = `firstCol' + ":" + `secondCol' if `firstCol'~=""
replace `nameCol' = `firstCol' + ":Constant" if `firstCol'~="" & `secondCol'=="_cons"

gen double `b_coefficient' = matrix(`b_transpose'[_n, 1]) in 1/`brows'
gen double `b_st_err' = matrix(`vc_diag_transpose'[_n, 1]) in 1/`brows'
replace `b_st_err' = sqrt(`b_st_err')

*** beta coefficient here
if "`beta'"=="beta" | "`betaAsked'"=="betaAsked" | "`leave'"~="" {
	tempname betcoef
	
	sum `depvar' if e(sample)
	local betaSD `r(sd)'
	gen `betcoef' =.
	
	forval num=1/`Rows' {
		local temp=`secondCol'[`num']
		cap sum `temp' if e(sample)
		replace `betcoef' = r(sd)/`betaSD' * `b_coefficient' if `num'==_n & `secondCol'~="_cons"
	}
	
	if "`beta'"=="beta" | "`betaAsked'"=="betaAsked" {
		* set nocons
		local cons "nocons"
	}
}



*** marksample, version 11 decouples of e(b) from e(sample)
if "`varlist'"=="" & "`casewise'"=="casewise" {
	noi di in red "{it:varlist} needs to be specified for use with {opt case:wise}"
	exit 198
}

tempvar touse
mark `touse' `if' `in' [`weight'`exp']

/*
count if e(sample)
if `r(N)'==0 {
	if "`raw'"=="raw" {
		mark `touse' `if' `in' [`weight'`exp']
	}
	else {
		noi di in red "zero e(sample) count; run a regression or specify {opt raw} or {opt case:wise}"
		exit 198
	}
}
else {
	cap confirm matrix e(b)
	if _rc==0 {
		* always esample restricted
		if `"`if'"'~="" {
			mark `touse' `if' & e(sample) `in' [`weight'`exp']
		}
		else {
			mark `touse' if e(sample) `in' [`weight'`exp']
		}
	}
	else if "`raw'"=="raw" | "`casewise'"=="casewise" {
		mark `touse' `if' `in' [`weight'`exp']
	}
	else {
		noi di in red "e(b) missing; post e-return matrices, run a regression, or specify {opt raw} or {opt case:wise}"
		exit 198
	}
}
*/

******************** may not always be e(b), may be margins




******************* all of these may not work well with -long- and multiple equations; problems with reg3 depvar names
count if `secondCol'~=""
local varMany=`r(N)'

if `varMany'>0 & `varMany'<. {
	
	local temp=lower(`"`statsList'"')
	_stats_check, `temp'
	
	*** summary from stats( ) here
	if "`sumAsked'"~="" {
		local tempL0
		
		if "`sumAsked'"=="regular" {
			* summary
			local sumList "N sum_w mean Var sd min max sum"
			local detail
		}
		else {
			* detail
			local sumList "N sum_w mean Var sd skewness kurtosis sum min max p1 p5 p10 p25 p50 p75 p90 p95 p99"
			local detail detail
		}
		
		tempvar `sumList'
		foreach stuff in `sumList' {
			gen ``stuff'' = .
		}
		
		forval num=1/`varMany' {
			local content=`secondCol'[`num']
			foreach stuff in `sumList' {
				cap sum `content' if `touse' [`weight'`exp'], `detail'
				if _rc==0 & `r(N)'>0 & `r(N)'<. {
					cap replace ``stuff'' = `r(`stuff')' in `num'
					local tempL0 "`tempL0' ``stuff''"
				}
			}
		}
	}
	
	
	*** stats( ) correlations
	local tempL1
	
	foreach cmd in corr pwcorr spearman  {
		
		if "``cmd'Asked'"=="`cmd'" {
			
			tempvar `cmd'
			gen ``cmd'' = .
			
			forval num=1/`varMany' {
				local content=`secondCol'[`num']
*********************** if no depvar, then use the varlist
				cap `cmd' `depvar' `content' if `touse' [`weight'`exp']
				if _rc==0 {
					cap replace ``cmd'' = `r(rho)' in `num'
				}
			}
			local tempL1 "`tempL1' ``cmd''"
		}
	}
	
	
	*** stats( ) cmd( )
	* take out cmd( ) from statsList and replace with cmd1 cmd2 ...
	* also run the cmd( ) and get r( ) back out
	
	* `regVal1' `regVal2' ... tempvar name for the column containing the values
	* cmd1 cmd2 ... name that appears in statsList and the column variable names
	* cmd1 cmd2 ... also contain what each cmd are
	
	local tempL2
	local cmdList 
	
	local tempList
	local num 1
	local cc 0
	
	gettoken one two: statsList, `bind'
	local two=trim(`"`two'"')
	
	* if okay to add:
	local check=substr(trim("`one'"),1,4)
	if `"`check'"'=="cmd(" {
		
		* it's a cmd( )
		local cc=`cc'+1
		local cmd`cc'=`"`one'"'
		
		tempvar regVal`cc'
		gen str7 `regVal`cc'' = ""
		
		* separate reporting from cmd requested inside: cmd( r( ) cmd)
		gettoken reporting cmd: one, `bind' parse("(")
		gettoken reporting cmd: cmd, `bind' parse("(")
		gettoken reporting cmd: cmd, `bind' parse(":")
		gettoken colon cmd: cmd, `bind' parse(":")
		
		local cmd=substr("`cmd'",1,length("`cmd'")-1)
		gettoken cmd suboption: cmd , parse(",")
		
		local reg`cc'=`"`cmd'"'
		
		forval num=1/`varMany' {
			local content=`secondCol'[`num']
********************** if no depvar, then use the varlist
			cap `cmd' `depvar' `content' if `touse' [`weight'`exp'] `suboption'
			if _rc==0 {
				cap replace `regVal`cc'' = `"``reporting''"' in `num'
			}
		}
		local cmdList "`cmdList' cmd`cc'"
		local tempL2 "`tempL2' `regVal`cc''"
		local tempList "`tempList' cmd`cc'"
	}
	else {
		local tempList "`tempList' `one'"
	}
	
	while `"`two'"'~="" {
		local num=`num'+1
		
		gettoken one two: two, `bind'
		local two=trim(`"`two'"')
		
		* if okay to add:
		local check=substr(trim("`one'"),1,4)
		if `"`check'"'=="cmd(" {
			
			* it's a cmd( )
			local cc=`cc'+1
			local cmd`cc'=`"`one'"'
			
			tempvar regVal`cc'
			gen str7 `regVal`cc'' = ""
			
			* separate reporting from cmd requested inside: cmd( r( ) cmd)
			gettoken reporting cmd: one, `bind' parse("(")
			gettoken reporting cmd: cmd, `bind' parse("(")
			gettoken reporting cmd: cmd, `bind' parse(":")
			gettoken colon cmd: cmd, `bind' parse(":")
			
			local cmd=substr("`cmd'",1,length("`cmd'")-1)
			gettoken cmd suboption: cmd , parse(",")
			
			local reg`cc'=`"`cmd'"'
			
			forval num=1/`varMany' {
				local content=`secondCol'[`num']
				
	************************* disable varlist
	********************** if no depvar, then use the varlist
				
				cap `cmd' `depvar' `content' if `touse' [`weight'`exp'] `suboption'
				if _rc==0 {
					cap replace `regVal`cc'' = `"``reporting''"' in `num'
				}
			}
			local cmdList "`cmdList' cmd`cc'"
			local tempL2 "`tempL2' `regVal`cc''"
			local tempList "`tempList' cmd`cc'"
		}
		else {
			local tempList "`tempList' `one'"
		}
	}
	local statsList `"`tempList'"'
	
	
	
	
	*** stats( ) str( )
	* take out str( ) from statsList and replace with str1 str2 ...
	
	* `strVal1' `strVal2' ... tempvar name for the column containing the values
	*  string1 string2 ... name that appears in statsList and the column variable names
	*  string1 string2 ... also contain what each strings are
	
	local tempL3
	local strList 
	
	local tempList
	local num 1
	local cc 0
	
	gettoken one two: statsList, `bind'
	local two=trim(`"`two'"')
	
	* if okay to add:
	local check=substr(trim("`one'"),1,4)
	if `"`check'"'=="str(" {
		
		* it's a str( )
		local cc=`cc'+1
		local string`cc'=`"`one'"'
		
		tempvar strVal`cc'
		gen str7 `strVal`cc'' = ""
		
		* separate reporting from str requested inside: str( r( ) str)
		gettoken junk str: one, `bind' parse("(")
		gettoken junk str: str, `bind' parse("(")
		local str=substr("`str'",1,length("`str'")-1)
		
		forval num=1/`varMany' {
			local content=`secondCol'[`num']
			replace `strVal`cc'' = `"`str'"' in `num'
		}
		local strList "`strList' string`cc'"
		local tempL3 "`tempL3' `strVal`cc''"
		local tempList "`tempList' string`cc'"
	}
	else {
		local tempList "`tempList' `one'"
	}
	
	while `"`two'"'~="" {
		local num=`num'+1
		
		gettoken one two: two, `bind'
		local two=trim(`"`two'"')
		
		* if okay to add:
		local check=substr(trim("`one'"),1,4)
		if `"`check'"'=="str(" {
			
			* it's a str( )
			local cc=`cc'+1
			local string`cc'=`"`one'"'
			
			tempvar strVal`cc'
			gen str7 `strVal`cc'' = ""
			
			* separate reporting from str requested inside: str( r( ) str)
			gettoken junk str: one, `bind' parse("(")
			gettoken junk str: str, `bind' parse("(")
			local str=substr("`str'",1,length("`str'")-1)
			
			forval num=1/`varMany' {
				local content=`secondCol'[`num']
				replace `strVal`cc'' = `"`str'"' in `num'
			}
			local strList "`strList' string`cc'"
			local tempL3 "`tempL3' `strVal`cc''"
			local tempList "`tempList' string`cc'"
		}
		else {
			local tempList "`tempList' `one'"
		}
	}
	local statsList `"`tempList'"'
}




keep `nameCol' `b_coefficient' `b_st_err' `betcoef' `firstCol' `secondCol' `tempL0' `tempL1' `tempL2' `tempL3'




*** get rid of original data since labels already accessed
*** rename them because the original data now gone

ren `b_coefficient' coefVal
ren `b_st_err' seVal
ren `nameCol' nameCol

if "`beta'"=="beta" | "`betaAsked'"=="betaAsked" | "`leave'"~="" {
	ren `betcoef' betaVal
}

ren `firstCol' eqName
ren `secondCol' VarName
keep if VarName~=""

if `varMany'>0 & `varMany'<. {
	if "`sumAsked'"~="" {
		foreach var in `sumList' {
			ren ``var'' `var'
		}
	}
	foreach var in corr pwcorr spearman  {
		if "``var'Asked'"~="" {
			ren ``var'' `var'
		}
	}
	local cc 1
	foreach var in `cmdList' {
		ren `regVal`cc'' cmd`cc'
		local cc=`cc'+1
	}
	local cc 1
	foreach var in `strList' {
		ren `strVal`cc'' string`cc'
		local cc=`cc'+1
	}
}



*** starting to keep/drop here
* varlist/keep
if "`keep'"~="" {
	local varlist "`keep'"
}

* varlist
if "`varlist'"~="" {
	gen str5 `varKeepDrop'=""
	
	* add the constant unless "nocons" is chosen
	if "`cons'"~="nocons" {
		local varlist "`varlist' _cons"
	}
	
	local count: word count `varlist'
	forval num=1/`count' {
		local temp : word `num' of `varlist'
		replace `varKeepDrop'="`temp'" if "`temp'"==VarName
	}
	
	count if `varKeepDrop'=="" & VarName~=""
	local brows=`brows'-r(N)
	local borows=`borows'-r(N)
	
	drop if `varKeepDrop'=="" & VarName~=""
	drop `varKeepDrop'
}

* drop
if "`drop'"~="" {
	gen str5 `varKeepDrop'=""
	
	local count: word count `drop'
	forval num=1/`count' {
		local temp : word `num' of `drop'
		replace `varKeepDrop'="`temp'" if "`temp'"==VarName
	}
	
	count if `varKeepDrop'~=""
	local brows=`brows'-r(N)
	local borows=`borows'-r(N)
	
	drop if `varKeepDrop'~=""
	drop `varKeepDrop'
}

*noi di in red "`brows'"
*noi di in red "`borows'"

if "`cons'"=="nocons" {
	gen count=1 if VarName=="_cons"
	count if count==1
	local brows=`brows'-r(N)
	local borows=`borows'-r(N)
	drop if count==1
	drop count
}

*noi di in red "`brows'"
*noi di in red "`borows'"

* drop some of multiple equations: 2 of 2
* (in case only one equation kept but `b' was passed thru inputed instead of `b_eq')

************* technically this should be fixed (get the eqName non-empty, and use indicator if multi-equation called for)
if "`eqdrop'"~="" & "`long'"=="long" {
	gen str5 `varKeepDrop'=""
	
	local count: word count `eqdrop'
	forval num=1/`count' {
		local temp : word `num' of `eqdrop'
		replace `varKeepDrop'="`temp'" if "`temp'"==eqName
	}
	
	count if `varKeepDrop'~=""
	local brows=`brows'-r(N)
	local borows=`borows'-r(N)
	
	drop if `varKeepDrop'~=""
	drop `varKeepDrop'
}

************* technically this should be fixed (get the eqName non-empty, and use indicator if multi-equation called for)
if "`eqkeep'"~="" & "`long'"=="long" {
	gen str5 `varKeepDrop'=""
	
	local count: word count `eqkeep'
	forval num=1/`count' {
		local temp : word `num' of `eqkeep'
		replace `varKeepDrop'="`temp'" if "`temp'"==eqName
	}
	
	count if `varKeepDrop'~=""
	local brows=`brows'-r(N)
	local borows=`borows'-r(N)
	
	keep if `varKeepDrop'~=""
	drop `varKeepDrop'
}

* reset brows after dropping
count if nameCol~=""
local brows = `r(N)'


/*
matrix matrix1=level'

*** enhancing with outside matrix
*** fill in variables names column
tempname matrix1 first1 second1

*gen str5 `matrix1' = ""
*gen str5 `first1' = ""
*gen str5 `second1' = ""

*local Names : rowfullnames(`b_transpose')
*local Rows = rowsof(`b_transpose')

gen str5 matrix1 = ""
gen str5 first1 = ""
gen str5 second1 = ""
gen str5 varname1 = ""
local Names : rowfullnames(matrix1)
local Rows = rowsof(matrix1)

forval num=1/`Rows' {
	local temp : word `num' of `Names'
	
	tokenize "`temp'", parse(":")
	
	if "`2'"==":" {
		replace first1 = "`1'" in `num'
		replace second1 = "`3'" in `num'
	}
	else {
		replace second1 = "`temp'" in `num'
		replace varname1 = "`temp'" in `num'
	}
}
replace varname1 = "Constant" if first=="" & second=="_cons"
replace varname1 = first + ":" + second if first~=""
replace varname1 = first + ":Constant" if first~="" & second=="_cons"

gen double b = matrix(matrix1[_n, 1]) in 1/`brows'
gen double s = matrix(matrix1[_n, 1]) in 1/`brows'
replace s = sqrt(s)
*/


/*
*** rename variables for forced row matching
if `"`samevar'"'~="" {
	gettoken first second: samevar, parse(",")
}
*/


*** obtain the statistics of interest

* tstatVal
gen double tstatVal = (coefVal/seVal)


* T_alpha for the Ci
if `df_r'==. {
	gen double T_alpha = invnorm( 1-(1-`level' /100)/2 )
}
else {
	* replacement for invt( ) function under version 6
	* note the absolute sign: invttail is flipped from invnorm
	gen double T_alpha = abs(invttail(`df_r', (1-`level' /100)/2))
}

* ci
gen double ci_lowVal=coefVal-T_alpha*seVal
gen double ci_highVal=coefVal+T_alpha*seVal
	
	* exponentiate beta and st_err
	gen double coefEformVal = exp(coefVal)
	gen double seEformVal = coefEformVal * seVal
	gen double ci_lowEformVal = exp(coefVal - seEformVal * T_alpha / coefEformVal)
	gen double ci_highEformVal = exp(coefVal + seEformVal * T_alpha / coefEformVal)

* pvalVal
if `df_r'==. {
	gen double pvalVal = 2*(1-normprob(abs(tstatVal)))
}
else {
	gen double pvalVal = tprob(`df_r', abs(tstatVal))
}


* calculate asterisks for t-stats (or standard errors)
local titleWide=0
if "`append'"=="append" & `fileExist'==1 {
	local appottl = 1
}
else {
	local appottl = `titleWide'
}

* either an appended column (not the first regression) or has a title
* i.e. need an extra line above the coefficients
* added a second extra line above the coefficients: place 1 of 2
gen mrgrow = 2*_n + 1 + `appottl' + 1

*** dealing with the asterisks
if "`aster'"!="noaster" {
	
	if "`alpha'"~="" {
		* parse ALPHA
		partxtl2 `"`alpha'"'
		local alphaCount = r(numtxt)
		local num=1
		while `num'<=`alphaCount' {
			local alpha`num' `r(txt`num')'
			capture confirm number `alpha`num''
			if _rc!=0 {
				noi di in red `"`alpha`num'' found where number expected in {opt alpha()} option"'
				exit 7
			}
		local num = `num'+1
		}
	}
	else {
		if "`2aster'"=="2aster" {
			local alpha1=.01
			local alpha2=.05
			local alphaCount=2
		}
		else {
			local alpha1=.01
			local alpha2=.05
			local alpha3=.10
			local alphaCount=3
		}
	}
	
	if `"`symbol'"'!="" {
		* parse SYMBOL
		partxtl2 `"`symbol'"'
		local symbolCount = r(numtxt)
		local num=1
		while `num'<=`symbolCount' {
			local symbol`num' `r(txt`num')'
			capture confirm number `symbol`num''
			if _rc==0{
				noi di in red `"`symbol`num'' found where non-number expected in {opt sym:bol()}"'
				exit 7
			}
		local num = `num'+1
		}
	}
	else {
		*** assume 2aster when only two alpha was given
		if "`2aster'"=="2aster" | `alphaCount'==2 {
			* 1 and 5 %
			local symbol1 "**"
			local symbol2 "*"
			local symbolCount=2
		}
		else {
			* 1, 5, and 10%
			local symbol1 "***"
			local symbol2 "**"
			local symbol3 "*"
			local symbolCount=3
		}
		* when only SYMBOL was given
		if "`alpha'"=="" {
			
		}
	}
	
	if "`alpha'"~="" & `"`symbol'"'~="" {
		if `symbolCount'~=`alphaCount' {
			di in red "{opt alpha()} and {opt sym:bol()} must have the same number of elements"
			exit 198
		}
	}
	
	if "`alpha'"=="" & `"`symbol'"'~="" {
		if `symbolCount'>=4 {
			di in red "{opt alpha()} must be specified when more than 3 symbols are specified with {opt sym:bol()}"
			exit 198
		}
	}
	
	if "`alpha'"~="" & `"`symbol'"'=="" {
		local symbolCount=`alphaCount'
		if `alphaCount'>=4 {
			di in red "{opt sym:bol()} must be specified when more than 3 levels are specified with {opt alpha()}"
			exit 198
		}
	}
	
	* fix the leading zero
	local num=1
	while `num'<=`alphaCount' {
		if index(trim("`alpha`num''"),".")==1 {
			local alpha`num'="0`alpha`num''"
		}
		local num=`num'+1
	}
	
	* creating the notes for the alpha significance
	local astrtxt `"`symbol1' p<`alpha1'"'
	local num=2
	while `num'<=`symbolCount' {
		local astrtxt `"`astrtxt', `symbol`num'' p<`alpha`num''"'
		local num=`num'+1
	}
	
	* assign the SYMBOL
	gen str12 astrix = `"`symbol1'"' if (abs(pvalVal)<`alpha1' & abs(pvalVal)!=.)
	
	local num=2
	while `num'<=`symbolCount' {
		replace astrix = `"`symbol`num''"' if astrix=="" & (abs(pvalVal)<`alpha`num'' & abs(pvalVal)!=.)
		local num=`num'+1
	}
}
else {
	gen str2 astrix = ""
}




* add in matrix/vectors names if provided in stats( )
* the values are to be autodigit later
* splits matlist into vectorList and nonvecList

local vectorList
local nonvecList

if "`matlist'"~="" {
	tempname matdown
	foreach matname in `matlist' {
		mat `matdown'=`matname'		/* NOT transposed */
		local temp= colsof(`matdown')
		
		* pre-save
		count if eqName~=""
		local masterEqExist=`r(N)'
		
		tempfile masterMultiFile masterSingleFile
		
		* original file is single equations
		sort VarName
		save `masterSingleFile', replace
		
		* original file is multiple equations
		sort eqName VarName
		save `masterMultiFile', replace
		
		* empties
		drop *
		
		cap gen str5 nameCol = ""
		cap gen str5 eqName = ""
		cap gen str5 VarName= ""
		
		if `temp'==1 {
			* it's a vector
			local vectorList "`vectorList' `matname'"
			
			*** borrowed from: *** fill in variables names column
			
			local Names : rowfullnames(`matdown')
			local Rows = rowsof(`matdown')
			set obs `Rows'
			
			forval num=1/`Rows' {
				local temp : word `num' of `Names'
				
				tokenize "`temp'", parse(":")
				
				if "`2'"==":" {
					replace eqName = "`1'" in `num'
					replace VarName= "`3'" in `num'
				}
				else {
					replace VarName= "`temp'" in `num'
					replace nameCol = "`temp'" in `num'
				}
			}
			replace VarName= "_cons" if VarName=="Constant"
			
			replace nameCol = "Constant" if eqName=="" & VarName=="_cons"
			replace nameCol = eqName + ":" + VarName if eqName~=""
			replace nameCol = eqName + ":Constant" if eqName~="" & VarName=="_cons"
			
			svmat double `matdown', name(`matname')
			
			* take off 1's that's been slapped on
			cap ren `matname'1 `matname'
		}
		else {
			* it's a non-vector matrix
			local cc= colsof(`matdown')
			local temp0 : colnames(`matdown')
			local temp
			foreach var in `temp0' {
				local temp "`temp' `matname'_`var'"
			}
			local nonvecList "`nonvecList' `temp'"
			
			*** borrowed from: *** fill in variables names column
			
			local Names : rowfullnames(`matdown')
			local Rows = rowsof(`matdown')
			set obs `Rows'
			
			forval num=1/`Rows' {
				local temp : word `num' of `Names'
				
				tokenize "`temp'", parse(":")
				
				if "`2'"==":" {
					replace eqName = "`1'" in `num'
					replace VarName= "`3'" in `num'
				}
				else {
					replace VarName= "`temp'" in `num'
					replace nameCol = "`temp'" in `num'
				}
			}
			replace VarName= "_cons" if VarName=="Constant"
			
			replace nameCol = "Constant" if eqName=="" & VarName=="_cons"
			replace nameCol = eqName + ":" + VarName if eqName~=""
			replace nameCol = eqName + ":Constant" if eqName~="" & VarName=="_cons"
			
			svmat double `matdown', name(col)
			
			* make it unique name
			foreach var in `temp0' {
				ren `var' `matname'_`var'
			}
			
			* take off 1's that's been slapped on
			*cap ren `matname'1 `matname'
		}
		
		count if eqName~=""
		local usingEqExist=`r(N)'
		
		* slap back to the original master files
		if `masterEqExist'==0 | `usingEqExist'==0 {
			* at least one single equation
			sort VarName
			merge VarName using "`masterSingleFile'"
		}
		else {
			* both are multiple equations
			sort eqName VarName
			merge eqName VarName using "`masterMultiFile'"
		}
		sort mrgrow
		cap drop _m
	}
	
	tempvar order constCol
	gen `order'=_n
	gen `constCol'=0
	replace `constCol'=1 if VarName=="_cons"
	sort `constCol' `order'
	drop `constCol' `order'
	
	* slap on SINGLE if only some are missing equation names
	local N=_N
	count if eqName==""
	if `r(N)'~=`N' {
		replace nameCol="SINGLE:"+VarName if eqName==""
		replace eqName="SINGLE" if eqName==""
	}
	
	* update
	count if mrgrow==.
	local brows=`brows'+`r(N)'
	replace mrgrow = 2*_n + 1 + `appottl' + 1
	sort eqName VarName
}

* leave matrices if user-provided suffix available
if "`leave'"~="" {
	count if VarName~=""
	local rN=r(N)
	loca name
	forval num=1/`rN' {
		local temp=nameCol[`num']
		local name "`name' `temp'"
	}
	
	foreach var in ci_highEform ci_lowEform seEform beta coefEform ci_high ci_low pval tstat se coef {
		mkmat `var'Val in 1/`rN', matrix(`var'`leave')
		mat colnames `var'`leave'=`var'`leave'
		mat rownames `var'`leave'=`name'
	}
}


*** putting together
* list of current column names other than user specified matrix:
* coefVal seVal nameCol (betaVal) tstatVal T_alpha ci_lowVal ci_highVal pvalVal mrgrow astrix

gen str12 reportCol = ""

* first prepare ancillary stats (tstat | se | ci | pvalue | beta)

foreach var in coef coefEform beta							/*
		*/ pval tstat se seEform 						/*
		*/ ci ciEform ci_low ci_lowEform ci_high ci_highEform		/*
		*/ aster blank								{
	gen str12 `var'String = ""
}

if `varMany'>0 & `varMany'<. & "`sumAsked'"~="" {
	foreach var in `sumList' {
		gen str12 `var'String = ""
	}
}
foreach var in corr pwcorr spearman  {
	if `varMany'>0 & `varMany'<. & "``var'Asked'"~="" {
		gen str12 `var'String = ""
	}
}
if `varMany'>0 & `varMany'<. {
	foreach var in `cmdList' {
		gen str12 `var'String = ""
	}
	foreach var in `strList' {
		gen str12 `var'String = ""
	}
}


local N=_N
* autodigit matrix columns
if `"`vectorList'"'~="" {
	foreach var in `vectorList' {
		gen str12 `var'String = ""
	}
	
	* autoformat all user-defined matrices
	foreach name in `vectorList' {
		autogen `name', replace(`name'String)  auto(`auto') less(`less') fmt(`fmt') width(12)
	}
}
if `"`nonvecList'"'~="" {
	foreach var in `nonvecList' {
		gen str12 `var'String = ""
	}
	
	* autoformat all user-defined matrices
	foreach name in `nonvecList' {
		autogen `name', replace(`name'String)  auto(`auto') less(`less') fmt(`fmt') width(12)
	}
}

replace asterString = astrix if astrix~=""


/* not effective b/c drop/keep done above, yet tstat is not define up there
*** set nocons if Constant row is empty
tempvar test1 test2
gen `test1'=.
foreach var in `statsList' {
	* capture 'cause might not exist
	cap replace `test1'=1 if `var'~=.
}
gen `test2'=1 if `test1'==. & VarName=="_cons"
qui sum `test2', meanonly
if `r(N)'>0 {
	local cons nocons
}
drop `test1' `test2'
*/


*** decimals and formats (old)

/*	* parse bfmt
	local fmttxt "e f g fc gc"
	partxtl2 `"`bfmt'"'
	local bfmtcnt = r(numtxt)
	local b = 1
	while `b'<=`bfmtcnt' {
		local bfmt`b' `r(txt`b')'
		if index("`fmttxt'","`bfmt`b''")==0 {
			di in red `"bfmt element "`bfmt`b''" is not a valid number format (f,fc,e,g or gc)"'
			exit 198
		}
	local b = `b'+1
	}
	
	*** fill in bdec(#) & bfmt(txt)
	local b = 1
	while `b'<=_N {
		local bdec`b' : word `b' of `bdec'
		if "`bdec`b''"=="" {
			local bdec`b' = `prvbdec'
		}
		local prvbdec "`bdec`b''"
		local b = `b'+1
	}
	* bfmt1 is already set above
	local b = `bfmtcnt'+1
	while `b'<=_N {
		local b_1 = `b'-1
		local bfmt`b' "`bfmt`b_1''"
		local b = `b'+1
	}
*/

*** decimals and formats

* originals
foreach thing in dec sdec bdec tdec pdec cdec rdec 			fmt sfmt bfmt tfmt pfmt cfmt rfmt {
	local `thing'0 ``thing''
}

* decimlas
if "`dec'"=="" {
	foreach stuff in dec sdec bdec tdec pdec cdec rdec {
		if "``stuff''"=="" {
			local `stuff' 3
		}
	}
}
else {
	foreach stuff in bdec sdec tdec pdec cdec rdec {
		if "``stuff''"=="" {
			local `stuff' `dec'
		}
	}
}

* formats
if "`fmt'"=="" {
	foreach stuff in fmt sfmt bfmt tfmt pfmt cfmt rfmt {
		if "``stuff''"=="" {
			local `stuff' fc
		}
	}
}
else {
	foreach stuff in bfmt sfmt tfmt pfmt cfmt rfmt {
		if "``stuff''"=="" {
			local `stuff' `fmt'
		}
	}
}


* disable autofmt if dec or bdec given
if "`dec0'"~="" | "`bdec0'"~="" {
	local noauto noauto
}


*** could possibly be empty
local N=_N
if `N'==0 {
	set obs 1
}



*** for the (parenthesis) numbers
	local N=_N
	if "`tdec0'"=="" & "`noauto'"~="noauto" {
		autogen tstatVal, replace(tstatString) auto(`auto') less(`less') fmt(`tfmt') width(12)
		
		
		/* use autodigits
		forval num=1/`N' {
			autodigits2 tstatVal[`num'] `auto' `less'
			replace tstatString = string(tstatVal,"%12.`r(valstr)'") in `num'
			
			*autofmt, input(`=tstatVal[`num']') auto(`auto') less(`less')
			*replace tstatString = `"`r(output1)'"' in `num'
		}
		*/
	}
	else {
		fmtgen tstatVal, replace(tstatString) dec(`tdec') fmt(`tfmt') width(12)
	}
	
	if "`sdec0'"=="" & "`noauto'"~="noauto" {
		autogen seVal, replace(seString) auto(`auto') less(`less') fmt(`sfmt') width(12)
		autogen seEformVal, replace(seEformString) auto(`auto') less(`less') fmt(`sfmt') width(12)
	}
	else {
		fmtgen seVal, replace(seString ) dec(`sdec') fmt(`sfmt') width(12)
		fmtgen seEformVal, replace(seEformString ) dec(`sdec') fmt(`sfmt') width(12)
	}
	
	if "`pdec0'"==""  & "`noauto'"~="noauto" {
		autogen pvalVal, replace(pvalString) auto(`auto') less(`less') fmt(`pfmt') width(12)
	}
	else {
		fmtgen pvalVal, replace(pvalString ) dec(`pdec') fmt(`pfmt') width(12)
	}
	
	if "`cdec0'"=="" & "`noauto'"~="noauto" {
		autogen ci_lowVal, replace(ci_lowString) auto(`auto') less(`less') fmt(`cfmt') width(12)
		autogen ci_highVal, replace(ci_highString) auto(`auto') less(`less') fmt(`cfmt') width(12)
		replace ciString = ci_lowString + " - " + ci_highString
		
		autogen ci_lowEformVal, replace(ci_lowEformString) auto(`auto') less(`less') fmt(`cfmt') width(12)
		autogen ci_highEformVal, replace(ci_highEformString) auto(`auto') less(`less') fmt(`cfmt') width(12)
		replace ciEformString = ci_lowEformString + " - " + ci_highEformString
	}
	else {
		fmtgen ci_lowVal, replace(ci_lowString) dec(`cdec') fmt(`cfmt') width(12)
		fmtgen ci_highVal, replace(ci_highString) dec(`cdec') fmt(`cfmt') width(12)
		replace ciString = ci_lowString + " - " + ci_highString
		
		fmtgen ci_lowEformVal, replace(ci_lowEformString) dec(`cdec') fmt(`cfmt') width(12)
		fmtgen ci_highEformVal, replace(ci_highEformString) dec(`cdec') fmt(`cfmt') width(12)
		replace ciEformString = ci_lowEformString + " - " + ci_highEformString
	}
	
	if "`beta'"=="beta" | "`betaAsked'"=="betaAsked" {
		fmtgen betaVal, replace(betaString) dec(`cdec') fmt(`cfmt') width(12)
	}
	
	*** prepare coefSring
	if "`bdec0'"=="" & "`noauto'"~="noauto" {
		autogen coefVal, replace(coefString) auto(`auto') less(`less') fmt(`bfmt') width(12)
		autogen coefEformVal, replace(coefEformString) auto(`auto') less(`less') fmt(`bfmt') width(12)
		
		* beta here (with coef)
		if "`beta'"=="beta" | "`betaAsked'"=="betaAsked" {
			autogen betaVal, replace(betaString) auto(`auto') less(`less') fmt(`bfmt') width(12)
		}
	}
	else {
		fmtgen coefVal, replace(coefString) dec(`bdec') fmt(`bfmt') width(12)
		fmtgen coefEformVal, replace(coefEformString) dec(`bdec') fmt(`bfmt') width(12)
		
		* beta here (with coef)
		if "`beta'"=="beta" | "`betaAsked'"=="betaAsked" {
			fmtgen betaEformVal, replace(betaString) dec(`bdec') fmt(`bfmt') width(12)
		}
	}


local N=_N
if `varMany'>0 & `varMany'<. & "`sumAsked'"~="" {
	
	*** digits and formats for sumAsked:
	if "`dec0'"=="" & "`noauto'"~="noauto" {
		foreach var in `sumList' {
			autogen `var', replace(`var'String) auto(`auto') less(`less') fmt(`fmt') width(12)
		}
		else {
			fmtgen `var', replace(`var'String) dec(`dec') fmt(`fmt') width(12)
		}
	}
}
foreach var in corr pwcorr spearman  {
	if `varMany'>0 & `varMany'<. & "``var'Asked'"~="" {
		
		*** digits and formats for stats( ) correlations:
		if "`dec0'"=="" & "`noauto'"~="noauto" {
			autogen `var', replace(`var'String) auto(`auto') less(`less') fmt(`fmt') width(12)
		}
		else {
			fmtgen `var', replace(`var'String) dec(`dec') fmt(`fmt') width(12)
		}
	}
}
if `varMany'>0 & `varMany'<. {
	foreach var in `cmdList' {
		*** digits and formats for stats( ) cmd( ):
		if "`dec0'"=="" & "`noauto'"~="noauto" {
			autogen `var', replace(`var'String) auto(`auto') less(`less') fmt(`fmt') width(12)
		}
		else {
			fmtgen `var', replace(`var'String) dec(`dec') fmt(`fmt') width(12)
		}
	}
	foreach var in `strList' {
		*** digits and formats for stats( ) str( ):
		if "`dec0'"=="" & "`noauto'"~="noauto" {
			autogen `var', replace(`var'String) auto(`auto') less(`less') fmt(`fmt') width(12)
		}
		else {
			fmtgen `var', replace(`var'String) dec(`dec') fmt(`fmt') width(12)
		}
	}
}
	
	
	
	*** moved here from the main body
	/* slap parenthesis for non-coef contents
	if `"`bracketA'"'=="" & `"`bracket'"'=="" & `"`parenthesis'"'=="" & "`paren'"~="noparen" {
		* blank at end
		local statsList "`statsList' "
		local parenthesis : subinstr local statsList "coef " "", all
		local parenthesis : subinstr local parenthesis "coefEform " "", all
		
		* no parenthesis for blank row
		local parenthesis : subinstr local parenthesis "blank " "", all
	}
	*/
	
	* slap parenthesis for non-blank, even rows (as in parity)
	* this might be violated by -sideway- but -cap replace- prevents error
	if `"`bracketA'"'=="" & `"`bracket'"'=="" & `"`parenthesis'"'=="" & "`paren'"~="noparen" {
		gettoken one two: statsList
		local odd 1
		while `"`two'"'~="" {
			if `odd'==0 {
				local parenthesis	"`parenthesis' `one'"
				local odd 1
			}
			else {
				local odd 0
			}
			gettoken one two: two
		}
		if `odd'==0 {
			local parenthesis	"`parenthesis' `one'"
			local odd 1
		}
		else {
			local odd 0
		}
	}
	
************ ad hoc fix
* take out Eform and put it back in
local parenthesis `"`parenthesis' "'
local parenthesis : subinstr local parenthesis "Eform " " ", all
local parenthesis =trim("`parenthesis'")
	
if `"`paren'"'~="noparen" {
	if `"`bracketA'"'=="" & `"`bracket'"'=="" & `"`parenthesis'"'=="" {
		local parenthesis "se"
	}
	
	if `"`parenthesis'"'~="" {
		* other possible valid: level coef_eform se_eform coef_beta se_beta
		* also added: seEform, etc
		optionSyntax, valid(coef se tstat pval ci aster blank beta ci_low ci_high N sum_w mean Var /*
			*/ sd skewness kurtosis sum min max p1 p5 p10 p25 p50 p75 p90 p95 p99 corr pwcorr spearman `cmdList' `strList' ) /*
			*/ name(parenthesis) nameShow(paren:thesis( )) content(`parenthesis') passthru noreturn
		local parenList `"`optionList'"'
		local parenPerCoef `optionCount'
	}
	
	* update when eform specified
	if "`eform'"=="eform" {
		local parenList "`parenList' "
		* may be redundant
		local parenList : subinstr local parenList "coef " "coefEform ", all
		local parenList : subinstr local parenList "ci " "ciEform ", all
		local parenList : subinstr local parenList "se " "seEform ", all
		
		local parenList : subinstr local parenList "ci_high " "ci_highEform ", all
		local parenList : subinstr local parenList "ci_low " "ci_lowEform ", all
	}
	
	if `"`bracketA'"'~="" {
		*** bracketA( ) option cleanup
		* other possible valid: level coef_eform se_eform coef_beta se_beta
		optionSyntax, valid(coef se tstat pval ci aster blank beta ci_low ci_high N sum_w mean Var /*
			*/ sd skewness kurtosis sum min max p1 p5 p10 p25 p50 p75 p90 p95 p99 corr pwcorr spearman `cmdList' `strList' ) /*
			*/ name(bracketA) nameShow(br:acket( )) content(`bracketA') passthru noreturn
		local bracketList `"`optionList'"'
		local bracketPerCoef `optionCount'
	}
	
	* update when eform specified
	if "`eform'"=="eform" {
		local bracketList "`bracketList' "
		* may be redundant
		local bracketList : subinstr local bracketList "coef " "coefEform ", all
		local bracketList : subinstr local bracketList "ci " "ciEform ", all
		local bracketList : subinstr local bracketList "se " "seEform ", all
	}
	
	if "`bracket'"=="bracket" & "`parenthesis'"=="" {
		replace tstatString = "[" + tstatString + "]" if tstatString ~=""
		replace pvalString = "[" + pvalString + "]" if pvalString  ~=""
		replace ciString = "[" + ciString + "]" if ciString ~=""
		replace ciEformString = "[" + ciEformString + "]" if ciEformString ~=""
		
		replace ci_lowString = "[" + ci_lowString + "]" if ci_lowString ~=""
		replace ci_highString = "[" + ci_highString + "]" if ci_highString ~=""
		replace ci_lowEformString = "[" + ci_lowEformString + "]" if ci_lowEformString ~=""
		replace ci_highEformString = "[" + ci_highEformString + "]" if ci_highEformString ~=""
		
		replace betaString= "[" + betaString+ "]" if betaString ~=""
		replace seString = "[" + seString + "]" if seString ~=""
		replace seEformString = "[" + seEformString + "]" if seEformString ~=""
		replace betaString= "[" + betaString+ "]" if betaString ~=""
	}
	else if "`bracket'"=="bracket" & "`parenthesis'"~="" {
		local num 1
		while `num'<=`parenPerCoef' {
			local temp : word `num' of `parenList'
			replace `temp'String = "[" + `temp'String + "]" if `temp'String ~=""
			local num=`num'+1
		}
	}	
	else {
		if "`parenthesis'"~="" {
			local num 1
			while `num'<=`parenPerCoef' {
				local temp : word `num' of `parenList'
				cap replace `temp'String = "(" + `temp'String + ")" if `temp'String ~=""
				local num=`num'+1
			}
		}
		if "`bracketA'"~="" {
			local num 1
			while `num'<=`bracketPerCoef' {
				local temp : word `num' of `bracketList'
				cap replace `temp'String = "[" + `temp'String + "]" if `temp'String ~=""
				local num=`num'+1
			}
		}
	}
} /* if `"`paren'"'~="noparen" */



* when no coefficient/cons are present (prevent subid from going undefined)
local N=_N
if `N'==0 {
	set obs 1
}

gen id=_n
expand `statsMany'
bys id: gen subid=_n

*replace nameCol = " " if subid~=1 /* no variable names next to tstats */
replace nameCol = "" if subid~=1 /* no variable names next to tstats */

	/* a little more complicated, not use optionSyntax
	if `"`asterisk'"'~="" {
		*** asterisk( ) option cleanup
		* other possible valid: level coef_eform se_eform coef_beta se_beta
		optionSyntax, valid(coef se tstat pval ci        blank beta ci_low ci_high) /*
			*/ name(asterisk) nameShow(aster:isk( )) content(`asterisk') passthru noreturn
		local asterList `"`optionList'"'
		local asterPerCoef `optionCount'
	}
	*/
	
	if `"`asterisk'"'~="" {
		
		*** asterisk( ) option cleanup
		local asterValid "coef se tstat pval ci        blank beta ci_low ci_high"
		* no aster here
		* level coef_eform se_eform coef_beta se_beta"
		
		* take comma out
		local asterisk : subinstr local asterisk "asterisk(" " ", all
		local asterisk : subinstr local asterisk ")" " ", all
		local asterisk : subinstr local asterisk "," " ", all
		
		local asterPerCoef : word count `asterisk'
		local num=1
		local asterList ""
		
		while `num'<=`asterPerCoef' {
			local aster`num' : word `num' of `asterisk'
			
			* it must be one of the list
			local test 0
			foreach var in `asterValid' {
				if "`var'"=="`aster`num''" & `test'==0 {
					local test 1
				}
			}
			if `test'==0 {
				noi di in red "{opt `aster`num''} is neither a valid option or matrix for {opt aster:isk( )}"
				exit 198
			}
			local asterList "`asterList' `aster`num''"
			local num=`num'+1
		}
	}
	
	* update when eform specified
	if "`eform'"=="eform" {
		local asterList "`asterList' "
		local asterList : subinstr local asterList "coef " "coefEform ", all
		local asterList : subinstr local asterList "ci " "ciEform ", all
		local asterList : subinstr local asterList "se " "seEform ", all
		
		local asterList : subinstr local asterList "ci_high " "ci_highEform ", all
		local asterList : subinstr local asterList "ci_low " "ci_lowEform ", all
	}
	
	*** combining them into one column
	
	if "`asterisk'" == "" {
		forval num=1/`statsMany' {
			local var : word `num' of `statsList'
			replace reportCol=`var'String if subid==`num'
			
			* attach asterString
			replace reportCol=`var'String + asterString if subid==`num' & ("`var'"=="coef" | "`var'"=="coefEform")
		}
	}
	else {
		forval num=1/`statsMany' {
			local var : word `num' of `statsList'
			replace reportCol=`var'String if subid==`num'
			
			* attach asterString
			forval nn=1/`asterPerCoef' {
				replace reportCol=`var'String + asterString if subid==`num' & ("`var'"=="`aster`nn''" | "`var'"=="`aster`nn''Eform")
			}
		}
	}

* drops vector/matrices as well:
keep nameCol eqName VarName mrgrow reportCol

local num=mrgrow[1]-2
replace mrgrow=`num'+_n

* first find number of new rows for addstat()
if `"`addstat'"'!="" {
	partxtl3 `"`addstat'"'
	local naddst = int((real(r(numtxt))+1)/2)
	
	local n = 1
	while `n'<=`naddst' {
		local t = (`n'-1)*2+1
		local astnam`n' `r(txt`t')'
		local t = `t'+1
		local astval`n' `r(txt`t')' /* pair: stat name & value */
		local n = `n'+1
	}
}
else {
	local naddst=0
}

* find number of new rows for addnote()
if (`"`addnote'"'!="" & "`append'"!="append") | (`"`addnote'"'!="" & `fileExist'==0) {
	partxtl2 `"`addnote'"'
	local naddnt = r(numtxt)
	local n = 1
	while `n'<=`naddnt' {
		local anote`n' `r(txt`n')'
			local n = `n'+1
	}
}
else {
	local naddnt=0
}

* calculate total number of rows in table
* added a second extra line above the coefficients: place 2 of 2
*local coefrow = 2*`brows'+1+`appottl' + 1
local coefrow = `statsMany'*`brows'+1+`appottl' + 1
*local totrows =     `coefrow' + ("`nobs'"!="nonobs") + (`numi'!=.) + ("`r2'"!="nor2"&`rsq'!=.&`df_r'!=.) + `naddst' + ("`notes'"!="nonotes"&"`append'"!="append")*(1+("`aster'"!="noaster")) + `naddnt'
local totrows  = 2 + 20 + `coefrow' + ("`nobs'"!="nonobs") + (`numi'!=.) + ("`r2'"!="nor2")                    + `naddst' + ("`notes'"!="nonotes"&"`append'"!="append")*(1+("`aster'"!="noaster")) + `naddnt' + ("`notes'"!="nonotes" & `fileExist'==0)*(1+("`aster'"!="noaster"))
*                2 added for the top and bottom row (empty), 20 added for the heck of it
* totrows calculation is apparently no longer accurate when no file exists; merely drop the extra row at the end

* cap here because could be lower due to drop/nocons
cap set obs `totrows'

* insert the top row (empty), rowtype2==0
local N=_N
set obs `=`N'+1'
local N=_N
replace mrgrow = 1 in `N'

gen rowtype2=0 in `N'

local N=_N

*** always add the head column numbers
if "`append'"=="append" & `fileExist'==1 {
	replace mrgrow = 0.001 in `=`N'-2'
	replace reportCol = "(1)" in `=`N'-2'
}
else {
	replace mrgrow = 0.001 in `=`N'-2'
	replace reportCol = "(1)" in `=`N'-2'
	* add one back to make up for it
	local coefrow = `coefrow'+1
}

local coefrow = `coefrow'-1

* there must be at least one ctitleList
if `"`ctitleList'"'=="" {
	local ctitleList " "
}



*** ad hoc fix for ctitleList, which is assigned by the main program from stats( ) contents
* ctitleList needs to fixed for -sideway- and str( ) or cmd( ) invoked
if "`cmd1'"=="`ctitleList'" & "`statsMany'"=="1" {
	local ctitleList `"`reg1'"'
}
if "`string1'"=="`ctitleList'" & "`statsMany'"=="1" {
	local ctitleList "string"
}




* parsing ctitleList contents (2 of 2), counts the first and the last comma and the consecutive commas
local rest `"`ctitleList'"'
local count 0
while `"`rest'"'~="" {
	gettoken first rest: rest, parse(",")
	if `"`first'"'=="," & `count'==0 {
		local count=`count'+1
		local txt`count'
	}
	if `"`first'"'~="," {
		local count=`count'+1
		local txt`count' `"`first'"'
	}
	if `"`first'"'=="," & `"`previous'"'=="," {
		local count=`count'+1
		local txt`count'
	}
	local previous `"`first'"'
}
if `"`first'"'=="," & `count'~=0 {
	local count=`count'+1
	local txt`count'
}

local numtxt `count'

* adding more rows for ctitles
if `numtxt'>0 {
	set obs `=`N'+`numtxt''
	local N=_N
	forval num=1/`numtxt' {
		replace mrgrow = `num'/100 in `=`N'-`num'+1'
		
		* insert ctitles
		replace reportCol=`"`txt`num''"' in `=`N'-`num'+1'
		
		replace rowtype2=-1 in `=`N'-`num'+1'
		local coefrow = `coefrow'+1
	}
}

sort mrgrow
replace mrgrow = _n

* the bottom row (empty), rowtype2==2
local coefrow = `coefrow'+1

replace rowtype2=-1 if rowtype2[_n+1]==0 | rowtype2[_n+1]==-1

replace rowtype2=1 if _n<`coefrow' & rowtype2==.
replace rowtype2=2 if _n==`coefrow'
replace rowtype2=3 if _n>`coefrow'


* only if it's not sideway runons
if `sidewayWave'==1 {
	
	* number of observations
	if "`obs'"!="noobs" {
		local coefrow = `coefrow'+1
		replace nameCol = "Observations" if _n==`coefrow'
		replace reportCol = string(`regN') if _n==`coefrow'
	}
	
	if (`numi'!=. & "`ni'"!="noni") {
		local coefrow = `coefrow'+1
		replace nameCol = "Number of " + rtrim(`"`iname'"') if _n==`coefrow'
		replace reportCol = string(`numi') if _n==`coefrow'
	}
	
	* scalar crap, no rsq if it's a dot
	if "`r2'"~="nor2" {
		if `=`rsq''==. {
			local r2 "nor2"
		}
	}
	
	if "`r2'"!="nor2" {
		/* if df_r=., not true r2 */
		local coefrow = `coefrow'+1
		replace reportCol = string(`rsq',"%12.`rdec'`rfmt'") if _n==`coefrow'
		replace nameCol = "R-squared" if _n==`coefrow'
		if "`adjr2'"=="adjr2" {
			replace nameCol = "Adjusted " + nameCol if _n==`coefrow'
		}
	}
	
	*** addtext here
	if `"`addtext'"'!="" {
		partxtl2 `"`addtext'"'
		local temp = int((real(r(numtxt))+1)/2)
		
		local n = 1
		while `n'<=`temp' {
			local t = (`n'-1)*2+1
			local textName`n' `r(txt`t')'
			local t = `t'+1
			local textValue`n' `r(txt`t')' /* pair: stat name & value */
			local n = `n'+1
		}
		
		local i 1
		while `i'<=`temp' {
			* increase
			local coefrow = `coefrow'+1
			local N=_N
			set obs `=`N'+1'
			
			if `"`textValue`i''"'!="" {
				replace reportCol = "`textValue`i''" if _n==`coefrow'
			}
			replace nameCol = trim(`"`textName`i''"') if _n==`coefrow'
			local i = `i'+1
		}
		
		* cleanup counting
		replace mrgrow=_n
	}
	
	*** addstat here
	if `"`addstat'"'!="" {
		local i 1
		local adeccnt : word count `adec'
		while `i'<=`naddst' {
			local coefrow = `coefrow'+1
			local aadec : word `i' of `adec'
			if "`aadec'"=="" {
				local aadec `prvadec'
			}
			if `"`astval`i''"'!="" {
				replace reportCol = "`astval`i''" if _n==`coefrow'
			}
			replace nameCol = trim(`"`astnam`i''"') if _n==`coefrow'
			local i = `i'+1
			local prvadec `aadec'
		}
	}
}

local parenList=trim(`"`parenList'"')

if ("`notes'"!="nonotes" & "`append'"!="append") | ("`notes'"!="nonotes" & `fileExist'==0) {
	if "`bracket'"=="bracket" | "`bracketA'" ~= "" {
		local par_bra "brackets"
	}
	else {
		local par_bra "parentheses"
	}
	
	* notes
	if "`statsList'"=="coef pval" {
		local statxt "p-values"
	}
	else if "`statsList'"=="coef se" {
		local statxt "Standard errors"
	}
	else if "`statsList'"=="coef pi" {
		local statxt "`level'% confidence intervals"
	}
	else if "`beta'"=="beta" {
		local statxt "Normalized beta coefficients"
	}
	else if "`parenList'"=="se" {
		local statxt "Standard errors"
	}
	else if "`parenList'"=="tstat" {
		if `df_r'!=. {
			local t_or_z "t"
		}
		else {
			local t_or_z "z"
		}
		local statxt "`t_or_z'-statistics"
	}
	
	if "`robust'"=="Robust" {
		local statxt = "Robust " + lower("`statxt'")
	}
	
	* actually inserting	
	if ("`parenList'"~="" | "`bracketList'"~="" ) & "`statsList'"~="coef" {
		if `"`paren'"'~="noparen" {
			local coefrow = `coefrow'+1
			replace nameCol = "`statxt' in `par_bra'" if _n==`coefrow'
		}
	}
	if "`aster'"!="noaster" {
		local coefrow = `coefrow'+1
		replace nameCol = "`astrtxt'" if _n==`coefrow'
	}
}

if (`"`addnote'"'!="" & "`append'"!="append") | (`"`addnote'"'!="" & `fileExist'==0) {
	local i 1
	while `i'<=`naddnt' {
		local coefrow = `coefrow'+1
		replace nameCol = `"`anote`i''"' if _n==`coefrow'
		local i = `i'+1
	}
}

* attach the column name
replace nameCol=`"`VARIABLES'"' if rowtype2[_n+1]==0
replace nameCol=`"`VARIABLES'"' if rowtype2==0 & nameCol[_n-1]~=`"`VARIABLES'"'


*** drop the extra rows at the end, if still exist, unless it is the bottom row
local N=_N
local temp=nameCol[`N']
local check=rowtype2[`N']
while "`temp'"=="" & `check'>2 {
	drop in `N'
	local N=_N
	local temp=nameCol[`N']
	local check=rowtype2[`N']
}


*** handle equationsA(auto)
if "`equationsOption'"=="auto" {
		
	*******************************cap set unabbr off
	local N=_N
	forval num=1/`N' {
		local temp=eqName[`num']
		if "`temp'"~="" {
			* check if this variable exists
			cap sum `temp', meanonly
			if _rc~=0 {
				count if eqName=="`temp'"
				local thisMany=r(N)/`statsMany'
				if `thisMany'>1 & `thisMany'<. {
					replace nameCol ="Constant" if	eqName=="`temp'" & VarName=="_cons" & nameCol~=""
					replace nameCol =VarName if		eqName=="`temp'" & VarName~="_cons" & nameCol~=""
					replace eqName="" if eqName=="`temp'"
				}
				else {
					replace nameCol =eqName if	eqName=="`temp'" & VarName=="_cons" & nameCol~=""
					replace eqName="" if eqName=="`temp'"
				}
			}
		}
	}
}

end		/* makeFile */


********************************************************************************************


program define seeing
	versionSet
	version `version'

quietly {
	
	* syntax using/[, Clear]
	syntax using [, LABel LABelA(string) ]
	
	preserve
	
	insheet `using', nonames clear
	describe, short
	
	
	* number of columns
	local numcol = `r(k)'
	
	tempvar blanks rowmiss
	count if v1=="EQUATION"
	if `r(N)'~=0 {
		local eqPlace 1
		local varPlace 2
		count if v3=="LABELS"
		if `r(N)'~=0 {
			local labPlace 3
			local num=4
		}
		else {
			local labPlace 0
			local num=3
		}
	}
	else {
		local eqPlace 0
		local varPlace 1
		
		count if v2=="LABELS"
		if `r(N)'~=0 {
			local labPlace 2
			local num=3
		}
		else {
			local labPlace 0
			local num=2
		}
	}
	
	gen int `blanks' = (trim(v`num')=="")
	forvalues col = `num'/`numcol' {
		replace `blanks' = `blanks' & (trim(v`col')=="")
	}
	
	
	* title rows
	local titleWide = 0
	if v1[1]~="" | v2[1]~="" {
		* there may be a title
		if `labPlace'==0 & `varPlace'==1 {
		      while v1[`=`titleWide'+1']~="" &  v2[`=`titleWide'+1']=="" {
				local titleWide = `titleWide'+1
		}
			}
		if `labPlace'==0 & `varPlace'==2 {
		      while v2[`=`titleWide'+1']~="" &  v3[`=`titleWide'+1']=="" {
				local titleWide = `titleWide'+1
			}
		}
		if `labPlace'~=0 & `varPlace'==1 {
		      while v1[`=`titleWide'+1']~="" &  v3[`=`titleWide'+1']=="" {
				local titleWide = `titleWide'+1
			}
		}
		if `labPlace'~=0 & `varPlace'==2 {
	      while v2[`=`titleWide'+1']~="" &  v4[`=`titleWide'+1']=="" {
				local titleWide = `titleWide'+1
			}
		}
	}
	
	*local VARIABLES "VARIABLES"
	* first name AFTER titles is the VARIABLES
	local content
	local num=`titleWide'+1
	local N=_N
	while `"`content'"'=="" & `num'<=`N' {
		local content=v`varPlace'[`num']
		local num=`num'+1
	}
	local VARIABLES `"`content'"'
	
	replace `blanks'=0 if  v1==`"`VARIABLES'"' | v1[_n-1]==`"`VARIABLES'"' | v2==`"`VARIABLES'"' | v2[_n-1]==`"`VARIABLES'"'
	
		
	* getting bottomBorder (the bottom border), count up
	gen rowmiss=0
	foreach var of varlist v* {
		replace rowmiss=rowmiss+1 if `var'~=""
	}
	local N=_N
	local content 1
	local num 0
	while `content'==1 & `num'<`N' {
		local content rowmiss[`=`N'-`num'']
		local num=`num'+1
	}
	* do not have to add to titleWide
	local bottomRow = `N'-`num'+1
	local bottomBorder=`bottomRow'
	
	* getting halfway to headBorder (the top border), count down
	local content
	local num=`titleWide'+1
	local N=_N
	while `"`content'"'=="" & `num'<=`N' {
		local content=v`varPlace'[`num']
		local num=`num'+1
	}
	* do not have to add to titleWide
	local headRow `num'
	local headBorder=`headRow'
	
	drop rowmiss
	
	
	* avoid counting space within each statistics row as missing
	replace `blanks'=0 if `blanks'[_n+1]==0 & `blanks'==1 & _n >`titleWide'
	
	
	* statistics rows
	*count if `blanks'==0
	*local bottomBorder = `r(N)'+`titleWide'
	
	
	* move the notes and titles to the top of a new column
	gen str5 Notes_Titles=""
	format Notes_Titles %-20s 
	count if v1=="EQUATION"
	if `r(N)'==0 {
		* EQUATION column does not exist
		if `titleWide'>0 {
			forval num=1/`titleWide' {
				replace Notes_Titles=v1[`num'] in `num'
				replace v1="" in `num'
			}
		}
		
		local one = 1
		local legend = v1[`bottomBorder'+`one']
		
		
		local place 1
		*while "`legend'"~="" {
		local N=_N
		while `place' <= `N' {
			local place=`bottomBorder'+`one'
			local legend = v1[`place']
			replace Notes_Titles="`legend'" in `=`one'+`titleWide'+1'
			if "`legend'"~="" {
				replace v1="" in `place'
			}
			local one = `one'+1
		}
		
		* insert label changes here, minus 2 from c(k) for `blanks' & Notes_Titles column
		if "`label'"=="label" {
				*if ("`long'"~="long" & "`onecol'"~="onecol") | ("`long'"=="long" & "`onecol'"=="onecol") {
					replace v2=v1 if v2==""
					drop v1
					describe, short
					forval num=1/`=`r(k)'-2' {
						ren v`=`num'+1' v`num'
					}
					
					* change LABELS to VARIABLES
					replace v1=`"`VARIABLES'"' if v1=="LABELS"
				*}
				local label_adjust "-1"
		}
		
		* change the string length
		gen str5 temp=""
		replace temp=v1
		drop v1
		ren temp v1
		order v1
		* format
		foreach var of varlist v1 {
			local _format= "`: format `var''"
			local _widths=substr("`_format'",2,length(trim("`_format'"))-2)
			format `var' %-`_widths's
		}
	}
	else {
		* equation column exists
		if `titleWide'>0 {
			forval num=1/`titleWide' {
				replace Notes_Titles=v2[`num'] in `num'
				replace v2="" in `num'
			}
		}
		
		local one = 1
		local legend = v2[`bottomBorder'+`one']
		while "`legend'"~="" {
			local place=`bottomBorder'+`one'
			local legend = v2[`place']
			replace Notes_Titles="`legend'" in `=`one'+`titleWide'+1'
			if "`legend'"~="" {
				replace v2="" in `place'
			}
			local one = `one'+1
		}
		
		* insert label changes here, minus 2 from c(k) for `blanks' & Notes_Titles column
		if "`label'"=="label" {
				*else if "`long'"~="long" & "`onecol'"=="onecol" {
					replace v3=v2 if v3==""
					drop v2
					describe, short
					forval num=2/`=`r(k)'-2' {
						ren v`=`num'+1' v`num'
					}
					
					* change LABELS to VARIABLES
					replace v2=`"`VARIABLES'"' if v2=="LABELS"
				*}
				local label_adjust "-1"
		}
		
		
		* change the string length
		gen str5 temp=""
		replace temp=v2
		drop v2
		ren temp v2
		order v1 v2
		* format
		foreach var of varlist v1 v2 {
			local _format= "`: format `var''"
			local _widths=substr("`_format'",2,length(trim("`_format'"))-2)
			format `var' %-`_widths's
		}
	}
	
	* clean up
	*egen `rowmiss'=rowmiss(_all)
	* rowmiss option not available in 8.2 or 8.0, do it by hand
	
	gen `rowmiss'=0
	foreach var of varlist _all {
		if "`var'"~="`rowmiss'" & "`var'"~="`blanks'" {
			replace `rowmiss'=1+`rowmiss' if `var'==""
		}
	}
	
	*drop if `rowmiss'==`numcol'+1
	
	* adjust to handle label column droppings
	*drop if `rowmiss'==`numcol'+1 & `blanks'==1
	
	* fix blanks==1 for groupvar( )
	count if `blanks'==1
	local rN=`r(N)'+1
	forval num=1/`rN' {
		replace `blanks'=0 if `blanks'[_n+1]==0 & `blanks'==1
	}
	
	drop if `rowmiss'==`numcol'+1 `label_adjust' & `blanks'==1
	drop `blanks' `rowmiss'
	
	browse
	
	if "`Version7'"=="" {
		* it is version 7
	}
	else if `Version7'>=11.0 {
		noi di in yel "Hit Enter to continue" _request(junk)
	}
	
	*restore, preserve
}
end  /* end of seeing */


********************************************************************************************


* 02nov2009 to handle strings
prog define fmtgen
	
	syntax [varlist(default=none)] [in], replace(str asis) fmt(str asis) [dec(int 3) auto(int 3) less(int 0) width(int 12) gen(str asis) ]
if "`varlist'"~="" {
	local varname `varlist'
	replace `replace' = string(`varname',"%12.`dec'`fmt'") `in'
}
end


********************************************************************************************


* 02nov2009 to handle strings and variables in addition to numbers
* 09nov2009 also accomodates various user-specified formats, including e
prog define autogen
	versionSet
	version `version'
	
	syntax [varlist(default=none)] [in], replace(str asis) [dec(int 3) fmt(str asis) auto(int 3) less(int 0) width(int 12) gen(str asis)]

if "`fmt'"=="" {
	local fmt f
}

if "`varlist'"~="" {
	local varname `varlist'
	
	if "`in'"~="" {
		gettoken junk begin: in, parse(" ")
		gettoken begin end: begin, parse("/")
		gettoken slash end: end, parse("/")
	}
	else {
		local begin 1
		local end=_N
	}
	
	cap confirm numeric var `varname'
	
	if _rc==0 {
		tempvar whole times left aadec aadecString valstr format
		*gen `whole'=1 if round((`varname' - int(`varname')),0.0000000001)==0 
		*gen `whole'=1 if float(`varname') - int(`varname')==0
		gen `whole'=1 if round(`varname' - int(round(`varname',0.0000000001)),0.0000000001)==0
		replace `whole'=0 if `whole'==.
		
		* digits that need to be moved if it were only decimals: take the ceiling of log 10 of absolute value of decimals
		gen `times'=abs(int(ln(abs(`varname'-int(`varname')))/ln(10)-1)) if `whole'==0
		
		* the whole number: take the ceiling of log 10 of absolute value
		gen `left'=int(ln(abs(`varname'))/ln(10)+1) if `whole'==0
		
		* assign the fixed decimal values into aadec
		gen `aadec'=0 if `whole'==1
			
			* reduce the left by one if more than zero to accept one extra digit
			replace `aadec'=`auto'-`left'+1 if .>`left' & `left'>0 & `left'<=`auto' & `whole'==0
			replace `aadec'=`auto'-`left'-1 if .>`left' & `left'>0 & `left'>`auto' & `whole'==0
			
			* else
			replace `aadec'=`times'+`auto'-1 if (.<=`left' | `left'<=0) & `whole'==0
			
			* needs to between 0 and 11
			replace `aadec'=`aadec'-`less'
			replace `aadec'=0 if `aadec'<0
			
			gen str12 `aadecString'=string(`aadec')
			gen str12 `valstr'=""
			
			replace `valstr'=`aadecString'+"`fmt'" if `aadec'<7 & `aadec'~=.
			if "`fmt'"=="e" {
				replace `valstr'="`=`auto'-0'e"
			}

			replace `valstr'="`=`auto'-1'e" if `aadec'>=7 & `aadec'~=.
			
			* make it exponential if too big or too negative (small)
			replace `valstr' = "`=`auto'+0'e" if `varname'>1000000 & `varname'<.
			replace `valstr' = "`=`auto'+0'e" if `varname'<-1000000 & `varname'<.
			
			gen str12 `format'= "%`width'." + `valstr' if `valstr'~=""
			
		forval num=`begin'/`end' {
			local content=`format'[`num']
			replace `replace' = string(`varname',"`content'") in `num'
		}
	}
	else {
		* string variable, do it old-fashioned way
		replace `replace'=`varname'
		forval num=`begin'/`end' {
			capture confirm number `=`varname'[`num']'
			if _rc==0 {
				autofmt, input(`=`varname'[`num']') dec(`auto') less(`less')
				if "`=`varname'[`num']'"~="" {
					replace `replace' = string(`=`varname'[`num']',"%`width'.`r(deci1)'`fmt'") if _n==`num' & "`r(deci1)'"~="."
				}
				/*
				autodigits2 `=`varname'[`num']' `auto' `less'
				if "`=`varname'[`num']'"~="" {
					replace `replace' = string(`=`varname'[`num']',"%`width'.`r(valstr)'") if _n==`num' & "`r(valstr)'"~="."
				}
				*/
				*autodigits2 tstatVal[`num'] `auto' `less'
				*replace tstatString = string(tstatVal,"%12.`r(valstr)'") in `num'
			}
		}
	}
}
else {
	* not a variable

}
end


********************************************************************************************


* 03nov2009 integer check upgraded to handle more indeterminancy coming from string numerals
program define autodigits2, rclass
	versionSet
	version `version'

* getting the significant digits
args input auto less

if `input'~=. {
	local times=0
	local left=0
	
	* integer checked by modified mod function
	*if round((`input' - int(`input')),0.0000000001)==0 {
	if round(`input' - int(round(`input',0.0000000001)),0.0000000001)==0 {
		local whole=1
	}
	else {
		local whole=0
		* non-interger
		 if `input'<. {
			
			* digits that need to be moved if it were only decimals: take the ceiling of log 10 of absolute value of decimals
			local times=abs(int(ln(abs(`input'-int(`input')))/ln(10)-1))	
			
			* the whole number: take the ceiling of log 10 of absolute value
			local left=int(ln(abs(`input'))/ln(10)+1)
		}
	}
	
	
	* assign the fixed decimal values into aadec
	if `whole'==1 {
		local aadec=0
	}
	else if .>`left' & `left'>0 {
		* reduce the left by one if more than zero to accept one extra digit
		if `left'<=`auto' {
			local aadec=`auto'-`left'+1
		}
		else {
			local aadec=0
		}
	}
	else {
		local aadec=`times'+`auto'-1
	}
	
	if "`less'"=="" {
		* needs to between 0 and 11
		if `aadec'<0 {
			local aadec=0
		}
		*if `aadec'<11 {
		if `aadec'<7 {
			* use fixed
			local valstr "`aadec'f"
		}
		else {
			* use exponential
			local valstr "`=`auto'-1'e"
		}
	}
	else {
		* needs to between 0 and 11
		local aadec=`aadec'-`less'
		if `aadec'<0 {
			local aadec=0
		}
		*if `aadec'<10 {
		if `aadec'<7 {
			* use fixed
			local valstr "`aadec'f"
		}
		else {
			* use exponential
			local valstr "`=`auto'-1'e"
		}
	}
	
	* make it exponential if too big
	if `input'>1000000 & `input'<. {
		local valstr "`=`auto'-0'e"		
	}
	
	* make it exponential if too negative (small)
	if `input'<-1000000 & `input'<. {
		local valstr "`=`auto'-0'e"		
	}
	
	return scalar value=`aadec'
	return local valstr="`valstr'"
}
else {
	* it is a missing value
	return scalar value=.
	return local valstr="missing"
}
end


********************************************************************************************

* ripped from autofmt on 09nov2009
* autofmt 1.0.1 03nov2009 roywada@hotmail.com
* automatic formating of a significant number of digits

program define autofmt, rclass
version 7.0

syntax, input(string) [dec(integer 3) less(integer 0) parse(string) strict]
* parse( ) takes only one character; " " is always included as a parse

if `"`parse'"'=="" {
        local parse " "
}

local rest `"`input'"'
local count 0

if "`rest'"~="" {
        * handles the possibility the first token is empty
        gettoken first rest: rest, parse("`parse'")
        local first=trim(`"`first'"')
        if `"`first'"'==`"`parse'"' {
                local count=`count'+1
                local input`count' ""
        }
        else {
                local count=`count'+1
                local input`count' `"`first'"'
        }
}
while "`rest'"~="" {
        gettoken first rest: rest, parse("`parse'")
        local first=trim(`"`first'"')
        if `"`first'"'~=`"`parse'"' {
                local count=`count'+1
                local input`count' `"`first'"'
        }
}

if `count'==0 {
        * input( ) was left empty
        exit
}

if "`strict'"=="strict" {
	local one 0
}
else {
	local one 1
}


*** run as many times

forval num=1/`count' {

        * confirm a number
        capture confirm number `input`num''
        local rc=_rc
        
        * run if not missing and is a number
        if "`input`num''"~="." & "`input`num''"~="" & `rc'==0 {
                local times=0
                local left=0
                
                * integer checked by modified mod function
                *if round((`input`num'' - int(`input`num'')),0.0000000001)==0 {
			if round(`input' - int(round(`input',0.0000000001)),0.0000000001)==0 {
				local whole=1
			}
                else {
                        local whole=0
                        * non-interger
                         if `input`num''<. {
                                
                                * digits that need to be moved if it were only decimals: take the ceiling of log 10 of absolute value of decimals
                                local times=abs(int(ln(abs(`input`num''-int(`input`num'')))/ln(10)-1))  
                                
                                * the whole number: take the ceiling of log 10 of absolute value
                                local left=int(ln(abs(`input`num''))/ln(10)+1)
                        }
                }
                
                
                * assign the fixed decimal values into aadec
                if `whole'==1 {
                        local aadec=0
                }
                else if .>`left' & `left'>0 {
                        * reduce the left by one if more than zero to accept one extra digit
                        if `left'<=`dec' {
                                local aadec=`dec'-`left'+`one'
                        }
                        else {
                                local aadec=0
                        }
                }
                else {
                        local aadec=`times'+`dec'-1
                }
                
                if "`less'"=="" {
                        * needs to between 0 and 11
                        if `aadec'<0 {
                                local aadec=0
                        }
                        *if `aadec'<11 {
                        if `aadec'<7 {
                                * use fixed
                                local fmt "`aadec'f"
                        }
                        else {
                                * use exponential
                                local fmt "`=`dec'-1'e"
                        }
                }
                else {
                        * needs to between 0 and 11
                        local aadec=`aadec'-`less'
                        if `aadec'<0 {
                                local aadec=0
                        }
                        *if `aadec'<10 {
                        if `aadec'<7 {
                                * use fixed
                                local fmt "`aadec'f"
                        }
                        else {
                                * use exponential
                                local fmt "`=`dec'-1'e"
                        }
                }
                
                * make it exponential if too big
                if `input`num''>1000000 & `input`num''<. {
                        local fmt "`=`dec'-0'e"                
                }
                
                * make it exponential if too negative (small)
                if `input`num''<-1000000 & `input`num''<. {
                        local fmt "`=`dec'-0'e"                
                }
                
                local fmt`num' `fmt'
                local aadec`num' `aadec'
                
                local output`num'=string(`input`num'',"%12.`fmt'")
                
                return scalar deci`num'=`aadec'
                return local fmt`num'="`fmt'"
                return local input`num'="`input`num''"
                
                return local output`num'=`"`output`num''"'

        }
        else {
                * it is a missing value, empty, or non-number
                local output`num'=trim(`"`input`num''"')
                
                return scalar deci`num'=.
                return local fmt`num'="."
                if "`input`num''"=="" {
                        * return a dot when empty
                        return local input`num'="."
                }
                else {
                        return local input`num'="`input`num''"
                }
                
                return local output`num'=`"`output`num''"'

        }
}
end


********************************************************************************************


program define _texout, sortpreserve
* based on out2tex version 0.9 4oct01 by john_gallup@alum.swarthmore.edu
	versionSet
	version `version'
	
	* add one if only one v* column exists
	unab list: v*
	local count: word count `list'
	if `count'==1 {
		gen str v2=""
		order v*
	}
	if `count'==0 {
		exit
	}
	
	syntax varlist using/, titleWide(int) headBorder(int) bottomBorder(int)			/*
		*/	[texFile(string) TOtrows(int 0) Landscape Fragment NOPRetty PRetty	/*
		*/	Fontsize(numlist integer max=1 >=10 <=12) noBorder Cellborder		/*
		*/	Appendpage noPAgenum a4 a5 b5 LETter LEGal EXecutive replace		]
	if `totrows'==0 {
		local totrows = _N
	}
	local numcols : word count `varlist'
	gettoken varname statvars : varlist
	local fast 1
	
	if "`pretty'"=="pretty" {
		local pretty ""
	}
	else {
		local pretty "NOT PRETTY AT ALL"
	}
	
	local colhead1 = `titleWide' + 1
	local strow1 = `headBorder' + 1
	
	* insert $<$ to be handled in LaTeX conversion
	local N=_N
	forval num=`bottomBorder'/`N' {
		local temp=v1[`num']
		tokenize `"`temp'"', parse (" <")
		local count 1
		local newTex ""
		local noSpace 0
		while `"``count''"'~="" {
			if `"``count''"'=="<" {
				local `count' "$<$"
				local newTex `"`newTex'``count''"'
				local noSpace 1
			}
			else {
				if `noSpace'~=1 {
					local newTex `"`newTex' ``count''"'
				}
				else {
					local newTex `"`newTex'``count''"'					
					local noSpace 0
				}
			}
			local count=`count'+1
		}
		replace v1=`"`newTex'"' in `num'
	}
	
	*** replace if equation column present
	count if v1=="EQUATION"
	if `r(N)'~=0 {
		tempvar myvar
		* use v2 instead
		replace v1 = v2 in `=`bottomBorder'+1'/`totrows'
		replace v2 = "" in `=`bottomBorder'+1'/`totrows'
		
		* change the string length
		gen str5 `myvar' =""
		replace `myvar' =v2
		drop v2
		ren `myvar' v2
		order v1 v2
	}
	
	/* if file extension specified in `"`using'"', replace it with ".tex" for output
	local next_dot = index(`"`using'"', ".")
	if `next_dot' {
		local using = substr("`using'",1,`=`next_dot'-1')
	}
	*/
	
	if `"`texFile'"'=="" {
		local endName "tex"
	}
	else {
		local endName "`texFile'"
	}
	
	local using `"using "`using'.`endName'""'
	local fsize = ("`fontsize'" != "")
	if `fsize' {
		local fontsize "`fontsize'pt"
	}
	local lscp = ("`landscape'" != "") 
	if (`lscp' & `fsize') {
		local landscape ",landscape"
	}
	local pretty	= ("`pretty'" == "")
	local cborder  = ("`cellborder'" != "")
	local noborder = ("`border'" != "")
	local nopagen  = ("`pagenum'" != "")
	local nofrag	= ("`fragment'" == "")
	
	if `cborder' & `noborder' {
		di in red "may not specify both cellborder and noborder options"
		exit 198
	}
	
	local nopt : word count `a4' `a5' `b5' `letter' `legal' `executive'
	if `nopt' > 1 {
		di in red "choose only one of a4, a5, b5, letter, legal, executive"
		exit 198 
	}
	local pagesize "`a4'`a5'`b5'`letter'`legal'`executive'"
	if "`pagesize'"=="" | "`letter'"!="" {
		local pwidth  "8.5in"
		local pheight "11in"
	}
	else if "`legal'"!="" {
		local pwidth  "8.5in"
		local pheight "14in"
	}
	else if "`executive'"!="" {
		local pwidth  "7.25in"
		local pheight "10.5in"
	}
	else if "`a4'"!="" {
		local pwidth  "210mm"
		local pheight "297mm"
	}
	else if "`a5'"!="" {
		local pwidth  "148mm"
		local pheight "210mm"
	}
	else if "`b5'"!="" {
		local pwidth  "176mm"
		local pheight "250mm"
	}
	if `lscp' {
		local temp	 "`pwidth'"
		local pwidth  "`pheight'"
		local pheight "`temp'"
	}
	if "`pagesize'"!="" {
		local pagesize "`pagesize'paper"
		if (`lscp' | `fsize') {
			local pagesize ",`pagesize'"
		}
	}
	if `cborder' & `noborder' {
		di in red "may not specify both cellborder and noborder options"
		exit 198
	}
	
	quietly {
		tempvar has_eqn st2_row last_st pad0 pad1 pad2_n padN order
		
		* replace % with \%, and _ with \_ if <2 $'s (i.e. not an inline equation: $...$
		* has_eqn indicates that varname has 2+ $'s
		
		gen byte `has_eqn' = index(`varname',"$")
		
		* make sure there are 2+ "$" in varname
		replace `has_eqn' = index(substr(`varname',`has_eqn'+1,.),"$")>0 if `has_eqn'>0
		replace `varname'= subinstr(`varname',"_", "\_", .) if !`has_eqn'
		replace `varname'= subinstr(`varname',"%", "\%", .)
		
		if `pretty' {
			replace `varname'= subinword(`varname',"R-squared", "\$R^2$", 1) in `strow1'/`bottomBorder'
			replace `varname'= subinstr(`varname'," t stat", " \em t \em stat", 1) in `bottomBorder'/`totrows'
			replace `varname'= subinstr(`varname'," z stat", " \em z \em stat", 1) in `bottomBorder'/`totrows'
		}
		
		foreach svar of local statvars { /* make replacements for column headings rows of statvars */
			replace `has_eqn' = index(`svar',"$") in `colhead1'/`headBorder'
			replace `has_eqn' = index(substr(`svar',`has_eqn'+1,.),"$")>0 in `colhead1'/`headBorder' if `has_eqn'>0
			replace `svar'= subinstr(`svar',"_", "\_", .) in `colhead1'/`headBorder' if !`has_eqn'
			replace `svar'= subinstr(`svar',"%", "\%", .) in `colhead1'/`headBorder'
			
			/* replace <, >, {, }, | with $<$, $>$, \{, \}, and $|$ in stats rows */
			/* which can be used as brackets by outstat */
			replace `svar'= subinstr(`svar',"<", "$<$", .) in `strow1'/`bottomBorder'
			replace `svar'= subinstr(`svar',">", "$>$", .) in `strow1'/`bottomBorder'
			replace `svar'= subinstr(`svar',"{", "\{", .)  in `strow1'/`bottomBorder'
			replace `svar'= subinstr(`svar',"}", "\}", .)  in `strow1'/`bottomBorder'
			replace `svar'= subinstr(`svar',"|", "$|$", .) in `strow1'/`bottomBorder'
		}
		
		if `pretty' {  /* make title fonts large; notes & t stats small */
			local blarge "\begin{large}"
			local elarge "\end{large}"
			local bfnsize "\begin{footnotesize}"
			local efnsize "\end{footnotesize}"
		}
		if `cborder' {
			local vline "|"
		}
		gen str20 `pad0' = ""
		gen str20 `padN' = ""
		if `titleWide' {
			replace `pad0' = "\multicolumn{`numcols'}{`vline'c`vline'}{`blarge'" in 1 / `titleWide'
			replace `padN' = "`elarge'} \\\" in 1 / `titleWide'
		}
		if `bottomBorder' < `totrows' {
			local noterow1 = `bottomBorder' + 1
			replace `pad0' = "\multicolumn{`numcols'}{`vline'c`vline'}{`bfnsize'" in `noterow1' / l
			replace `padN' = "`efnsize'} \\\" in `noterow1' / l
		}
		
		gen str3 `pad1' = " & " in `colhead1' / `bottomBorder'
		if `numcols' > 2 {
			gen str3 `pad2_n' = `pad1'
		}
		if `pretty' { /* make stats 2-N small font */
			local strow1 = `headBorder' + 1
			gen byte `st2_row' = 0
			replace `st2_row' = (trim(`varname') == "") in `strow1' / `bottomBorder'	 /* only stats 2+ */
			gen byte `last_st' = (`st2_row' & `varname'[_n+1] != "")			 /* last stats row */
			if !`cborder' {
				replace `pad0'	= "\vspace{4pt}" if `last_st'
			}
				replace `pad1'	= `pad1' + "`bfnsize'" if `st2_row'
				if `numcols' > 2 {
					replace `pad2_n' = "`efnsize'" + `pad2_n' + "`bfnsize'" if `st2_row'
				}
				replace `padN'	= "`efnsize'" if `st2_row'
			}
		
			replace `padN' = `padN' + " \\\" in `colhead1' / `bottomBorder'
			if `cborder' {
				replace `padN' = `padN' + " \hline"
			}
			else {
			if !`noborder' {
				if `headBorder' {
					if `titleWide' {
						replace `padN' = `padN' + " \hline" in `titleWide'
					}
					replace `padN' = `padN' + " \hline" in `headBorder'
				}
				replace `padN' = `padN' + " \hline" in `bottomBorder'
			}
		}
		
		local vlist "`pad0' `varname' `pad1'"
		tokenize `statvars'
		local ncols_1 = `numcols' - 1
		local ncols_2 = `ncols_1' - 1
		forvalues v = 1/`ncols_2' {
			local vlist "`vlist' ``v'' `pad2_n'"
		}
		local vlist "`vlist' ``ncols_1'' `padN'"
		
		local texheadfootrows = `nofrag' + `pretty' + 1	/* in both headers and footers */ 
		local texheadrow = 2 * `nofrag' + `nopagen' + `texheadfootrows'
		local texfootrow = `texheadfootrows'
		local newtotrows = `totrows' + `texheadrow' + `texfootrow'
		if `newtotrows' > _N {
			local oldN = _N
			set obs `newtotrows'
		}
		else {
			local oldN = 0
		}
		gen long `order' = _n + `texheadrow' in 1 / `totrows'
		local newtexhrow1 = `totrows' + 1
		local newtexhrowN = `totrows' + `texheadrow'
		replace `order' = _n - `totrows' in `newtexhrow1' / `newtexhrowN'
		sort `order'
		
		
		* insert TeX header lines
		local ccc : display _dup(`ncols_1') "`vline'c"
		if `nofrag' {
			replace `pad0' = "\documentclass[`fontsize'`landscape'`pagesize']{article}" in 1
			replace `pad0' = "\setlength{\pdfpagewidth}{`pwidth'} \setlength{\pdfpageheight}{`pheight'}" in 2
			replace `pad0' = "\begin{document}" in 3
			replace `pad0' = "\end{document}" in `newtotrows'  
		}
		if `nopagen' {
			local row = `texheadrow' - 1 - `pretty'
			replace `pad0' = "\thispagestyle{empty}" in `row'
		}
		if `pretty' {
			local row = `texheadrow' - 1
			replace `pad0' = "\begin{center}" in `row'
			local row = `newtotrows' - `texfootrow' + 2
			replace `pad0' = "\end{center}"	in `row'
		}
		local row = `texheadrow'
		replace `pad0' = "\begin{tabular}{`vline'l`ccc'`vline'}" in `row'
		if (!`titleWide' | `cborder') & !`noborder' {
			replace `pad0' = `pad0' + " \hline" in `row'
		}
		local row = `newtotrows' - `texfootrow' + 1
		replace `pad0' = "\end{tabular}" in `row'
		
		outfile `vlist' `using' in 1/`newtotrows', `replace' runtogether
		
		* delete new rows created for TeX table, if any
		if `oldN' {
			keep in 1/`totrows'
		}
	} /* quietly */
end  /* end _texout */


********************************************************************************************


program define out2rtf2, sortpreserve rclass

	versionSet
	version `version'

* based on version 0.9 4oct01 by john_gallup@alum.swarthmore.edu
	syntax varlist using/, titleWide(int) headBorder(int) bottomBorder(int)		/*
		*/	[wordFile(string) TOtrows(int 0) Landscape Fragment noPRetty	/*
		*/	Fontsize(numlist max=1 >0) noBorder Cellborder				/*
		*/	Appendpage PAgesize(string)							/*
		*/	Lmargin(numlist max=1 >=0.5) Rmargin(numlist max=1 >=0.5)		/*
		*/	Tmargin(numlist max=1 >=0.5) Bmargin(numlist max=1 >=0.5)		/*
		*/	replace]
		if `totrows'==0 {
			local totrows = _N
		}
	local numcols : word count `varlist'
	gettoken varname statvars : varlist
	local fast 1
	
	local colhead1 = `titleWide' + 1
	local strow1 = `headBorder' + 1
	
	
	*** replace if equation column present
	local hack 0
	count if v1=="EQUATION"
	if `r(N)'~=0 {
		* use v2 instead
		replace v1 = v2 in `=`bottomBorder'+1'/`totrows'
		replace v2 = "" in `=`bottomBorder'+1'/`totrows'
		
		* change the string length
		gen str5 myvar =""
		replace myvar =v2
		drop v2
		ren myvar v2
		order v1 v2
		
		local hack 1
	}
	
	/* if file extension specified in `using', replace it with ".rtf" for output
	local next_dot = index("`using'", ".")
	if `next_dot' {
		local using = substr("`using'",1,`=`next_dot'-1')
	}
	*/
	
	if `"`wordFile'"'=="" {
		local endName "rtf"
	}
	else {
		local endName "`wordFile'"
	}
	
	local using `"using "`using'.`endName'""'
	return local documentname `"`using'"'
	
	if "`fontsize'" == "" {
		local fontsize "12"
	}
	
	local lscp = ("`landscape'" != "") 
	local pretty	= ("`pretty'" == "")
	local cborder  = ("`cellborder'" != "")
	local noborder = ("`border'" != "")
	local stdborder = (!`noborder' & !`cborder')
	local nopagen  = ("`pagenum'" != "")
	local nofrag	= ("`fragment'" == "")
	
	
	if `cborder' & !`noborder' {
		di in red "may not specify both cellborder and noborder options"
		exit 198
	}
	
	* reformat "R-squared" and italicize "t" or "z"
	if `pretty' {
		quietly {
			replace `varname'= subinword(`varname',"R-squared", "{\i R{\super 2}}", 1) in `strow1'/`bottomBorder'
			replace `varname'= subinstr(`varname'," t stat", " {\i t} stat", 1) in `bottomBorder'/`totrows'
			replace `varname'= subinstr(`varname'," z stat", " {\i z} stat", 1) in `bottomBorder'/`totrows'
		}
	}
	
	* font sizes in points*2
	local font2 = int(`fontsize'*2)
	if `pretty' {
		/* make title fonts large; notes & t stats small */
		local fslarge = "\fs" + string(int(`font2' * 1.2))
		local fsmed	= "\fs" + string(`font2')
		local fssmall = "\fs" + string(int(`font2' * 0.8))
		local sa0 "\sa0"	/* put space after t stats rows */
		local gapsize = int(`fontsize'*0.4*20)  /* 40% of point size converted to twips */
		local sa_gap "\sa`gapsize'"
	}
	else {
		local fs0 = "\fs" + string(`font2')
	}
	
	local onecolhead = (`headBorder' - `titleWide' == 1)
			/* onecolhead = true if only one row of column headings */
	if `stdborder' {
		if !`onecolhead' {
			* runs here
			*local trbrdrt "\clbrdrt\brdrs"	/* table top is overlined */
			*local trbrdrt "\trbrdrt\brdrs"	/* table top is overlined */
			
			local clbrdr_uo "\clbrdrt\brdrs"	/* cells are overlined */
			local clbrdr_ul "\clbrdrb\brdrs"	/* cells are underlined */
		}
		else {
			/* cells are over- and underlined */
			local clbrdr_ul "\clbrdrt\brdrs\clbrdrb\brdrs"
		
		}
		local trbrdrb "\trbrdrb\brdrs"
	}
	if `cborder' {
		/* if !cborder then clbrdr is blank */
		local clbrdr "\clbrdrt\brdrs\clbrdrb\brdrs\clbrdrl\brdrs\clbrdrr\brdrs"
	}
	
	* figure out max str widths to make cell boundaries
	* cell width in twips = (max str width) * (pt size) * 12
	* (12 found by trial and error)
	local twipconst = int(`fontsize' * 12 )
	tempvar newvarname
	qui gen str80 `newvarname' = `varname' in `strow1'/`bottomBorder'
	
	local newvarlist "`newvarname' `statvars'"
	qui compress `newvarlist'
	local cellpos = 0
	foreach avar of local newvarlist {
		local strwidth : type `avar'
		local strwidth = subinstr("`strwidth'", "str", "", .)
		local strwidth = `strwidth' + 1  /* add buffer */
		local cellpos = `cellpos' + `strwidth'*`twipconst'

		* hacking
		if `hack'==1 & "`avar'"=="`newvarname'" & `cellpos'<1350 {
			local cellpos=1350 
		}
		local clwidths "`clwidths'`clbrdr'\cellx`cellpos'"
		
		* put in underline at bottom of header in clwidth_ul
		local clwidth_ul "`clwidth_ul'`clbrdr_ul'\cellx`cellpos'"
		
		* put in overline
		local clwidth_ol "`clwidth_ol'`clbrdr_uo'\cellx`cellpos'"
	}
	
	if `stdborder' {
		if `onecolhead' {
			local clwidth1 "`clwidth_ul'"
		}
		else {
			local clwidth1 "`clwidths'"
			local clwidth2 "`clwidth_ul'"
		}
		local clwidth3 "`clwidths'"
	}
	else{
		local clwidth1 "`clwidths'"
	}
	
	* statistics row formatting
	tempvar prettyfmt
	qui gen str12 `prettyfmt' = ""  /* empty unless `pretty' */
	if `pretty' {
		* make stats 2-N small font
		tempvar st2_row last_st
		quietly {
			gen byte `st2_row' = 0
			replace `st2_row' = (trim(`varname') == "") in `strow1' / `bottomBorder'	 /* only stats 2+ */
			gen byte `last_st' = (`st2_row' & `varname'[_n+1] != "")			 /* last stats row */
			replace `prettyfmt' = "`sa0'" in `strow1' / `bottomBorder'
			replace `prettyfmt' = "`sa_gap'"  if `last_st' in `strow1' / `bottomBorder'
			replace `prettyfmt' = `prettyfmt' + "`fsmed'" if !`st2_row' in `strow1' / `bottomBorder'
			replace `prettyfmt' = `prettyfmt' + "`fssmall'"  if `st2_row' in `strow1' / `bottomBorder'
		}
	}
	
	* create macros with file write contents
	
	forvalues row = `colhead1'/`bottomBorder' { 
		local svarfmt`row' `"(`prettyfmt'[`row']) "\ql " (`varname'[`row']) "\cell""'
		foreach avar of local statvars {
			local svarfmt`row' `"`svarfmt`row''"\qc " (`avar'[`row']) "\cell""' 
		}
		local svarfmt`row' `"`svarfmt`row''"\row" _n"'
	}
	
	* write file
	tempname rtfile
	cap file open `rtfile' `using', write `replace'
	if _rc==608 {
		noi di in red `"file `using' is read-only; cannot be modified or erased"'
		noi di in red `"The file needs to be closed if being used by another software such as Word."'
		exit 608
	}
	
	file write `rtfile' "{\rtf1`fs0'" _n  /* change if not roman: \deff0{\fonttbl{\f0\froman}} */
	
	* title
	if `titleWide' {
		file write `rtfile' "\pard\qc`fslarge'" _n
		forvalues row = 1/`titleWide' {
			file write `rtfile' (`varname'[`row']) "\par" _n
		}
	}
	
	* The top line
	file write `rtfile' "\trowd\trgaph75\trleft-75\intbl\trqc`fsmed'`trbrdrt'`clwidth_ol'" _n
	*file write `rtfile' "\trowd\trgaph75\trleft-75\intbl\trqc`fsmed'`trbrdrt'`clwidth1'" _n
	
	local headBorder_1 = `headBorder' - 1
	* write header rows 1 to N-1
	
	forvalues row = `colhead1'/`headBorder_1' {
		file write `rtfile' `svarfmt`row''
		* turn off the overlining the first time it's run
		file write `rtfile' "\trowd\trgaph75\trleft-75\trqc`clwidth3'" _n
	}
	file write `rtfile' "\trowd\trgaph75\trleft-75\trqc`clwidth2'" _n
	
	* write last header row
	file write `rtfile' `svarfmt`headBorder''

	local bottomBorder_1 = `bottomBorder' - 1
	/* turn off cell underlining */
	file write `rtfile' "\trowd\trgaph75\trleft-75\trqc`clwidth3'" _n
	
	* table contents
	forvalues row = `strow1'/`bottomBorder_1' {
		file write `rtfile' `svarfmt`row''
	}
	
	if `stdborder' {
		/* write last row */
		*file write `rtfile' "\trowd\trgaph75\trleft-75\trqc`trbrdrb'`clwidths'" _n
		* make it underline
		file write `rtfile' "\trowd\trgaph75\trleft-75\trqc`trbrdrb'`clwidth_ul'" _n
		file write `rtfile' `svarfmt`bottomBorder''
	}
	
	/* write notes rows */
	if `bottomBorder' < `totrows' {
		local noterow1 = `bottomBorder' + 1
		file write `rtfile' "\pard\qc`fssmall'" _n
		forvalues row = `noterow1'/`totrows' {
			file write `rtfile' (`varname'[`row']) "\par" _n
		}
	}
	
	* write closing curly bracket
	file write `rtfile' "}"
end  /* end out2rtf2 */


********************************************************************************************


program define _xmlout
	versionSet
	version `version'

* emulates the output produced by xmlsave:
* xmlsave myfile, replace doctype(excel) legible

syntax using/ [, excelFile(string) LEGible noNAMes titleWide(integer 0) /*
	*/ headBorder(integer 10) bottomBorder(integer 10)  ]

* assumes all columns are string; if numbers, then the format needs to be checked

*local legible legible

if "`legible'"=="legible" {
	local _n "_n"
}

tempname source saving

if `"`excelFile'"'=="" {
	local endName "xml"
}
else {
	local endName "`excelFile'"
}
	
local save `"`using'.`endName'"'

*file open `source' using `"`using'"', read
cap file open `saving' using `"`save'"', write text replace

if _rc==608 {
	noi di in red `"file `save' is read-only; cannot be modified or erased"'
	noi di in red `"The file needs to be closed if being used by another software such as Excel."'
	exit 608
}

*file write `saving' `"`macval(line)'"'
file write `saving' `"<?xml version="1.0" encoding="US-ASCII" standalone="yes"?>"' `_n'
file write `saving' `"<?mso-application progid="Excel.Sheet"?>"' `_n'
file write `saving' `"<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet""' `_n'
file write `saving' `" xmlns:o="urn:schemas-microsoft-com:office:office""' `_n'
file write `saving' `" xmlns:x="urn:schemas-microsoft-com:office:excel""' `_n'
file write `saving' `" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet""' `_n'
file write `saving' `" xmlns:html="http://www.w3.org/TR/REC-html40">"' `_n'
file write `saving' `"<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">"' `_n'
file write `saving' `"<Author></Author>"' `_n'
file write `saving' `"<LastAuthor></LastAuthor>"' `_n'
file write `saving' `"<Created></Created>"' `_n'
file write `saving' `"<LastSaved></LastSaved>"' `_n'
file write `saving' `"<Company></Company>"' `_n'
file write `saving' `"<Version></Version>"' `_n'
file write `saving' `"</DocumentProperties>"' `_n'
file write `saving' `"<ExcelWorkbook  xmlns="urn:schemas-microsoft-com:office:excel">"' `_n'
file write `saving' `"<ProtectStructure>False</ProtectStructure>"' `_n'
file write `saving' `"<ProtectWindows>False</ProtectWindows>"' `_n'
file write `saving' `"</ExcelWorkbook>"' `_n'
file write `saving' `"<Styles>"' `_n'

* styles
file write `saving' `"<Style ss:ID="Default" ss:Name="Normal">"' `_n'
file write `saving' `"<Alignment ss:Vertical="Bottom"/>"' `_n'
file write `saving' `"<Borders/>"' `_n'
file write `saving' `"<Font/>"' `_n'
file write `saving' `"<Interior/>"' `_n'
file write `saving' `"<NumberFormat/>"' `_n'
file write `saving' `"<Protection/>"' `_n'
file write `saving' `"</Style>"' `_n'

* bold & (center)
file write `saving' `"<Style ss:ID="s1">"' `_n'
*file write `saving' `"<Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>"' `_n'
file write `saving' `"<Font ss:Bold="1" ss:Size='12'/>"' `_n'
file write `saving' `"<NumberFormat/>"' `_n'
file write `saving' `"</Style>"' `_n'

* top border & center
file write `saving' `"<Style ss:ID="s21">"' `_n'
file write `saving' `"<Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>"' `_n'
file write `saving' `"<NumberFormat/>"' `_n'
file write `saving' `"<Borders>"' `_n'
file write `saving' `"<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>"' `_n'
file write `saving' `"</Borders>"' `_n'
file write `saving' `"</Style>"' `_n'

* main body (no border) & center
file write `saving' `"<Style ss:ID="s22">"' `_n'
file write `saving' `"<Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>"' `_n'
file write `saving' `"<NumberFormat/>"' `_n'
file write `saving' `"</Style>"' `_n'

* bottom border & center
file write `saving' `"<Style ss:ID="s23">"' `_n'
file write `saving' `"<Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>"' `_n'
file write `saving' `"<NumberFormat/>"' `_n'
file write `saving' `"<Borders>"' `_n'
file write `saving' `"<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>"' `_n'
file write `saving' `"</Borders>"' `_n'
file write `saving' `"</Style>"' `_n'

* goldfish (no border, left-justified)
file write `saving' `"<Style ss:ID="s24">"' `_n'
file write `saving' `"<NumberFormat/>"' `_n'
file write `saving' `"</Style>"' `_n'

* top border
file write `saving' `"<Style ss:ID="s31">"' `_n'
file write `saving' `"<Borders>"' `_n'
file write `saving' `"<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>"' `_n'
file write `saving' `"</Borders>"' `_n'
file write `saving' `"</Style>"' `_n'

* main body (no border)
file write `saving' `"<Style ss:ID="s32">"' `_n'
file write `saving' `"<Borders/>"' `_n'
file write `saving' `"</Style>"' `_n'

* bottom border & center
file write `saving' `"<Style ss:ID="s33">"' `_n'
file write `saving' `"<Borders>"' `_n'
file write `saving' `"<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>"' `_n'
file write `saving' `"</Borders>"' `_n'
file write `saving' `"</Style>"' `_n'

file write `saving' `"</Styles>"' `_n'
file write `saving' `"<Names>"' `_n'
file write `saving' `"</Names>"' `_n'
file write `saving' `"<Worksheet ss:Name="Sheet1">"' `_n'

* set up file size
qui describe, short

local N=_N
local tableN `N'

if "`names'"~="nonames" {
	* add one if variable names are to be inserted
	local tableN=`N'+1
}
else {
	* add one for the look
	local tableN=`N'+1
}

file write `saving' `"<Table ss:ExpandedColumnCount="`r(k)'" ss:ExpandedRowCount="`tableN'""' `_n'
file write `saving' `" x:FullColumns="1" x:FullRows="1">"' `_n'

* should be tostring and format here if dealing with numbers
	
	ds8
	
	* write the variable names at the top or empty row
	if "`names'"~="nonames" {
		file write `saving' `"<Row>"' `_n'
		foreach var in  `dsVarlist' {
			if "`Version7'"~="" {
				file write `saving' `"<Cell ss:StyleID="s1"><Data ss:Type="String">`macval(var)'</Data></Cell>"' _n
			}
			else {
				file write `saving' `"<Cell ss:StyleID="s1"><Data ss:Type="String">`var'</Data></Cell>"' _n				
			}
		}
		file write `saving' `"</Row>"' `_n'
	}
	else {
		file write `saving' `"<Row>"' `_n'
		file write `saving' `"</Row>"' `_n'
	}


* title
local count `titleWide'
local total 1
while `count'~=0 {
	xmlstack, saving(`saving') dsVarlist(`dsVarlist') num(`total') n(`N') style(`" ss:StyleID="s1""') style1(`" ss:StyleID="s1""')
	local count=`count'-1
	local total=`total'+1
}

* top border
local count=`total'
forval num=`count'/`count' {
	xmlstack, saving(`saving') dsVarlist(`dsVarlist') num(`num') n(`N') style(`" ss:StyleID="s21""') style1(`" ss:StyleID="s31""')
	local total=`total'+1
}

* ctitle
local count=`total'
forval num=`count'/`headBorder' {
	xmlstack, saving(`saving') dsVarlist(`dsVarlist') num(`num') n(`N') style(`" ss:StyleID="s22""') style1(`" ss:StyleID="s32""')
	local total=`total'+1
}

* top border (closes ctitle)
local count=`total'
forval num=`count'/`count' {
	xmlstack, saving(`saving') dsVarlist(`dsVarlist') num(`num') n(`N') style(`" ss:StyleID="s21""') style1(`" ss:StyleID="s31""')
	local total=`total'+1
}

* body
local count=`total'
forval num=`count'/`=`bottomBorder'-1' {
	xmlstack, saving(`saving') dsVarlist(`dsVarlist') num(`num') n(`N') style(`" ss:StyleID="s22""') style1(`" ss:StyleID="s32""')
	local total=`total'+1
}

* bottom border (closes body)
local count=`total'
forval num=`count'/`count' {
	xmlstack, saving(`saving') dsVarlist(`dsVarlist') num(`num') n(`N') style(`" ss:StyleID="s23""') style1(`" ss:StyleID="s33""')
	local total=`total'+1
}

* goldfish
if `N'>`total' {
	local count=`total'
	forval num=`count'/`N' {
		xmlstack, saving(`saving') dsVarlist(`dsVarlist') num(`num') n(`N') style(`" ss:StyleID="s24""') style1(`" ss:StyleID="s24""') 
		local total=`total'+1
	}
}

/*
forval num=1/`N' {
	
	file write `saving' `"<Row>"' `_n'
	
	*foreach var in  `=r(varlist)' {
	foreach var in  `dsVarlist' {
		
		*local stuff `=`var'[`num']'
		local stuff=`var' in `num'
		
		local stuff : subinstr local stuff "<" "&lt;", all
		local stuff : subinstr local stuff ">" "&gt;", all
		
		* the main body
		if "`Version7'"~="" {
			file write `saving' `"<Cell`style'><Data ss:Type="String">`macval(stuff)'</Data></Cell>"' `_n'
		}
		else {
			file write `saving' `"<Cell`style'><Data ss:Type="String">`stuff'</Data></Cell>"' `_n'
		}
	}
	file write `saving' `"</Row>"' `_n'
}
*/

file write `saving' `"</Table>"' `_n'
file write `saving' `"<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">"' `_n'
file write `saving' `"<ProtectedObjects>False</ProtectedObjects>"' `_n'
file write `saving' `"<ProtectedScenarios>False</ProtectedScenarios>"' `_n'
file write `saving' `"</WorksheetOptions>"' `_n'
file write `saving' `"</Worksheet>"' `_n'
file write `saving' `"</Workbook>"' `_n'

* close out with the last line
*file write `saving' _n
*file close `source'

file close `saving'

end /* _xmlout */


********************************************************************************************


program define xmlstack

syntax, saving(string) dsVarlist(string) num(numlist) n(numlist) style(string) style1(string)

local N `n'

*forval num=1/`N' {
	
	file write `saving' `"<Row>"' `_n'
	
	local count 0
	
	*foreach var in  `=r(varlist)' {
	foreach var in  `dsVarlist' {
		
		if `count'==0 {
			local STYLE `"`style1'"'
		}
		else {
			local STYLE `"`style'"'
		}
		
		*local stuff `=`var'[`num']'
		local stuff=`var' in `num'
		
		local stuff : subinstr local stuff "<" "&lt;", all
		local stuff : subinstr local stuff ">" "&gt;", all
		
		* the main body
		if "`Version7'"~="" {
			file write `saving' `"<Cell`STYLE'><Data ss:Type="String">`macval(stuff)'</Data></Cell>"' `_n'
		}
		else {
			file write `saving' `"<Cell`STYLE'><Data ss:Type="String">`stuff'</Data></Cell>"' `_n'
		}
		
		local count=`count'+1
	}
	file write `saving' `"</Row>"' `_n'
*}

end /* xmlstack */


********************************************************************************************


program define dsCol
	* gets you the number of columns like cret does for version 8
	* alternatively use -describe, short- and r(k)
	
	version 7.0
	cap local ck `c(k)'
	
	if "`ck'"=="" {
		local ck 0
		foreach var of varlist _all {
			local ck=`ck'+1
		}
	}
	c_local ck `ck'
end


********************************************************************************************


program define ds8
	* get you the list of variable like -ds- does for version 8
	version 7.0
	qui ds
	if "`r(varlist)'"=="" {
		local dsVarlist ""
		foreach var of varlist _all {
			local dsVarlist "`dsVarlist' `var'"
		}
		c_local dsVarlist `dsVarlist'
	}
	else {
		c_local dsVarlist `r(varlist)'
	}
end


********************************************************************************************


program define _tab3, eclass
	* get you tabulations
	versionSet
	version `version'
	
syntax varlist 							/*
	*/ [if] [in] [using] [,					/*
	*/ APpend REPLACE esample drop(string) 		/*
	*/ DISplay log regress]
	
	
qui {

if "`drop'"~="" {
	ds `drop'
	local drop `r(varlist)'
	*cap local varlist: list varlist - drop
	macroMinus `varlist', names(varlist) subtract(`drop')
}

* checking the height
local varCount: word count `varlist'
if `=`varCount'*100'>=`=_N' {
	preserve
	set obs `=`varCount'*100+2'
}



if `=_by()'==1 {
	* eliminate -by- variables from varlist
	local drop `_byvars'
	*cap local varlist: list varlist - drop
	macroMinus `varlist', names(varlist) subtract(`drop')
}

*marksample touse
*marksample alluse, noby

tempvar touse alluse

mark `touse' `if' `in' [`weight'`exp']
mark `alluse'  `if' `in' [`weight'`exp'], noby

** restricting to e(sample)
if "`noesample'"=="noesample" {
	replace `touse'=0 if e(sample)~=1
	replace `alluse'=0 if e(sample)~=1
}

tempvar stacker name label frequency percent cumulative total
tempname val_mat freq_mat ebmat eVmat 

	
gen `stacker'=.
gen str5 `name'=""

gen `label'=.
gen `frequency'=.

gen `percent'=.
gen `cumulative'=.

gen `total'=.


local varname ""

noi tabulate `varlist' [`weight'`exp'] if `touse', matrow(`val_mat') matcell(`freq_mat')

if r(N)~=0 {
	noi tabulate `varlist' [`weight'`exp'] if `touse', matrow(`val_mat') matcell(`freq_mat')
	
	local stuff `r(r)'
	forval row=1/`stuff' {
		*replace `name' = "r`row'" in `row'
		
		local content = `val_mat'[`row',1]
		replace `label' =`content' in `row'
		
		replace `name' = string(`val_mat'[`row',1]) in `row'
		local varname "`varname' `content'"
		
		local content = `freq_mat'[`row',1]
		replace `frequency' =`content' in `row'
	}
	replace `total'=sum(`frequency')
	qui sum `varlist', meanonly
	replace `percent'=100*`frequency'/`r(N)'
	replace `cumulative'=sum(`percent') if `label'~=.
}



*mat list `val_mat'
*mat list `freq_mat'
	
	local colVarname ""
	foreach col in obs mean sd min max {
		foreach var in `varname' {
			local colVarname "`colVarname' `col':`var'"
		}
	}
	
	count if `name'~=""
	
	replace `stacker'=`label'
	forval num=1/`=r(N)' {
		replace `stacker'=`frequency'[`num'] in `=r(N)+`num''
		replace `stacker'=`percent'[`num'] in `=r(N)*2+`num''
		replace `stacker'=`cumulative'[`num'] in `=r(N)*3+`num''
	}
	
	if "`display'"=="display" {
	noi tabulate `varlist' [`weight'`exp'] if `touse'
}
if `=_by()'==1 {
	* generate column heading when -by- specified
	local cc=1
	local ctitleList ""
	
	tokenize `_byvars'
	while "``cc''"~="" {
		
		* should there be `touse' here?
		qui sum ``cc'' if `_byindex' == `=_byindex()' & `touse'
		if r(N)<. {
			local actual`cc' =r(mean)
		}
		else {
			local actual`cc' =.			
		}
		
		* place ctitle in there
		local ctitleList "`ctitleList' ``cc'' `actual`cc'' "
		local cc=`cc'+1
	}
	
	* replace last if -by- specified
	if `=_byindex()'~=1 & "`replace'"=="replace" {
		local replace ""
	}
}

count if `stacker'~=.

if r(N)>0 {
	* recycling name: they exist in variables and matrix
	
	if "`log'"=="log" {
		

		
		mkmat `stacker' in 1/`=r(N)', matrix(`ebmat')
		mkmat `empty' in 1/`=r(N)', matrix(`eVmat')
		
		mat rownames `ebmat'=`colVarname'
		mat rownames `eVmat'=`colVarname'
		
		mat colnames `ebmat'=y1
		mat colnames `eVmat'=y1
		
		mat `ebmat'=`ebmat''
		mat `eVmat'=(`eVmat'*`eVmat'')
	}
	else {
		count if `name'~=""
		
		* `=r(N)' gets wiped out in version 7
		local rN=r(N)
		
		mkmat `frequency' in 1/`rN', matrix(`ebmat')
		mkmat `percent' in 1/`rN', matrix(`eVmat')
		
		mat rownames `ebmat'=`varname'
		mat rownames `eVmat'=`varname'
		
		mat colnames `ebmat'=y1
		mat colnames `eVmat'=y1
		
		mat `ebmat'=`ebmat''
		mat `eVmat'=(`eVmat'*`eVmat'')
	}
	
	if "`replace'"=="replace" {
		if "`Version7'"=="" {
			est mat freq `ebmat'
			est mat percent `eVmat'
			
			count if `touse'==1
			est scalar total = `total'[_N]
		}
		else {
			eret clear
			*eret mat b=`ebmat'
			*eret mat V=`eVmat'
			
			eret post b V
			if `"`if'"'~="" {
				eret local depvar `"`if'"'
			}
			else {
				eret local depvar `"Tabulate"'
			}
			eret local cmd "tab3"
			
			count if `touse'==1
			eret scalar total = `total'[_N]
		}
	}
	else {
		if "`Version7'"=="" {
			est mat freq `ebmat'
			est mat percent `eVmat'
			
			count if `touse'==1
			est scalar total = `total'[_N]
		}
		else {
			eret mat freq=`ebmat'
			eret mat percent=`eVmat'
			
			count if `touse'==1
			eret scalar total = `total'[_N]
		}
	}
}
else {
	* no observation
	if "`Version7'"=="" {
		mat def `ebmat'=(0)
		mat def `eVmat'=(0)
		mat colnames `ebmat'="MISSING"
		mat colnames `eVmat'="MISSING"
		est mat freq `ebmat'
		est mat percent `eVmat'
		est scalar total=0
	}
	else {
		mat def `ebmat'=(0)
		mat def `eVmat'=(0)
		mat colnames `ebmat'="MISSING"
		mat colnames `eVmat'="MISSING"
		eret mat freq=`ebmat'
		eret mat percent=`eVmat'
		eret scalar total=0
	}
}
} /* qui */
noi di

end /* _tab3 */


********************************************************************************************


* Jan2009 by roywada@hotmail.com
prog define optionSyntax
	* cleans the options within parenthetical options of the form -option( )-
	* clean c_locals of those content names as if they were the options
	
	* valid: allowed contents in parenthesis
	* name: name of the option
	* content: actual user input into the option
	* passthru: if it was passtru rather than string
	* nameShow: mesaage to user when invalid
	
	syntax, valid(string) name(string) nameShow(string) content(string) [PASSthru NORETURN]
	
	* take comma out
	if "`passthru'"=="passthru" {
		local content : subinstr local content "`name'(" " ", all
		local content : subinstr local content ")" " ", all
		local content : subinstr local content "," " ", all
	}
	else {
		* just string
		local content : subinstr local content "," " ", all
	}
	
	local thisMany : word count `content'
	local num=1
	local optionList ""
	
	while `num'<=`thisMany' {
		local option`num' : word `num' of `content'
		
		* it must be one of the list
		local test 0
		foreach var in `valid' {
			if "`var'"=="`option`num''" & `test'==0 {
				local test 1
			}
		}
		
		if `test'==0 {
			noi di in white "`option`num''" in red " is not a valid option or matrix for {opt `nameShow'}"
			exit 198
		}
		local optionList "`optionList' `option`num''"
		local num=`num'+1
	}
	
	if "`noreturn'"~="noreturn" {
		foreach var in `valid' {
			* clears the c_locals
			c_local `var' ""
		}
		
		foreach var in `optionList' {
			* inserts the c_locals
			c_local `var' "`var'"
		}
	}
	
	c_local optionList `"`optionList'"'
	c_local optionCount : word count `optionList'

end


********************************************************************************************


* sum2 1.0.0 Jan2009 by roywada@hotmail.com
* sum2 1.0.1 21oct2009 : gets the entire varlist if no e(b) exists
*				raw option

program define _sum2, eclass
*program define sum2, eclass by(recall) sortpreserve
	versionSet
	version `version'

syntax [varlist] [using] [if] [in] [pweight aweight iweight] [,	/*
	*/ APpend REPLACE esample drop(string) 				/*
	*/ noDISplay log REGress DETail NODEPendent raw]


local _0 `"`0'"'


qui {


if "`log'"=="log" & "`detail'"=="detail" {
	noi di in red "cannot choose both {opt det:ail} and {opt log}"
	exit 198
}

if "`log'"~="log" & "`detail'"~="detail" {
	local regress "regress"
}


if "`regress'"=="regress" {
	* check for prior sum2, replace
	foreach var in eqlist {
		if "`e(cmd)'"=="sum2, log" {
			if "`Version7"~="" {
				*eret list
			}
			else {
				*est list
			}
			noi di in red "no regression detected; already replaced with summary"
			exit 198
		}
	}
	
	*** replace varlist with e(b) names
	regList `_0'
	
	local varlist `r(varlist)'
	local eqlist `r(eqlist)'
	
	local varnum `r(varnum)'
	local eqnum `r(eqnum)'
}
else {
	local varnum: word count `varlist'
	local eqnum 0

}

local varlist `"`eqlist' `varlist'"'

	
* take tempvars out
tsunab stuff : __00*

macroMinus `varlist', names(varlist) subtract(`stuff')
local varnum: word count `varlist'

* extender
local N=_N
version 7: describe, short
if `r(k)'>`N'+1 & `r(k)'<. {
	set obs `r(k)'
}


if "`drop'"~="" {
	ds `drop'
	local drop `r(varlist)'
	*cap local varlist: list varlist - drop
	macroMinus `varlist', names(varlist) subtract(`drop')
}



if `=_by()'==1 {
	* eliminate -by- variables from varlist
	local drop `_byvars'
	*cap local varlist: list varlist - drop
	macroMinus `varlist', names(varlist) subtract(`drop')
}


*marksample touse
*marksample alluse, noby
*tempvar touse alluse

tempvar touse
*mark `alluse'  `if' `in', noby

cap confirm matrix e(b)
if _rc | "`raw'"=="raw" {
	mark `touse' `if' `in' [`weight'`exp']
}
else {
	* always esample restricted
	if `"`if'"'~="" {
		mark `touse' `if' & e(sample) `in' [`weight'`exp']
	}
	else {
		mark `touse' if e(sample) `in' [`weight'`exp']
	}
}

count if `touse'==1
if `r(N)'==0 {
	noi di in red "no observation left; check your if/in conditionals"
	exit 198
}

*** must take out string variables prior to marking them
local stringList ""
local noobsList ""
local anyObs 0
foreach var in `varlist' {
	sum `var' if `touse' [`weight'`exp'], meanonly
	if r(N)==0 {
		local minus "`var'"
		*cap local varlist: list varlist - minus
		macroMinus `varlist', names(varlist) subtract(`minus')
		
		if "`Version7'"=="" {
			local varlist=subinstr("`varlist'","`minus'","",.)
		}
		
		local type: type `var'
		local check= substr("`type'",1,3)
		
		* display later
		if "`check'"=="str" {
			*noi di in yellow "`var' is string, not included"
			local stringList "`stringList' `var'"
		}
		else {
			*noi di in yellow "`var' has no observation, not included"
			local noobsList "`noobsList' `var'"
		}
	}
	else {
		local anyObs 1
	}
	local varnum: word count `varlist'
}

tempvar name N mean sd min max zeros
tempname ebmat eVmat 
tempvar sum_w Var skewness kurtosis sum p1 p5 p10 p25 p50 p75 p90 p95 p99

local varname ""

foreach var in `varlist' {
	qui sum `var' if `touse' [`weight'`exp'], `detail'
	if r(N)~=0 {
		local varname "`varname' `var'"
		local row=`row'+1
		
		foreach var in mean sd N min max {
			mat ``var'' = nullmat(``var'') \ r(`var')
		}
		mat `zeros' = nullmat(`zeros') \ 0
	}
	if "`detail'"=="detail" & r(N)~=0 {
		foreach var in sum_w Var skewness kurtosis sum p1 p5 p10 p25 p50 p75 p90 p95 p99 {
			mat ``var'' = nullmat(``var'') \ r(`var')
		}
	}
}

* rename them
if "`regress'"=="regress" {
	foreach var in mean sd N min max {
	mat rownames ``var''=`varname'
	mat colnames ``var''=`var'
	}
}
if "`log'"=="log" {
	foreach var in N mean sd min max {
		mat rownames ``var''=`varname'
		mat roweq ``var''=`var'
		mat colnames ``var''=`var'
	}
}
if "`detail'"=="detail" {
	foreach var in N mean sd min max sum_w Var skewness kurtosis sum p1 p5 p10 p25 p50 p75 p90 p95 p99 {
		mat rownames ``var''=`varname'
		mat roweq ``var''=`var'
		mat colnames ``var''=`var'
	}
}

if "`display'"~="nodisplay" & `anyObs'==1 {
	noi sum `varlist' if `touse' [`weight'`exp'], `detail'
}


if `=_by()'==1 {
	* generate column heading when -by- specified
	local cc=1
	local ctitleList ""
	
	tokenize `_byvars'
	while "``cc''"~="" {
		
		* should there be `touse' here?
		qui sum ``cc'' if `_byindex' == `=_byindex()' & `touse'
		if r(N)<. {
			local actual`cc' =r(mean)
		}
		else {
			local actual`cc' =.			
		}
		
		* place ctitle in there
		local ctitleList "`ctitleList' ``cc'' `actual`cc'' "
		local cc=`cc'+1
	}
	
	* replace last if -by- specified
	if `=_byindex()'~=1 & "`replace'"=="replace" {
		local replace ""
	}
}

	* exporting temp matrices	
	if "`regress'"=="regress" {
		mat `ebmat' = `mean'
		mat `eVmat' = `sd'
		
		mat `ebmat'=`ebmat''
		mat `eVmat'=(`eVmat'*`eVmat'')
	}
	else if "`log'"=="log" {
		foreach var in N mean sd min max {
			mat `ebmat' = nullmat(`ebmat') \ ``var'' 
			mat `eVmat' = nullmat(`eVmat') \ `zeros'
		}
		
		* rename eVmat after ebmat
		local colnames: colnames `ebmat'
		local roweq: roweq `ebmat'
		local rownames: rownames `ebmat'
		
		mat colnames `eVmat'=`colnames'		
		mat roweq `eVmat'=`roweq'
		mat rownames `eVmat'=`rownames'
		
		mat `ebmat'=`ebmat''
		mat `eVmat'=(`eVmat'*`eVmat'')
	}
	else if "`detail'"=="detail" {
		foreach var in N mean sd min max sum_w Var skewness kurtosis sum p1 p5 p10 p25 p50 p75 p90 p95 p99 {
			mat `ebmat' = nullmat(`ebmat') \ ``var''
			mat `eVmat' = nullmat(`eVmat') \ `zeros'
		}
		
		* rename eVmat after ebmat
		local colnames: colnames `ebmat'
		local roweq: roweq `ebmat'
		local rownames: rownames `ebmat'
		
		mat colnames `eVmat'=`colnames'		
		mat roweq `eVmat'=`roweq'
		mat rownames `eVmat'=`rownames'
		
		mat `ebmat'=`ebmat''
		mat `eVmat'=(`eVmat'*`eVmat'')
	}
	
	if "`replace'"=="replace" {
		if "`Version7'"=="" {
			est mat mean `ebmat'
			est mat Var `eVmat'
			
			count if `touse'==1
			est scalar N = r(N)
		}
		else {
			eret clear
			mat b=`ebmat'
			mat V=`eVmat'
			mat list b
			eret post b V
			if `"`if'"'~="" {
				gettoken first second: if, parse(" ")
				eret local depvar `"`second'"'
			}
			else {
				eret local depvar `"Summary"'
			}
			eret local cmd "sum2, log"
			
			if "`regress'"=="regress" {
				count if `touse'==1
				eret scalar N = r(N)
			}
		}
	}
	else {
		if "`Version7'"=="" {
			est mat mean `ebmat'
			est mat Var `eVmat'
			
			if "`regress'"=="regress" {
				count if `touse'==1
				est scalar sum_N = r(N)
			}
		}
		else {
			eret mat mean=`ebmat'
			eret mat Var=`eVmat'
			
			if "`regress'"=="regress" {
				count if `touse'==1
				eret scalar sum_N = r(N)
			}
		}
	}

/*
else {
	if `=_by()'==1 {
		noi di in yellow "no observations when variable = something"
	}
	else {
		* `=_by()'~=1, not running by( )
		*noi di in red "no observations"
		error 2000
	}
}
*/

noi di
if `"`stringList'"'~="" {
	noi di in yellow "Following variable is string, not included:  "
	foreach var in `stringList' {
		noi di in yellow "`var'  " _c
	}
	di
}
if `"`noobsList'"'~="" {
	noi di in yellow "Following variable has no observation, not included:  "
	foreach var in `noobsList' {
		noi di in yellow "`var'  " _c
	}
	di
}

} /* qui */
end /* sum2 */


********************************************************************************************


* regList Jan2009 by roywada@hotmail.com
* regList Jun2009 by roywada@hotmail.com verion 7 added

program define regList, rclass
* get the name of equations and variables used in e(b)
	versionSet
	version `version'
	
	* [if] [in] ignored:
	syntax [varlist(default=none)] [if] [in] [, NODEPendent *]
	
	* separate potential equation names from variable names
	tempname b b_transpose
	mat `b'=e(b)
	mat `b_transpose' = `b''
	local varnames : rownames(`b_transpose')
	
if "`nodependent'"~="nodependent" {
	* indep variables, but the equations names are actually dep variables
	* plus the dep var
	local eqlist "`e(depvar)' `eqlist'"
	macroUnique `eqlist', names(eqlist) number(eqnum)
	
/* not reliable because not always a dependent variable, i.e. sqreg slaps on q10, q20, etc.
	* take off numbers from the front (reg3 sometimes slaps them on)
	foreach v in `eqlist' {
		local first = substr(`"`v'"',1,1)
		local test
		cap local test = `first' * 1
		if "`test'"=="`first'" {
			* a number
			local wanted = substr(`"`v'"',2,.)
			local collect "`collect' `wanted'"
		}
		else {
			local collect "`collect' `v'"
		}
	}
	local eqlist `collect'
	macroUnique `eqlist', names(eqlist) number(eqnum)
	
	* repeat
	foreach v in `eqlist' {
		local first = substr(`"`v'"',1,1)
		local test
		cap local test = `first' * 1
		if "`test'"=="`first'" {
			* a number
			local wanted = substr(`"`v'"',2,.)
			local collect "`collect' `wanted'"
		}
		else {
			local collect "`collect' `v'"
		}
	}
	local eqlist `collect'
*/
	
	macroUnique `eqlist', names(eqlist) number(eqnum)
}
	macroUnique `eqlist', names(eqlist) number(eqnum)
	macroMinus `varnames', names(varlist) number(varnum) subtract(_cons)
	macroUnique `varlist', names(varlist) number(varnum)
	
	return local eqlist `eqlist'
	return local eqnum `eqnum'
	return local varlist `varlist'
	return local varnum `varnum'
	
end /* regList */


********************************************************************************************


* macroUnique Jan2009 by roywada@hotmail.com
* macroUnique Jun2009 by roywada@hotmail.com version 7 added
program define macroUnique

* gets you unique macro names & number of them (both c_locals)
* could be empty

version 7.0

syntax [anything], names(string) [number(string)]
	local collect ""
	* just holding the place until the loop
	local temp1: word 1 of `anything' 
	local temp2: word 2 of `anything'
	
	local total: word count `anything'
	local cc 1
	local same ""
	while "`temp1'"~="" {
		local temp1: word `cc' of `anything'
		local same ""
		*di "try `temp1' at `cc'"
		local kk=`cc'+1
		local temp2: word `kk' of `anything'
		while "`temp2'"~="" & "`same'"=="" {
			if "`temp1'"=="`temp2'" {
 				*di "`cc' is same as `kk'"
				local same same
			}
			else {
				local kk=`kk'+1
			}
			local temp2: word `kk' of `anything'
		}
		if "`temp1'"~="" & "`temp2'"=="" & "`same'"~="same" {
			*di "accept `temp1' at `cc' before " _c
			local collect "`collect' `temp1'"
		}
		*di "reject `temp1' at `cc'"
		local cc=`cc'+1
	}
	
	c_local `names' `collect'
	if "`number'"~="" {
		c_local `number' : word count `collect'
	}
end


********************************************************************************************


* macroMinus Jan2009 by roywada@hotmail.com
* macroMinus Jun2009 by roywada@hotmail.com version 7 added
program define macroMinus

version 7.0

* gets you macro names subtracted & number of them (both c_locals)
* could be empty

syntax [anything], names(string) [number(string asis) subtract(string)]
	local collect ""
	* just holding until the loop
	local temp1: word 1 of `anything' 
	local temp2: word 1 of `subtract'
	
	local total: word count `anything'
	local cc 1
	local same ""
	while "`temp1'"~="" {
		local temp1: word `cc' of `anything'
		local same ""
		*di "try `temp1' at `cc'"
		local kk=1
		local temp2: word `kk' of `subtract'
		while "`temp2'"~="" & "`same'"=="" {
			if "`temp1'"=="`temp2'" {
 				*di "`temp1' is same as `temp2'"
				local same same
			}
			else {
				local kk=`kk'+1
			}
			local temp2: word `kk' of `subtract'
		}
		if "`temp1'"~="" & "`temp2'"=="" & "`same'"~="same" {
			*di "accept `temp1' at `cc' before " _c
			local collect "`collect' `temp1'"
		}
		*di "reject `temp1' at `cc'"
		local cc=`cc'+1
	}
	
	c_local `names' `collect'
	if "`number'"~="" {
		c_local `number' : word count `collect'
	}

end


********************************************************************************************


* Jun2009 version 7 added

program define cleanFile
* split possible eqnames from varnames
* gets labels
* get titles
* c_locals titleWide headRow bottomRow

	versionSet
	version `version'

syntax using [, noQUOte comma title(string) label labelOption(string) /*
	*/ titlefile(string) NOTITLE slow(numlist)]
		
		
		*** get the label names
		if "`label'"=="label" | "`labelOption'"=="insert" {
			tempfile labelfile
			
			* extender making sure the obs > columns
			local N=_N
			describe, short
			if `r(k)'>`N'+1 & `r(k)'<. {
				set obs `r(k)'
			}
			
			gen str8 var1=""
			gen str8 labels=""
			unab varlist_all : *
			cap unab subtract: _est_*
			*cap local varlist_only : list varlist_all - subtract
			macroMinus `varlist_all', names(varlist_only) subtract(`subtract')
			local count=1
			foreach var in `varlist_only' {
				local lab ""
				cap local lab: var label `var'
				local lab=trim("`lab'")
				if "`lab'"~="" {
					replace var1="`var'" in `count'
					replace labels="`lab'" in `count'
					local count=`count'+1
				}
			}
			keep var1 labels
			
			drop if var1==""
			
			* indicate no label contained
			local N=_N
			if `N'==0 {
				local emptyLabel=1
			}
			else {
				local emptyLabel=0
			}
			
			* add constant
			local newN=_N+1
			set obs `newN'
			
			local N=_N
			replace labels="Constant" in `N'
			replace var1="Constant" in `N'
			
			save `"`labelfile'"'
		}
		
		
		
		*** clean up equation names, title, label
		sleep `slow'	/* wait 1000 ms = 1 second before trying again */
		insheet `using', nonames clear
		tempvar id1 id2 id3 id4
		
		
		*** bottom row (the bottom border), count up
		gen rowmiss=0
		foreach var of varlist v* {
			replace rowmiss=rowmiss+1 if `var'~=""
		}
		local N=_N
		local content 1
		local num 0
		while `content'==1 & `num'<`N' {
			local content rowmiss[`=`N'-`num'']
			local num=`num'+1
		}
		* add titleWide and eqAdded later to get bottomBorder
		local bottomRow = `N'-`num'+1
		
		
		*** head row (the head border), count down
		local content
		local num 1
		local N=_N
		while `"`content'"'=="" & `num'<=`N' {
			local content=v1[`num']
			local num=`num'+1
		}
		* add titleWide later to get headBorder
		local headRow=`num'-1
		drop rowmiss
		
		
		gen id1=_n
		gen str8 equation=""
		gen str8 variable=""
		
		* find the top & bottom empty row
		gen rowmiss=0
		foreach var of varlist v* {
			replace rowmiss=rowmiss+1 if `var'~=""
		}
		
		
		* take care if colon (:) that may appears in the notes by limiting the search to the above
		local N=_N
		local stuff=rowmiss[`N']
		local cc 0
		while `stuff'~=0 {
			local stuff=rowmiss[`N'-`cc']
			local cc=`cc'+1
		}
		
		********** this should be made faster in version 10
		forval num=1/`=`N'-`cc'' {
			local name=trim(v1[`num'])
			local column=index("`name'",":")
			if `column'~=0 {
				local equation=trim(substr("`name'",1,`column'-1))
				local variable=trim(substr("`name'",`column'+1,length("`name'")))
				replace equation="`equation'" in `num'
				replace variable="`variable'" in `num'
			}
		}
				
		replace equation=equation[_n-1] if equation=="" & equation[_n-1]~="" & rowmiss~=0
		*replace equation=equation[_n-1] if equation=="" & equation[_n-1]~="" & v1~="Observations"
		
		* needs a workaround for blank inserted by user
		gen str8 temp=""
		replace temp=equation
		replace temp=temp[_n-1] if temp[_n-1]~="" & temp[_n-1]~="." & temp==""
		gen str8 top="1" if temp[_n]~=temp[_n-1] & temp[_n]~=""
		drop temp
		
		
		* now only the top empty row
		replace rowmiss=0 if rowmiss[_n-1]==0
		
		count if equation~=""
		if `r(N)'~=0 {
			* move equation names, instead of inserting them
			count if v1=="EQUATION"
			if `r(N)'==0 {
				gen str8 v0=""
				replace v0=equation
				replace v0="EQUATION" in `headRow'
				order v0
				replace v1=variable if variable~=""
			}
			else {
				replace v1=equation
				replace v1="EQUATION" in `headRow'
			}
		}
		drop rowmiss
		
		* strips the redundant equation names
		* must be undone at the insheet that recall this file in appendFile
		
		count if equation~=""
		if `r(N)'~=0 {
			*** for one column option
			replace v0="" if top=="" & v0~="EQUATION"
		}
		
		drop id1 equation variable        top
		sleep `slow'	/* wait 1000 ms = 1 second before trying again */
		outsheet `using', nonames `quote' `comma' replace
		
		
		
		*** clean up labels
		if "`label'"=="label" | "`labelOption'"=="insert" {
			/*
			local dotloc = index("`bname'", ".") 
			if `dotloc'!=0 {
				/* deal w/time series prefixes */
				local tspref = substr("`bname'",1,`dotloc')
				local bname = substr("`bname'",`dotloc'+1,.)
				local blabel : var label `bname'
				local blabel = `"`tspref' `blabel'"'
			}
			else {
				local blabel : var label `bname'
			}
			*/
			
			ren v1 var1
			gen `id2'=_n
			
			* skip merging process if no label was contained
			if `emptyLabel'==1 {
				gen str8 labels=""
			}
			else {
				joinby var1 using `"`labelfile'"', unmatched(master)
				drop _merge
			}
			
			sort `id2'
			drop `id2'
			order var1 labels
			cap order v0 var1 labels
			
			replace labels="LABELS" in `headRow'
			ren var1 v1
		}
		
		
		
		*** (re)attaches titles
	if "`notitle'"=="" {
		if `"`title'"'=="" {
			* NOTE: v0- saved here
			tempfile appending
			tempvar tomato potato
			gen `tomato' =_n+10000
			save `"`appending'"',replace
			
			*** Clean up titles
			* just coef, no label, no equation
			cap confirm file `titlefile'
			if !_rc {
				use `titlefile',clear
				
				*gen `id3'=1 if v1=="VARIABLES"
				*gen `id3'=1 if v1==`"`VARIABLES1'"'
				* find the top empty row
				gen rowmiss=0
				foreach var of varlist v* {
					replace rowmiss=rowmiss+1 if `var'~=""
				}
				replace rowmiss=0 if rowmiss[_n-1]==0
				
				gen `id3'=1 if rowmiss[_n+1]==0
				replace `id3'=1 if `id3'[_n-1]==1
				
				drop rowmiss
				drop if `id3'==1
				keep if v1~=""
				
				local N=_N
				if `N'~=0 {
					keep v1
					gen `potato'=_n
					local titleWide=_N
					joinby v1 using `"`appending'"', unmatched(both)
					sort `potato' `tomato'
					drop _merge `potato' `tomato'
					aorder
				}
				else {
					use `"`appending'"',replace
					drop `tomato'
				}
			}
			cap drop `tomato'
			
			* reorder again
			cap order v1 labels
			cap order v0 v1 labels
		}
		else {
			* parse title
			partxtl2 `"`title'"'
			local titleWide = `r(numtxt)'
			local t = 1
			while `t'<=`titleWide' {
				local titl`t' `r(txt`t')'
				local t = `t'+1
			}
			
			local oldN=_N
			set obs `=`r(numtxt)'+_N'
			gen `id4'=_n+10000
			forval num=1/`r(numtxt)' {
				replace v1="`r(txt`num')'" in `=`oldN'+`num''
				replace `id4'=`num' in `=`oldN'+`num''
			}
			sort `id4'
			drop `id4'
		}
		
		if "`titleWide'"=="" {
			local titleWide=0
		}
	}
		
		* problem spot
		sleep `slow'	/* wait 1000 ms = 1 second before trying again */
		outsheet `using', nonames `quote' `comma' replace
		
		c_local bottomRow `bottomRow'
		c_local headRow `headRow'
		c_local titleWide `titleWide'
		
end /* cleanFile */


********************************************************************************************


* chewfile version 1.0.1 17Aug2009 by roywada@hotmail.com
* borrowed on 17Aug2009
program define _chewfile
version 8.0

syntax using/, [save(string) begin(numlist max=1) end(string) clear parse(string) replace semiclear]

if `"`parse'"'=="" {
	local parse `"`=char(9)'"'
}

if "`begin'"=="" {
	local begin 1
}

if "`end'"=="" {
	local end .
}

if "`clear'"=="" & `"`save'"'=="" {
	if "`semiclear'"=="" {
		noi di in red "must specify {opt clear} or {opt save( )}
		exit 198
	}
}

if "`semiclear'"=="semiclear" {
	qui drop *
	qui set obs 0
}
else if "`clear'"=="clear" {
	clear
	qui set obs 0
}

if `"`save'"'=="" {
	tempfile dump
	local save `dump'
}

tempname fh outout
local linenum = 0
file open `fh' using `"`using'"', read

qui file open `outout' using `"`save'"', write `replace'

file read `fh' line

while r(eof)==0 {
	local linenum = `linenum' + 1
	local addedRow 0
	if `linenum'>=`begin' & `linenum'<=`end' {
		if `addedRow'==0 {
			qui set obs `=`=_N'+1'
		}
		
		*display %4.0f `linenum' _asis `"`macval(line)'"'
		file write `outout' `"`macval(line)'"' _n
		
		if "`clear'"=="clear" | "`semiclear'"=="semiclear" {
			tokenize `"`macval(line)'"', parse(`"`parse'"')
			local num 1
			local colnum 1
			while "``num''"~="" {
				local needOneMore 0
				if `"``num''"'~=`"`parse'"' {
					cap gen str3 var`colnum'=""
					cap replace var`colnum'="``num''" in `linenum'
					if _rc~=0 {
						qui set obs `=`=_N'+1'
						cap replace var`colnum'="``num''" in `linenum'
						local addedRow 1
					}
					*local colnum=`colnum'+1
				}
				else {
					cap gen str3 var`colnum'=""
					local colnum=`colnum'+1
				}
				local num=`num'+1
			}
		}
	}
	file read `fh' line
}

file close `fh'
file close `outout'
end


********************************************************************************************


* cdout 1.0.1 Apr2009 by roywada@hotmail.com
* opens the current directory for your viewing pleasure

* the following disabled 14oct2009: cap winexec cmd /c start .
* modified on 21oct2009:
*	displays "dir" instead of cdout or the folder location
*	cont option

program define _cdout
cap version 7.0

syntax, [cont]

if "`cont'"=="cont" {
	local _c "_c"
}


*cap winexec cmd /c start .
*cap !start cmd /c start .

if _rc~=0 {
        * version 6 or earlier
        di `"{stata `"cdout"':dir}"' `_c'
}
else {
        * invisible to Stata 7
        local Version7
        local Version7 `c(stata_version)'
        
        if "`Version7'"=="" {
                * it is version 7 or earlier
                di `"{stata `"cdout"':dir}"' `_c'
        }
        else if `Version7'>=8.0 {
                version 8.0
                di `"{browse `"`c(pwd)'"' :dir}"' `_c'
        }
}

if "`cont'"=="cont" {
	di in white `" : "' _c
}

end


********************************************************************************************

* oct2009
* parse tex( ) options
prog define _texout_parse
	version 7
	syntax, [FRagment NOPRetty PRetty Landscape]
	c_local texopts "`fragment' `nopretty' `pretty' `landscape'"
end



********************************************************************************************


* oct2009
* parse stats( ) options
prog define _stats_check
	
	* note: it will not prevent illegal options from entering (dumped into * `options') & allows multiple entry to be handled
	* note: must be all lower case
	
	version 7
	
	syntax, [coef se tstat pval ci aster blank beta ci_low ci_high /*
		*/ n sum_w mean var sd SKEWness KURTosis sum min max p1 p5 p10 p25 p50 p75 p90 p95 p99 corr pwcorr spearman *]
	
	c_local sumAsked ""
	if `"`n'`sum_w'`mean'`var'`sd'`min'`max'`sum'"'~="" {
		c_local sumAsked regular
	}
	if `"`skewness'`kurtosis'`p1'`p5'`p10'`p25'`p50'`p75'`p90'`p95'`p99'"'~="" {
		c_local sumAsked detail
	}
	
	
	foreach var in corr pwcorr spearman {
		c_local `var'Asked ""
		if `"``var''"'~="" {
			c_local `var'Asked `var'
		}
	}
	
end


********************************************************************************************


* oct2009
* parse cmd( ), str( ), and r( ) from the contents of stats( ) option
prog define _stats_parse
	
	version 7
	
	syntax, [cmd(str asis) str(str asis) r(str asis)]
	
end


********************************************************************************************


* 03nov2009
prog define versionSet
	* sends back the version as c_local
	version 7.0
	
	* invisible to Stata 7
	cap local Version7 `c(stata_version)'
	c_local Version7 `Version7'
	
	if "`Version7'"=="" {
		* it is version 7
		c_local version 7
	}
	else if `Version7'>=8.2 {
		version 8.2
		c_local version 8.2
	}
	
	if "`Version7'"=="" {
		c_local bind ""
	}
	else {
		c_local bind "bind"
	}

end


********************************************************************************************


* 15nov2009
prog define eretSet, eclass
	versionSet
	version `version'
	
	syntax varlist
	cap reg `varlist'
	if _rc==0 {
		marksample touse
		tempname ebmat eVmat
		
		mat `ebmat'=e(b)
		mat `eVmat'=e(V)
		
		gettoken depvar rest: varlist
		
		if "`Version7'"=="" {
			est mat b `ebmat'
			est mat V `eVmat'
			
			count if `touse'==1
			est scalar N = r(N)
		}
		else {
			tempvar sample
			local N=e(N)
			local depvar=e(depvar)
			gen `sample'=e(sample)
			eret clear
			eret post `ebmat' `eVmat', e(`sample')
			eret local depvar `"`depvar'"'
			eret scalar N = `N'
		}
	}
end

exit

************* e(b) and e(V) in eretSet disabled
`tfmt typo corrected