*! version 1.3.2, Ben Jann, 29may2007
*! wrapper for estout

program define esttab, rclass
	version 8.2

// mode specific defaults
	local cdate "`c(current_date)'"
	local ctime "`c(current_time)'"
// - fixed
	local fixed_open0         `""% `cdate' `ctime'""'
	local fixed_close0        `""""'
	local fixed_open          `""'
	local fixed_close         `""'
	local fixed_caption       `"@title"'
	local fixed_open2         `""'
	local fixed_close2        `""'
	local fixed_toprule       `"@hline"'
	local fixed_midrule       `"@hline"'
	local fixed_bottomrule    `"@hline"'
	local fixed_topgap        `""""'
	local fixed_midgap        `""""'
	local fixed_bottomgap     `""""'
	local fixed_eqrule        `"begin(@hline "")"'
	local fixed_ssl           `"N R-sq "adj. R-sq" "pseudo R-sq" AIC BIC"'
	local fixed_lsl           `"Observations R-squared "Adjusted R-squared" "Pseudo R-squared" AIC BIC"'
	local fixed_starlevels    `"* 0.05 ** 0.01 *** 0.001"'
	local fixed_starlevlab    `""'
	local fixed_begin         `""'
	local fixed_delimiter     `"" ""'
	local fixed_end           `""'
	local fixed_varwidth      `"\`= cond("\`label'"=="", 12, 20)'"'
	local fixed_modelwidth    `"12"'
	local fixed_abbrev        `"abbrev"'
	local fixed_substitute    `""'
	local fixed_tstatlab      `"t statistics"'
	local fixed_pvallab       `"p-values"'
	local fixed_cilab         `"\`level'% confidence intervals"'
// - smcl
	local smcl_open0          `"{smcl} "{* % `cdate' `ctime'}{...}""'
	local smcl_close0         `""""'
	local smcl_open           `""'
	local smcl_close          `""'
	local smcl_caption        `"@title"'
	local smcl_open2          `""'
	local smcl_close2         `""'
	local smcl_toprule        `""{hline @width}""'
	local smcl_midrule        `""{hline @width}""'
	local smcl_bottomrule     `""{hline @width}""'
	local smcl_topgap         `""""'
	local smcl_midgap         `""""'
	local smcl_bottomgap      `""""'
	local smcl_eqrule         `"begin("{hline @width}" "")"'
	local smcl_ssl            `"`macval(fixed_ssl)'"'
	local smcl_lsl            `"`macval(fixed_lsl)'"'
	local smcl_starlevels     `"`macval(fixed_starlevels)'"'
	local smcl_starlevlab     `""'
	local smcl_begin          `""'
	local smcl_delimiter      `"" ""'
	local smcl_end            `""'
	local smcl_varwidth       `"`macval(fixed_varwidth)'"'
	local smcl_modelwidth     `"`macval(fixed_modelwidth)'"'
	local smcl_abbrev         `"`macval(fixed_abbrev)'"'
	local smcl_substitute     `""'
	local smcl_tstatlab       `"`macval(fixed_tstatlab)'"'
	local smcl_pvallab        `"`macval(fixed_pvallab)'"'
	local smcl_cilab          `"`macval(fixed_cilab)'"'
// - tab
	local tab_open0           `"`macval(fixed_open0)'"'
	local tab_close0          `""""'
	local tab_open            `""'
	local tab_close           `""'
	local tab_caption         `"@title"'
	local tab_open2           `""'
	local tab_close2          `""'
	local tab_topgap          `""""'
	local tab_midgap          `""""'
	local tab_bottomgap       `""""'
	local tab_ssl             `"`macval(fixed_ssl)'"'
	local tab_lsl             `"`macval(fixed_lsl)'"'
	local tab_starlevels      `"`macval(fixed_starlevels)'"'
	local tab_starlevlab      `""'
	local tab_begin           `""'
	local tab_delimiter       `"_tab"'
	local tab_end             `""'
	local tab_varwidth        `""'
	local tab_modelwidth      `""'
	local tab_abbrev          `""'
	local tab_substitute      `""'
	local tab_tstatlab        `"`macval(fixed_tstatlab)'"'
	local tab_pvallab         `"`macval(fixed_pvallab)'"'
	local tab_cilab           `"`macval(fixed_cilab)'"'
// - csv
	local csv_open0           `"`"\`csvlhs'% `cdate' `ctime'""'"'
	local csv_close0          `""""'
	local csv_open            `""'
	local csv_close           `""'
	local csv_caption         `"`"\`csvlhs'@title""'"'
	local csv_open2           `""'
	local csv_close2          `""'
	local csv_topgap          `""""'
	local csv_midgap          `""""'
	local csv_bottomgap       `""""'
	local csv_ssl             `"`macval(fixed_ssl)'"'
	local csv_lsl             `"`macval(fixed_lsl)'"'
	local csv_starlevels      `"`macval(fixed_starlevels)'"'
	local csv_starlevlab      `""'
	local csv_begin           `"`"\`csvlhs'"'"'
	local csv_delimiter       `"`"",\`csvlhs'"'"'
	local scsv_delimiter      `"`"";\`csvlhs'"'"'
	local csv_end             `"`"""'"'
	local csv_varwidth        `""'
	local csv_modelwidth      `""'
	local csv_abbrev          `""'
	local csv_substitute      `""'
	local csv_tstatlab        `"`macval(fixed_tstatlab)'"'
	local csv_pvallab         `"`macval(fixed_pvallab)'"'
	local csv_cilab           `"`macval(fixed_cilab)'"'
// - rtf
	local rtf_open0           `""'
	local rtf_close0          `""'
	  local rtf_ct            `"\yr`=year(d(`cdate'))'\mo`=month(d(`cdate'))'\dy`=day(d(`cdate'))'\hr`=substr("`ctime'",1,2)'\min`=substr("`ctime'",4,2)'"'
	  local rtf_open_l1       `"`"{\rtf1`=cond("`c(os)'"=="MacOSX", "\mac", "\ansi")'\deff0 {\fonttbl{\f0\fnil Times New Roman;}}"'"'
	  local rtf_open_l2       `" `"{\info {\author .}{\company .}{\title .}{\creatim`rtf_ct'}}"'"'
	  local rtf_open_l3       `" `"\deflang1033\plain\fs24"'"'
	  local rtf_open_l4       `" `"{\footer\pard\qc\plain\f0\fs24\chpgn\par}"'"'
	local rtf_open            `"`rtf_open_l1'`rtf_open_l2'`rtf_open_l3'`rtf_open_l4'"'
	local rtf_close           `""{\pard \par}" "}""'
	local rtf_caption         `"`"{\pard\keepn\ql @title\par}"'"'
	local rtf_open2           `"{"'
	local rtf_close2          `"}"'
	local rtf_toprule         `""'
	local rtf_midrule         `""'
	local rtf_bottomrule      `""'
	local rtf_topgap          `""'
	local rtf_midgap          `"{\trowd\trgaph108\trleft-108@rtfemptyrow\row}"'
	local rtf_bottomgap       `""'
	local rtf_eqrule          `"begin("{\trowd\trgaph108\trleft-108@rtfrowdefbrdrt\pard\intbl\ql {") replace"'
	local rtf_ssl             `""{\i N}" "{\i R}{\super 2}" "adj. {\i R}{\super 2}" "pseudo {\i R}{\super 2}" "{\i AIC}" "{\i BIC}""'
	local rtf_lsl             `"Observations "{\i R}{\super 2}" "Adjusted {\i R}{\super 2}" "Pseudo {\i R}{\super 2}" "{\i AIC}" "{\i BIC}""'
	local rtf_starlevels      `""{\super *}" 0.05 "{\super **}" 0.01 "{\super ***}" 0.001"'
	local rtf_starlevlab      `", label(" {\i p} < ")"'
	  local rtf_rowdef        `"\`=cond("\`lines'"=="", "@rtfrowdef", "@rtfrowdefbrdr")'"'
	local rtf_begin           `"{\trowd\trgaph108\trleft-108\`rtf_rowdef'\pard\intbl\ql {"'
	local rtf_delimiter       `"}\cell \pard\intbl\q\`=cond(`"\`alignment'"'!="", `"\`alignment'"', "c")' {"'
	local rtf_end             `"}\cell\row}"'
	local rtf_varwidth        `"\`= cond("\`label'"=="", 12, 20)'"'
	local rtf_modelwidth      `"12"'
	local rtf_abbrev          `""'
	local rtf_substitute      `""'
	local rtf_tstatlab        `"{\i t} statistics"'
	local rtf_pvallab         `"{\i p}-values"'
	local rtf_cilab           `"\`level'% confidence intervals"'
// - html
	local html_open0          `"<html> <head> "<title>`=cond(`"\`macval(title)'"'=="","estimates table, created `cdate' `ctime'","@title")'</title>" </head> <body> """'
	local html_close0         `""" </body> </html> """'
	local html_open           `"`"<table border="0" width="\`=cond("\`width'"=="","*","\`width'")'">"'"'
	local html_close          `"</table>"'
	local html_caption        `"<caption>@title</caption>"'
	local html_open2          `""'
	local html_close2         `""'
	local html_toprule        `""<tr><td colspan=@span><hr></td></tr>""'
	local html_midrule        `""<tr><td colspan=@span><hr></td></tr>""'
	local html_bottomrule     `""<tr><td colspan=@span><hr></td></tr>""'
	local html_topgap         `""'
	local html_midgap         `""<tr><td colspan=@span>&nbsp;</td></tr>""'
	local html_bottomgap      `""'
	local html_eqrule         `"begin("<tr><td colspan=@span><hr></td></tr>" "")"'
	local html_ssl            `"<i>N</i> <i>R</i><sup>2</sup> "adj. <i>R</i><sup>2</sup>" "pseudo <i>R</i><sup>2</sup>" <i>AIC</i> <i>BIC</i>"'
	local html_lsl            `"Observations <i>R</i><sup>2</sup> "Adjusted <i>R</i><sup>2</sup>" "Pseudo <i>R</i><sup>2</sup>" <i>AIC</i> <i>BIC</i>"'
	local html_starlevels     `"<sup>*</sup> 0.05 <sup>**</sup> 0.01 <sup>***</sup> 0.001"'
	local html_starlevlab     `", label(" <i>p</i> < ")"'
	local html_begin          `"<tr><td>"'
	local html_delimiter      `"</td><td\`=cond(`"\`alignment'"'!="", `" align="\`alignment'""', "")'>"'
	local html_end            `"</td></tr>"'
	local html_varwidth       `"\`= cond("\`label'"=="", 12, 20)'"'
	local html_modelwidth     `"12"'
	local html_abbrev         `""'
	local html_substitute     `""'
	local html_tstatlab       `"<i>t</i> statistics"'
	local html_pvallab        `"<i>p</i>-values"'
	local html_cilab          `"\`level'% confidence intervals"'
// - tex
	local tex_open0           `""% `cdate' `ctime'" \documentclass{article} \`texpkgs' \begin{document} """'
	local tex_close0          `""" \end{document} """'
	local tex_open            `"\begin{table}[htbp]\centering"'
	local tex_close           `"\end{table}"'
	local tex_caption         `"\caption{@title}"'
	local tex_open2           `"\`=cond("\`width'"=="", "\begin{tabular}", `"\begin{tabular*}{\`width'}"')'"'
	local tex_close2          `"\`=cond("\`width'"=="", "\end{tabular}", `"\end{tabular*}"')'"'
	local tex_toprule         `"\hline\hline"'
	local tex_midrule         `"\hline"'
	local tex_bottomrule      `"\hline\hline"'
	local tex_topgap          `""'
	local tex_midgap          `"[1em]"' // `"\\\"'
	local tex_bottomgap       `""'
	local tex_eqrule          `"begin("\hline" "")"'
	local tex_ssl             `"\(N\) \(R^{2}\) "adj. \(R^{2}\)" "pseudo \(R^{2}\)" \textit{AIC} \textit{BIC}"'
	local tex_lsl             `"Observations \(R^{2}\) "Adjusted \(R^{2}\)" "Pseudo \(R^{2}\)" \textit{AIC} \textit{BIC}"'
	local tex_starlevels      `"\sym{*} 0.05 \sym{**} 0.01 \sym{***} 0.001"'
	local tex_starlevlab      `", label(" \(p<@\)")"'
	local tex_begin           `""'
	local tex_delimiter       `"&"'
	local tex_end             `"\\\"'
	local tex_varwidth        `"\`= cond("\`label'"=="", 12, 20)'"'
	local tex_modelwidth      `"12"'
	local tex_abbrev          `""'
	local tex_tstatlab        `"\textit{t} statistics"'
	local tex_pvallab         `"\textit{p}-values"'
	local tex_cilab           `"\`level'\% confidence intervals"'
	local tex_substitute      `"_ \_ "\_cons " \_cons"'
// - booktabs
	local booktabs_open0      `""% `cdate' `ctime'" \documentclass{article} \`texpkgs' \usepackage{booktabs} \begin{document} """'
	local booktabs_close0     `"`macval(tex_close0)'"'
	local booktabs_open       `"`macval(tex_open)'"'
	local booktabs_close      `"`macval(tex_close)'"'
	local booktabs_caption    `"`macval(tex_caption)'"'
	local booktabs_open2      `"`macval(tex_open2)'"'
	local booktabs_close2     `"`macval(tex_close2)'"'
	local booktabs_toprule    `"\toprule"'
	local booktabs_midrule    `"\midrule"'
	local booktabs_bottomrule `"\bottomrule"'
	local booktabs_topgap     `"`macval(tex_topgap)'"'
	local booktabs_midgap     `"\addlinespace"'
	local booktabs_bottomgap  `"`macval(tex_bottomgap)'"'
	local booktabs_eqrule     `"begin("\midrule" "")"'
	local booktabs_ssl        `"`macval(tex_ssl)'"'
	local booktabs_lsl        `"`macval(tex_lsl)'"'
	local booktabs_starlevels `"`macval(tex_starlevels)'"'
	local booktabs_starlevlab `"`macval(tex_starlevlab)'"'
	local booktabs_begin      `"`macval(tex_begin)'"'
	local booktabs_delimiter  `"`macval(tex_delimiter)'"'
	local booktabs_end        `"`macval(tex_end)'"'
	local booktabs_varwidth   `"`macval(tex_varwidth)'"'
	local booktabs_modelwidth `"`macval(tex_modelwidth)'"'
	local booktabs_abbrev     `"`macval(tex_abbrev)'"'
	local booktabs_tstatlab   `"`macval(tex_tstatlab)'"'
	local booktabs_pvallab    `"`macval(tex_pvallab)'"'
	local booktabs_cilab      `"`macval(tex_cilab)'"'
	local booktabs_substitute `"`macval(tex_substitute)'"'

// syntax
	syntax [anything] [using] [ , ///
/// coefficients and t-stats, se, etc.
	 b Bfmt(string) ///
	 noT Tfmt(string) ///
	 se SEfmt(string) ///
	 p Pfmt(string) ///
	 ci CIfmt(string) ///
	 BEta BEtafmt(string) ///
	 main(string) /// syntax: name format
	 aux(string) /// syntax: name format
	 abs  /// absolute t-values
	 wide ///
	 NOSTAr STAR STAR2(string asis) ///
	 staraux ///
	 NOCONstant CONstant ///
	 COEFlabels(string asis) ///
/// summary statistics
	 noOBS obslast ///
	 r2 R2fmt(string) ar2 AR2fmt(string) pr2 PR2fmt(string) ///
	 aic AICfmt(string) bic BICfmt(string) ///
	 SCAlars(string asis) /// syntax: "name1 [label1]" "name2 [label2]" etc.
	 sfmt(string) ///
/// layout
	 NODEPvars DEPvars ///
	 NOPArentheses PArentheses ///
	 BRackets ///
	 NONOTEs NOTEs /// without s in helpfile
	 NOMTItles MTItles MTItles2(string asis) ///
	 NOGAPs GAPs ///
	 NOLInes LInes ///
	 ADDNotes(string asis) ///
	 COMpress ///
	 plain ///
	 smcl FIXed tab csv SCsv rtf HTMl tex BOOKTabs ///
	 Fragment ///
	 page PAGE2(str) ///
	 ALIGNment(str asis) ///
	 width(str asis) ///
/// other
	 Noisily ///
	 * ]
	_more_syntax , `macval(options)'
	_estout_options , `macval(options)'

// syntax consistency etc
	gettoken chunk using0: using
	if `"`macval(star2)'"'!="" local star star
	foreach opt in constant gaps lines star abbrev ///
	 depvars numbers parentheses notes mtitles type {
		NotBothAllowed "``opt''" `no`opt''
	}
	NotBothAllowed "`staraux'" `nostar'
	if `"`macval(mtitles2)'"'!="" NotBothAllowed "mtitles" `nomtitles'
	if `"`page2'"'!=""   local page page
	NotBothAllowed "`fragment'" `page'
	if `"`pfmt'"'!=""    local p p
	if `"`sefmt'"'!=""   local se se
	if `"`cifmt'"'!=""   local ci ci
	if `"`betafmt'"'!="" local beta beta
	if "`level'"==""     local level $S_level
	if ((("`margin'"!="" | `"`margin2'"'!="") & "`nomargin'"=="") | ///
	   ("`beta'"!="") | ("`eform'"!="" & "`noeform'"=="")) ///
	   & "`constant'"==""  local noconstant noconstant
	if `"`r2fmt'"'!="" local r2 r2
	if `"`ar2fmt'"'!="" local ar2 ar2
	if `"`pr2fmt'"'!="" local pr2 pr2
	if `"`aicfmt'"'!="" local aic aic
	if `"`bicfmt'"'!="" local bic bic
	if "`type'"=="" & `"`using'"'!="" local notype notype

// format modes
	local mode `smcl' `fixed' `tab' `csv' `scsv' `rtf' `html' `tex' `booktabs'
	if `:list sizeof mode'>1 {
		di as err "only one allowed of smcl, fixed, tab, csv, scsv, rtf, html, tex, or booktabs"
		exit 198
	}
	if `"`using'"'!="" {
		_getfilename `"`using0'"'
		local fn `"`r(filename)'"'
		_getfilesuffix `"`fn'"'
		local suffix `"`r(suffix)'"'
	}
	if "`mode'"=="" {
		if `"`using'"'!="" {
			if inlist(`"`suffix'"', ".html", ".htm") local mode html
			else if `"`suffix'"'==".tex"             local mode tex
			else if `"`suffix'"'==".csv"             local mode csv
			else if `"`suffix'"'==".rtf"             local mode rtf
			else if `"`suffix'"'==".smcl"            local mode smcl
			else local mode fixed
		}
		else local mode smcl
	}
	else {
		if "`mode'"=="scsv" {
			local csv_delimiter `"`macval(`mode'_delimiter)'"'
			local mode "csv"
		}
	}
	if `"`using'"'!="" & `"`suffix'"'=="" {
		if inlist("`mode'","fixed","tab")         local suffix ".txt"
		else if inlist("`mode'","csv","scsv")     local suffix ".csv"
		else if "`mode'"=="rtf"                   local suffix ".rtf"
		else if "`mode'"=="html"                  local suffix ".html"
		else if inlist("`mode'","tex","booktabs") local suffix ".tex"
		else if "`mode'"=="smcl"                  local suffix ".smcl"
		local using `"using `"`fn'`suffix'"'"'
		local using0 `" `"`fn'`suffix'"'"'
	}
	if "`mode'"=="smcl" local smcltags smcltags
	local mode0 `mode'
	if "`mode0'"=="booktabs" local mode0 tex
	else if "`mode0'"=="csv" {
		if "`plain'"=="" local csvlhs `"=""'
		else local csvlhs `"""'
	}
	if "`compress'"!="" & !inlist("`mode0'", "tab", "csv") {
		if "`modelwidth'"=="" local modelwidth 9
		if "`varwidth'"=="" {
			local varwidth = cond("`label'"!="", "16", "10")
		}
	}
	foreach opt in varwidth modelwidth {
		if `"``opt''"'=="" {
			local `opt' `"``mode'_`opt''"'
		}
	}
	if "`plain'"=="" {
		foreach opt in star depvars numbers parentheses notes lines {
			SwitchOnIfEmpty `opt' `no`opt''
		}
		if "`wide'"=="" & ("`t'"=="" | "`se'`p'`ci'`aux'"!="") ///
		 SwitchOnIfEmpty gaps `nogaps'
	}
	if `"`lines'"'!="" {
		SwitchOnIfEmpty eqlines `noeqlines'
	}
	if inlist("`mode0'", "tab", "csv") {
		local lines
		local eqlines
	}
	if "`notes'"!="" & "`nolegend'"=="" local legend legend
	if "`plain'"!="" {
		if "`bfmt'"==""    local bfmt %9.0g
		if "`tfmt'"==""    local tfmt `bfmt'
		if "`sefmt'"==""   local sefmt `bfmt'
		if "`pfmt'"==""    local pfmt `bfmt'
		if "`cifmt'"==""   local cifmt `bfmt'
		if "`betafmt'"=="" local betafmt `bfmt'
	}
	if "`nomtitles'"!="" local depvars
	else if "`depvars'"=="" local mtitles mtitles

// prepare append for rtf, tex, and html
	if `"`using'"'!="" & "`append'"!="" &  ///
	 (("`mode0'"=="rtf" & "`fragment'"=="") | ///
	 ("`page'"!="" & inlist("`mode0'", "tex", "html"))) {
		capture confirm file `using0'
		if _rc==0 {
			tempfile appendfile
			if "`mode'"=="rtf" local `mode'_open
			else local `mode'_open0
			local append
		}
	}

// cells() option
	if "`notes'"!="" {
		if ("`margin'"!="" | `"`margin2'"'!="") & "`nomargin'"=="" ///
		 local note "`note'Marginal effects"
		if "`eform'"!="" & "`noeform'"=="" ///
		 local note "`note'Exponentiated coefficients"
	}
	if "`bfmt'"=="" local bfmt a3
	local nocellsopt = `"`macval(cells)'"'==""
	if `nocellsopt' {
		if "`star'"!="" & "`staraux'"=="" local bstar star
		if "`beta'"!="" {
			if "`main'"!="" {
				di as err "beta() and main() not allowed both"
				exit 198
			}
			if "`betafmt'"==""  local betafmt 3
			local cells fmt(`betafmt') `bstar'
			local cells beta(`cells')
			if "`notes'"!="" {
				if `"`note'"'!="" local note "`note'; "
				local note "`note'Standardized beta coefficients"
			}
		}
		else if "`main'"!="" {
			tokenize "`main'"
			if "`2'"=="" local 2 "`bfmt'"
			local cells fmt(`2') `bstar'
			local cells `1'(`cells')
			if "`notes'"!="" {
				if `"`note'"'!="" local note "`note'; "
				local note "`note'`1' coefficients"
			}
		}
		else {
			local cells fmt(`bfmt') `bstar'
			local cells b(`cells')
		}
		if "`t'"=="" | "`se'`p'`ci'`aux'"!="" {
// parse aux option
			tokenize "`aux'"
			local auxname `1'
			local auxfmt `2'
// type of auxiliary statistic
			local aux `se' `p' `ci' `auxname'
			if `"`aux'"'=="" local aux t
			else {
				if `:list sizeof aux'>1 {
					di as err "only one allowed of se, p, ci, and aux()"
					exit 198
				}
			}
			if `"`aux'"'!="t"  local abs
// parentheses/brackets
			if "`parentheses'"!="" | "`brackets'"!="" {
				if `"`aux'"'=="ci" {
					local brackets brackets
					if "`mode'"!="smcl" local paren par
					else local paren `"par("{ralign `modelwidth':{txt:[}" "{txt:,}" "{txt:]}}")"'
				}
				else if "`brackets'"!="" {
					if "`mode'"!="smcl" local paren "par([ ])"
					else local paren `"par("{ralign `modelwidth':{txt:[}" "{txt:]}}")"'
				}
				else {
					if "`mode'"!="smcl"  local paren par
					else local paren `"par("{ralign `modelwidth':{txt:(}" "{txt:)}}")"'
				}
			}
// compose note
			if "`notes'"!="" {
				if `"`note'"'!="" local note "`note'; "
				if `"`auxname'"'!="" {
					local note `"`macval(note)'`auxname'"'
				}
				else if `"`aux'"'=="t"  {
					if "`abs'"!="" local note `"`macval(note)'Absolute "'
					local note `"`macval(note)'``mode'_tstatlab'"'
				}
				else if `"`aux'"'=="se" {
					local note `"`macval(note)'Standard errors"'
				}
				else if `"`aux'"'=="p" {
					local note `"`macval(note)'``mode'_pvallab'"'
				}
				else if `"`aux'"'=="ci" {
					local note `"`macval(note)'``mode'_cilab'"'
				}
				if "`parentheses'"=="" {
					if "`wide'"=="" local note `"`macval(note)' in second row"'
					else local note `"`macval(note)' in second column"'
				}
				else if "`brackets'"!="" {
					local note `"`macval(note)' in brackets"'
				}
				else local note `"`macval(note)' in parentheses"'
			}
// formats
			if "`tfmt'"==""     local tfmt 2
			if "`sefmt'"==""    local sefmt `bfmt'
			if "`pfmt'"==""     local pfmt 3
			if "`cifmt'"==""    local cifmt `bfmt'
			if `"`auxfmt'"'=="" local auxfmt `bfmt'
			if `"`auxname'"'=="" {
				local auxfmt ``aux'fmt'
			}
// stars
			if "`staraux'"!="" local staraux star
// put together
			local temp fmt(`auxfmt') `paren' `abs' `staraux'
			local cells `cells' `aux'(`temp')
		}
		if "`wide'"!="" local cells cells(`"`cells'"')
		else            local cells cells(`cells')
	}

// stats() option
	if `"`macval(stats)'"'=="" {
		if `"`sfmt'"'=="" local sfmt `bfmt'
		if `"`r2fmt'"'=="" local r2fmt = cond("`plain'"!="", "`bfmt'", "3")
		if `"`ar2fmt'"'=="" local ar2fmt = cond("`plain'"!="", "`bfmt'", "3")
		if `"`pr2fmt'"'=="" local pr2fmt = cond("`plain'"!="", "`bfmt'", "3")
		if `"`aicfmt'"'=="" local aicfmt `bfmt'
		if `"`bicfmt'"'=="" local bicfmt `bfmt'
		if "`label'"=="" {
			local stalabs `"``mode'_ssl'"'
		}
		else {
			local stalabs `"``mode'_lsl'"'
		}
		gettoken obslab stalabs: stalabs
		if "`obs'"=="" & "`obslast'"=="" {
			local sta N
			local stalab `"`"`macval(obslab)'"'"'
			local stafmt %18.0g
		}
		local i 0
		foreach s in r2 ar2 pr2 aic bic {
			local ++i
			if "``s''"!="" {
				local sta `sta' `:word `i' of r2 r2_a r2_p aic bic'
				local chunk: word `i' of `macval(stalabs)'
				local stalab `"`macval(stalab)' `"`macval(chunk)'"'"'
				local stafmt `stafmt' ``s'fmt'
			}
		}
		local i 0
		foreach addstat of local scalars {
			local ++i
			gettoken addstatname addstatlabel: addstat
			local addstatlabel = substr(`"`macval(addstatlabel)'"',2,.)
			if `: list posof `"`addstatname'"' in sta' continue
			if `"`addstatname'"'=="N" & "`obs'"=="" & "`obslast'"!="" continue
			if trim(`"`macval(addstatlabel)'"')=="" local addstatlabel `addstatname'
			local addstatfmt: word `i' of `sfmt'
			if `"`addstatfmt'"'=="" {
				local addstatfmt: word `: list sizeof sfmt' of `sfmt'
			}
			local sta `sta' `addstatname'
			local stalab `"`macval(stalab)' `"`macval(addstatlabel)'"'"'
			local stafmt `stafmt' `addstatfmt'
		}
		if "`obs'"=="" & "`obslast'"!="" {
			local sta `sta' N
			local stalab `"`macval(stalab)' `"`macval(obslab)'"'"'
			local stafmt `stafmt' %18.0g
		}
		if "`sta'"!="" {
			local stats stats(`sta', fmt(`stafmt') labels(`macval(stalab)'))
		}
	}

// table header
	if `"`macval(mlabels)'"'=="" {
		if "`mode0'"=="tex" local mspan " span prefix(\multicolumn{@span}{c}{) suffix(})"
		if `"`depvars'"'!="" {
			local mlabels `"mlabels(, depvar`mspan')"'
		}
		else local mlabels `"mlabels(, none)"'
		if "`mtitles'"!="" {
			if "`mode0'"=="tex" local mlabels `"mlabels(,`mspan')"'
			else local mlabels
		}
		if `"`macval(mtitles2)'"'!="" {
			local mlabels `"mlabels(`macval(mtitles2)',`mspan')"'
		}
	}
	if `"`macval(collabels)'"'=="" & `nocellsopt' & "`plain'"=="" {
		local collabels `"collabels(, none)"'
	}
	if "`mode0'"=="tex" & "`numbers'"!="" {
		local numbers "numbers(\multicolumn{@span}{c}{( )})"
	}

// pre-/posthead, pre-/postfoot, gaps and lines
// - complete note
	if `"`macval(note)'"'!="" {
		local note `"`"`macval(note)'"'"'
	}
	if "`legend'"!="" {
		if ("`margin'"!="" | `"`margin2'"'!="") & ///
		   "`nomargin'"=="" & "`nodiscrete'"=="" {
			local note `"`macval(note)' @discrete"'
		}
		if "`star'"!="" {
			local note `"`macval(note)' @starlegend"'
		}
	}
	if `"`macval(addnotes)'"'!="" {
		local note `"`macval(note)' `macval(addnotes)'"'
	}
// - mode specific settings
	if "`star'"!="" {
		if `"`macval(star2)'"'!="" {
			local `mode'_starlevels `"`macval(star2)'"'
		}
		if `"`macval(starlevels)'"'=="" {
			local starlevels `"starlevels(`macval(`mode'_starlevels)'`macval(`mode'_starlevlab)')"'
		}
	}
	foreach opt in begin delimiter end substitute {
		if `"`macval(`opt')'"'=="" & `"``mode'_`opt''"'!="" {
			local `opt' `"`opt'(``mode'_`opt'')"'
		}
	}
	if "`noabbrev'`abbrev'"=="" {
		local abbrev ``mode'_abbrev'
	}
	if `"`fragment'"'=="" {
		if "`page'"!="" {
			if `"`page2'"'!="" {
				local texpkgs `""\usepackage{`page2'}""'
			}
			local opening `"``mode'_open0'"'
		}
		if `"`macval(title)'"'!="" {
			local opening `"`macval(opening)' ``mode'_open'"'
			if "`mode0'"=="tex" & "`star'"!="" {
				local opening `"`macval(opening)' \def\sym#1{\ifmmode^{#1}\else\(^{#1}\)\fi}"'
			}
			local opening `"`macval(opening)' ``mode'_caption'"'
		}
		else if "`mode0'"=="tex" & "`star'"!="" {
			local opening `"`macval(opening)' { \def\sym#1{\ifmmode^{#1}\else\(^{#1}\)\fi}"'
		}
		else if "`mode0'"!="tex" {
			local opening `"`macval(opening)' ``mode'_open'"'
		}
		local opening `"`macval(opening)' ``mode'_open2'"'
		if  "`mode0'"=="tex" {
			if `"`width'"'!="" local extracolsep "@{\hskip\tabcolsep\extracolsep\fill}"
			if `"`macval(alignment)'"'!="" {
				local opening `"`macval(opening)'{`extracolsep'l*{@E}{`macval(alignment)'}}"'
			}
			else {
				if `nocellsopt' {
					MakeTeXColspec "`wide'" "`not'" "`star'" "`stardetach'" "`staraux'"
				}
				else {
					MakeTeXColspecAlt, `cells'
				}
				local opening `"`macval(opening)'{`extracolsep'l*{@E}{`value'}}"'
			}
		}
		if "`mode0'"=="html" {
			local brr
			foreach chunk of local note {
				local closing `"`macval(closing)' `"`brr'`macval(chunk)'"'"'
				local brr "<br />"
			}
			if `"`macval(closing)'"'!="" {
				local closing `""<tr><td colspan=@span>" `macval(closing)' </td></tr>"'
			}
		}
		else if "`mode0'"=="tex" {
			foreach chunk of local note {
				local closing `"`macval(closing)' `"\multicolumn{@span}{l}{\footnotesize `macval(chunk)'}\\\"'"'
			}
		}
		else if "`mode0'"=="csv" {
			foreach chunk of local note {
				local closing `"`macval(closing)' `"`csvlhs'`macval(chunk)'""'"'
			}
		}
		else if "`mode0'"=="rtf" {
			foreach chunk of local note {
				local closing `"`macval(closing)' `"{\pard\ql\fs20 `macval(chunk)'\par}"'"'
			}
		}
		else {
			local closing `"`macval(note)'"'
		}
		local closing `"`macval(closing)' ``mode'_close2'"'
		if `"`macval(title)'"'!="" | "`mode0'"!="tex" {
			local closing `"`macval(closing)' ``mode'_close'"'
		}
		else if "`mode0'"=="tex" & "`star'"!="" {
			local closing `"`macval(closing)' }"'
		}
		if "`page'"!="" {
			local closing `"`macval(closing)' ``mode'_close0'"'
		}
		local toprule    `"``mode'_toprule'"'
		local bottomrule `"``mode'_bottomrule'"'
		local topgap     `"``mode'_topgap'"'
		local bottomgap  `"``mode'_bottomgap'"'
	}
	local midrule `"``mode'_midrule'"'
	local midgap  `"``mode'_midgap'"'
	local eqrule  `"``mode'_eqrule'"'
// - compose prehead()
	if `"`macval(prehead)'"'=="" {
		if `"`lines'"'!="" {
			local opening `"`macval(opening)' `macval(toprule)'"'
		}
		else if `"`gaps'"'!="" {
			local opening `"`macval(opening)' `macval(topgap)'"'
		}
		SaveRetok `macval(opening)'
		local opening `"`macval(value)'"'
		if `"`macval(opening)'"'!="" {
			local prehead `"prehead(`macval(opening)')"'
		}
	}
// - compose posthead()
	if `"`macval(posthead)'"'=="" {
		if `"`lines'"'!="" {
			local posthead `"posthead(`macval(midrule)')"'
		}
		else if `"`gaps'"'!="" {
			local posthead `"posthead(`macval(midgap)')"'
		}
	}
// - compose prefoot()
	if `"`macval(prefoot)'"'=="" & `"`macval(stats)'"'!="" {
		if `"`lines'"'!="" {
			local prefoot `"prefoot(`macval(midrule)')"'
		}
		else if `"`gaps'"'!="" {
			local prefoot `"prefoot(`macval(midgap)')"'
		}
	}
// - compose postfoot()
	if `"`macval(postfoot)'"'=="" {
		if `"`lines'"'!="" {
			local closing `"`macval(bottomrule)' `macval(closing)'"'
		}
		else if `"`gaps'"'!="" {
			local closing `"`macval(bottomgap)' `macval(closing)'"'
		}
		SaveRetok `macval(closing)'
		local closing `"`macval(value)'"'
		if `"`macval(closing)'"'!="" {
			local postfoot postfoot(`macval(closing)')
		}
	}
// - varlabels
	if `"`macval(varlabels)'"'=="" {
		if `"`gaps'"'!="" {
			local varl `", end("" `macval(midgap)') nolast"'
		}
		if "`label'"!=""  {
			local varl `"_cons Constant`macval(varl)'"'
		}
		if `"`macval(coeflabels)'"'!="" {
			local varl `"`macval(coeflabels)' `macval(varl)'"'
		}
		if trim(`"`macval(varl)'"')!="" {
			local varlabels varlabels(`macval(varl)')
		}
	}
// - equation labels
	if ("`eqlines'"!="" | `"`gaps'"'!="") & "`unstack'"=="" {
		ParseEqLabels `macval(eqlabels)'
		if `eqlabelsok' {
			if "`eqlines'"!=""{
				local eqlabels `"`macval(eqlabels)'`eqlabelscomma'`macval(eqrule)' nofirst"'
			}
			else if `"`gaps'"'!="" {
				local eqlabels `"`macval(eqlabels)'`eqlabelscomma'begin(`macval(midgap)' "") nofirst"'
			}
		}
	}
	if `"`macval(eqlabels)'"'!="" {
		local eqlabels `"eqlabels(`macval(eqlabels)')"'
	}

// noconstant option
	if `"`drop'"'=="" {
		if "`noconstant'"!="" {
			local drop drop(_cons, relax)
		}
	}

// compute beta coefficients (run estadd to add e(beta))
	if "`beta'"!="" {
		local estnames `"`anything'"'
		if `"`estnames'"'=="" {
			capt est_expand $eststo
			if !_rc {
				local estnames `"$eststo"'
			}
		}
		estadd beta, replace: `estnames'
	}

// use tempfile for new table
	if `"`appendfile'"'!="" {
		local using `"using `"`appendfile'"'"'
	}

// execute estout
	if `"`varwidth'"'!="" local varwidth `"varwidth(`varwidth')"'
	if `"`modelwidth'"'!="" local modelwidth `"modelwidth(`modelwidth')"'
	CleanEstoutCmd `anything' `using' ,  ///
	 `macval(cells)' `drop' `nomargin' `margin' `margin2' `noeform' `eform'       ///
	 `nodiscrete' `macval(stats)' `stardetach' `macval(starlevels)'               ///
	 `varwidth' `modelwidth' `noabbrev' `abbrev' `unstack'                        ///
	 `macval(begin)' `macval(delimiter)' `macval(end)' `smcltags'                 ///
	 `macval(title)' `macval(prehead)' `macval(posthead)' `macval(prefoot)'       ///
	 `macval(postfoot)' `label' `macval(varlabels)' `macval(mlabels)' `nonumbers' ///
	 `numbers' `macval(collabels)' `macval(eqlabels)' `macval(mgroups)'           ///
	 `macval(substitute)' `append' `notype'`type' level(`level') `macval(options)'
	if "`noisily'"!="" {
		gettoken chunk rest: cmd, parse(",")
		di as txt _asis `"`chunk'"' _c
		gettoken chunk rest: rest, bind
		while `"`macval(chunk)'"'!="" {
			di as txt _asis `" `macval(chunk)'"'
			gettoken chunk rest: rest, bind
		}
	}
	`macval(cmd)'

// insert new table into existing document (tex, html, rtf)
	if `"`appendfile'"'!="" {
		local enddoctex "\end{document}"
		local enddochtml "</body>"
		local enddocrtf "}"
		local enddoc "`enddoc`mode0''"
		tempname fh
		file open `fh' using `using0', read write
		file seek `fh' query
		local loc = r(loc)
		file read `fh' line
		while r(eof)==0 {
			if `"`line'"'=="`enddoc'" {
				if "`mode'"=="rtf" {
					file seek `fh' query
					local loc0 = r(loc)
					file read `fh' line
					if r(eof)==0 {
						local loc = `loc0'
						continue
					}
				}
				continue, break
			}
			file seek `fh' query
			local loc = r(loc)
			file read `fh' line
		}
		file seek `fh' `loc'
		tempname new
		file open `new' `using', read
		file read `new' line
		while r(eof)==0 {
			file write `fh' `"`macval(line)'"' _n
			file read `new' line
		}
		file close `fh'
		file close `new'
	}

// returns
	if `"`using'"'!="" {
		di as txt `"(output written to {browse `using0'})"'
	}
	return local estout `macval(cmd)'
end

program _more_syntax
	syntax [, ///
	 NOEQLInes ///
	 * ]
	c_local noeqlines "`noeqlines'"
	c_local options `"`macval(options)'"'
end

program _estout_options
	syntax [, ///
	 Cells(passthru) ///
	 Drop(passthru)  ///
///	 Keep(string asis) ///
///	 Order(string asis) ///
///	 Indicate(string asis) ///
///	 TRansform(string asis) ///
///	 EQuations(passthru) ///
	 NOEFORM eform ///EFORM2(string) ///
	 NOMargin Margin Margin2(passthru) ///
	 NODIscrete /// DIscrete(string asis) ///
///	 MEQs(string) ///
///	 NODROPPED dropped DROPPED2(string) ///
	 level(numlist max=1 int >=10 <=99) ///
	 Stats(passthru) ///
	 STARLevels(passthru) ///
///	 NOSTARDetach ///
	 STARDetach ///
	 VARwidth(str) ///
	 MODELwidth(str) ///
	 NOABbrev ABbrev ///
///	 NOUNStack
	 UNStack ///
	 BEGin(passthru) ///
	 DELimiter(passthru) ///
	 end(passthru) ///
///	 DMarker(string) ///
///	 MSign(string) ///
///	 NOLZ lz ///
	 SUBstitute(passthru) ///
	 TItle(passthru) ///
	 NOLEgend LEgend ///
	 PREHead(passthru) ///
	 POSTHead(passthru) ///
	 PREFoot(passthru) ///
	 POSTFoot(passthru) ///
///	 HLinechar(string) ///
///	 NOLabel
	 Label ///
	 VARLabels(passthru) ///
///	 REFcat(string asis) ///
	 MLabels(passthru) ///
	 NONUMbers NUMbers ///NUMbers2(string asis) ///
	 COLLabels(passthru) ///
	 EQLabels(string asis) ///
	 MGRoups(passthru) ///
///	 NOReplace Replace ///
///	 NOAppend
	 Append ///
	 NOTYpe TYpe ///
///	 NOSHOWTABS showtabs ///
///	 STYle(string) ///
///	 DEFaults(string) ///
///	 NOSMCLTAGS smcltags ///
///	 NOASIS asis ///
///	 NOWRAP wrap ///
	 * ]
	foreach opt in ///
	 cells drop noeform eform nomargin margin margin2 nodiscrete ///
	 level stats starlevels stardetach varwidth modelwidth unstack ///
	 noabbrev abbrev begin delimiter end substitute title nolegend ///
	 legend prehead posthead prefoot postfoot label varlabels mlabels ///
	 nonumbers numbers collabels eqlabels mgroups append notype type ///
	 options {
		c_local `opt' `macval(`opt')'
	}
end

prog NotBothAllowed
	args opt1 opt2
	if `"`opt1'"'!="" {
		if `"`opt2'"'!="" {
			di as err `"options `opt1' and `opt2' not both allowed"'
			exit 198
		}
	}
end

prog SwitchOnIfEmpty
	args opt1 opt2
	if `"`opt2'"'=="" {
		c_local `opt1' `opt1'
	}
end

prog _getfilesuffix, rclass // based on official _getfilename.ado
	version 8
	gettoken filename rest : 0
	if `"`rest'"' != "" {
		exit 198
	}
	local hassuffix 0
	gettoken word rest : filename, parse(".")
	while `"`rest'"' != "" {
		local hassuffix 1
		gettoken word rest : rest, parse(".")
	}
	if `"`word'"'=="." {
		di as err `"incomplete filename; ends in ."'
		exit 198
	}
	if index(`"`word'"',"/") | index(`"`word'"',"\") local hassuffix 0
	if `hassuffix' return local suffix `".`word'"'
	else           return local suffix ""
end

prog MakeTeXColspec
	args wide not star detach aux
	if "`star'"!="" & "`detach'"!="" & "`aux'"=="" local value "r@{}l"
	else local value "c"
	if "`wide'"!="" & "`not'"=="" {
		if "`star'"!="" & "`detach'"!="" & "`aux'"!="" local value "`value'r@{}l"
		else local value "`value'c"
	}
	c_local value "`value'"
end

prog MakeTeXColspecAlt
	syntax, cells(string asis)
	local count 1
	while `count' {
		local cells: subinstr local cells " (" "(", all count(local count)
	}
	local count 1
	while `"`macval(cells)'"'!="" {
		gettoken row cells : cells, bind
		local size 0
		gettoken chunk row : row, bind
		while `"`macval(chunk)'"'!="" {
			local ++size
			gettoken chunk row : row, bind
		}
		local count = max(`count',`size')
	}
	c_local value: di _dup(`count') "c"
end

prog SaveRetok
	gettoken chunk 0: 0, q
	local value `"`macval(chunk)'"'
	gettoken chunk 0: 0, q
	while `"`macval(chunk)'"'!="" {
		local value `"`macval(value)' `macval(chunk)'"'
		gettoken chunk 0: 0, q
	}
	c_local value `"`macval(value)'"'
end

prog CleanEstoutCmd
	syntax [anything] [using] [ , * ]
	local cmd estout
	if `"`macval(anything)'"'!="" {
		local cmd `"`macval(cmd)' `macval(anything)'"'
	}
	if `"`macval(using)'"'!="" {
		local cmd `"`macval(cmd)' `macval(using)'"'
	}
	if `"`macval(options)'"'!="" {
		local cmd `"`macval(cmd)', `macval(options)'"'
	}
	c_local cmd `"`macval(cmd)'"'
end

prog ParseEqLabels
	syntax [anything] [ , Begin(passthru) ///
	 NOReplace Replace NOFirst First * ]
	c_local eqlabelsok = `"`begin'`noreplace'`replace'`nofirst'`first'"'==""
	if `"`options'"'=="" c_local eqlabelscomma ", "
	else c_local eqlabelscomma " "
end