/* Ado file: sutex2.ado Verion: 1.0 Date: 2013, nov 29 Author: Francesco Scervini francescoscerviniphd.wordpress.com For any clarifications, comments or bug reports: francesco.scervini@unito.it */ // Usual preamble set more off cap prog drop sutex2 prog define sutex2, byable(recall) version 9.0 // Syntax syntax [varlist] [if] [in] [aweight fweight], /// [DIGits(integer 3)] [MINmax] [PERCentiles(numlist max=9 sort)] /// [VARLABels] [NA(string)] [CAPTION(string)] [TABLABel(string)] [PLacement(string)] /// [LONGtable] [TABULAR] [NOCHECK] [SAVing(string)] [APPEND] [REPLAce] *********************************** *** Error messages and warnings *** *********************************** // No using with merge or append if "`saving'" == "" & ("`append'" != "" | "`replace'" != "") { di as error "Error: to 'APPEND' or 'REPLAce', you need to specify the 'SAVing' option." error } // Too few or too many digits if `digits'<0 | `digits' >20 { di as error "Error: 'DIGits' must be in the range 0-20." error } // Percentiles not included in summarize command foreach a in `percentiles' { if `a' != 1 & `a' != 5 & `a' != 10 & `a' != 25 & `a' != 50 & /// `a' != 75 & `a' != 90 & `a' != 95 & `a' != 99 { di as error "Error: 'PERCentiles' must be 1, 5, 10, 25, 50, 75, 90, 95, 99." error } } // Tabular and longtable together if "`tabular'" != "" & "`longtable'" != "" { di as error "Error: 'TABULAR' and 'LONGtable' cannot be specified together." error } // Tabular and caption/tablabel together if "`tabular'" != "" { di as error "Warning: if 'TABULAR' option is on, 'TABLABel' and 'CAPTION' have no effects." di as result "" } ************************** *** OPTIONS BY, IF, IN *** ************************** // This is to handle with "by", "if" and "in" -- It enters in summarize command // Define the marker variable (touse) and set it to zero if "by" is specified tempvar touse mark `touse' `if' `in' if _by() { qui replace `touse' = 0 if `_byindex' != _byindex() } // This is the tempname of the output file tempname tempfile ********************************** *** Default values for options *** ********************************** // Not available if "`na'" == "" { local na = "." } // Caption if "`caption'" == "" { local caption = "Summary statistics" } // Label of the table if "`tablabel'" == "" { local tablabel = "sumstat" } // Position of tex table in the file if "`placement'" == "" { local placement = "htbp" } // Number of decimals local dec = string(10^(-`digits')) // File extension (if not specified in SAVing) if "`saving'" != "" { if strpos("`saving'",".") == 0 { local file = "`saving'.tex" } if strpos("`saving'",".") != 0 { local file = "`saving'" } } ************************** *** Display of results *** ************************** // If BY is on, replace instead of append if _byindex() > 1 { local replace = "" local append = "append" } // If there is no saving file, display results... if "`saving'" == "" { local type = "di " } // ...otherwise write them on the file `tempfile'... if "`saving'" != "" { local type = "file write `tempfile'" local nline = "_n" } // ...that is opened here if "`saving'" != "" { file open `tempfile' using `file', write `append' `replace' text } ***************************** *** PART 1: Table headers *** ***************************** // Declare locals for tab header local n_perc: word count `percentiles' tokenize "`percentiles'" *forvalues b = 1/5 { forvalues b = 1/9 { if `n_perc' >= `b' { local p`b' = "P``b''" } } // Text at the top/bottom of longtables local headlong = "Continues from previous page" local footlong = "Continued on next page" // Header local h_1 = "l c c c" // Column titles local nm_1 = "\multicolumn{1}{c}{Variable} & Obs & Mean & Std. Dev." // Number of columns local c_1 = 4 // Add columns if minmax option is on local c_2 = 0 if "`minmax'" != "" { local h_2 = "c c" local nm_2 = "& Min & Max" local c_2 = 2 } // Add columns if percentiles option is on local c_3 = 0 if "`percentiles'" != "" { local d = 1 local h_3 = "" local nm_3 = "" local c_3 = 0 while `d' <= `n_perc' { local h_3 = "`h_3' c" local nm_3 = "`nm_3'& `p`d'' " local c_3 = `c_3' + 1 local d = `d' + 1 } } local h = "`h_1' `h_2' `h_3'" local c = `c_1' + `c_2' + `c_3' // The first line of the file if "`saving'"=="" { `type' "%------- Begin LaTeX code -------%" } // The header of a tabular if "`longtable'" == "" { if "`tabular'" == "" { `type' "\begin{table}[`placement']\centering \caption{`caption'\label{`tablabel'}}"`nline' } `type' "\begin{tabular}{`h'}\hline\hline"`nline' `type' "`nm_1'" _newline " `nm_2'" " `nm_3' \\ \hline"`nline' } // The header of a longtable if "`longtable'"!="" { `type' `nline'"\begin{center}"_newline "\begin{longtable}{`h'}"`nline' `type' "\caption{`caption'\label{`tablabel'}} \\"_newline"\hline\hline" /// _newline"`nm_1'" _newline " `nm_2'" _newline " `nm_3' \\ \hline"`nline' `type' "\endfirsthead"`nline' `type' "\multicolumn{`c'}{l}{\emph{`headlong'}}" /// _newline" \\ \hline\hline`nm_1'" _newline " `nm_2'" /// " `nm_3' \\ \hline"`nline' `type' "\endhead"`nline' `type' "\hline"`nline' `type' "\multicolumn{`c'}{r}{\emph{`footlong'}}\\"`nline' `type' "\endfoot"`nline' `type' "\endlastfoot"`nline' } ********************************** *** PART 2: Numerical contents *** ********************************** // This counts the number of variables local l: word count `varlist' // This generates and starts the routine of the variable local i = 1 while `i' <= `l' { tokenize "`varlist'" local nom = "``i''" // This is the "core" command: summ, describe qui su `nom' if `touse' [`weight' `exp'], de if "`varlabels'" != "" { // This identifies the label... local lab: variable label ``i'' if "`lab'" != "" { // ...and if it exists it will be shown local nom = "\`lab'" } } // This replaces special characters with LaTeX characters (DO NOT CHANGE THE ORDER!) if "`nocheck'" == "" { local nom = subinstr("`nom'" , "\" , "$\backslash$" , .) local nom = subinstr("`nom'" , "_" , "\_" , .) local nom = subinstr("`nom'" , "{" , "\{" , .) local nom = subinstr("`nom'" , "}" , "\}" , .) local nom = subinstr("`nom'" , "%" , "\%" , .) local nom = subinstr("`nom'" , "#" , "\#" , .) local nom = subinstr("`nom'" , "&" , "\&" , .) local nom = subinstr("`nom'" , "~" , "\~{}" , .) local nom = subinstr("`nom'" , "^" , "\^{}" , .) local nom = subinstr("`nom'" , "$" , "\symbol{36}" , .) local nom = subinstr("`nom'" , "<" , "$<$" , .) local nom = subinstr("`nom'" , ">" , "$>$" , .) * not elegant, but it works! local nom = subinstr("`nom'" , "\symbol{36}\backslash\symbol{36}" , "$\backslash$" , .) } // This generates locals for relevant values (obs, mean, sd, min, max) local N = r(N) local mean = string(round(r(mean), `dec')) local sd = string(round(r(sd), `dec')) local min = string(round(r(min), `dec')) local max = string(round(r(max), `dec')) // This assigns `na' if not available foreach g in N mean sd min max { if ``g'' == . { local `g' = "`na'" } } // This is the bit of columns for minmax if "`minmax'" != "" { local n_1 = "& `min' & `max'" } tokenize "`percentiles'" local e = 1 while `n_perc' >= `e' { // This generates locals for percentiles local p`e' = string(round(r(p``e''), `dec')) if `p`e'' == . { // This assigns `na' if not available local p`e' = "`na'" } local e = `e' + 1 } // This is the bit of columns for percentiles local f = 1 local n_2 = "" while `f' <= `n_perc' { local n_2 = "`n_2' & `p`f''" local f = `f' + 1 } // This is the line for each variable local n_3 = "\`nom' & `N' & `mean' & `sd' `n_1' `n_2'" // This print table lines (one for each variable) `type' "`n_3' \\"`nline' // This goes to the next variable local i = `i' + 1 } ***************************** *** PART 3: Table footers *** ***************************** // Add a horizontal line `type' "\hline" // End of table if "`longtable'" == "" { if "`tabular'" == "" { `type' "\end{tabular}"_newline "\end{table}" } if "`tabular'" != "" { `type' "\end{tabular}" } } // End of longtable if "`longtable'" != "" { `type' "\end{longtable}"_newline "\end{center}" } if "`file'" != "" { `type' ""_n } if "`file'" == "" { `type' "%------- End LaTeX code -------%"`nline' } if "`file'" != "" { file close `tempfile' } // Alert that the file has been saved if "`file'" != "" { di `"file {view "`file'"} saved"' } end