*! version 3.2.0 05aug2014 Daniel Klein pr des2 vers 9.2 // prefix cap _on_colon_parse `0' if !(_rc) { if mi(`"`s(after)'"') err 198 loc 0 `s(before)' loc command `s(after)' } // des2 call syntax [ anything(id = "varlist" equalok everything) ] /// [ , View View2(str) * ] // view from file if (`"`view2'"' != "") { if (`"`options'"' != "") Des2OptNotAllowed m : mDes2ConfSmclFile(`"`view2'"', "view2") view `"`view2'"' e 0 // done } // get options Des2GetOpts ,`view' `options' // get varlist if (`"`anything'"' != "") { Des2GetVarlist `anything' /// ,`lookfor' `has' `not' `insensitive' } // add varlist from command if (`"`command'"' != "") { qui `command' loc vars `r(varlist)' loc varlist : list varlist | vars } // viewer mode if ("`view'" != "") { tempname fh tempfile des2view file open `fh' using `des2view' ,w loc print file w `fh' loc newl _n } else loc print di // the output if ("`more'" != "") & mi("`view'") se more on if mi("`varlist'") { if (`"`anything'`command'`has'`not'"' != "") { if ("`view'" != "") file close `fh' e 0 // done } // header `print' _n `"{bind:{txt}File: {res}`c(filename)'}"' `newl' `print' `"{bind:{txt}Date: {res}`c(filedate)'}"' `newl' `print' `"{bind:{txt}obs: {res}`c(N)'}"' `newl' `print' `"{bind:{txt}vars: {res}`c(k)'}"' `newl' if ("`short'" != "") | !(c(k)) e 0 // done unab varlist : _all } // header 2 `print' _n "{bind:{txt}variable name}" /// "{col `tcol1'}{bind:{txt}type}" /// "{col `tcol2'}{bind:{txt}format}" /// "{col `tcol3'}{bind:{txt}value label}" /// "{col `tcol4'}{bind:{txt}variable label}" `newl' `print' "{hline}" `newl' foreach var of loc varlist { loc typ : t `var' loc fmt : f `var' loc lbn : val l `var' loc vlb : var l `var' m : st_local("var", substr(st_local("var"), 1, `varwidth')) m : st_local("lbn", substr(st_local("lbn"), 1, `valwidth')) m : st_local("vlb", substr(st_local("vlb"), `varlabelwidth')) if mi("`cmdbar'") { if (substr("`typ'", 1, 3) == "str") loc Cmd `"`strcmd'"' else { loc Cmd `"`cmd1'"' if (`tabvalues') { loc rr : char `var'[Des2_distinct] if mi("`rr'") { cap ta `var' loc rr = r(r) } if (`rr' <= `tabvalues') loc Cmd tabulate `var' if ("`char'" != "") { char `var'[Des2_distinct] "`rr'" } } } loc SmclVar `"{stata `"`Cmd'"':{bf}`var'}"' if mi("`lbn'") loc SmclLbn "" else loc SmclLbn `"{stata `"`lcmd1'"':`lbn'}"' } else { loc SmclVar "{res}`var'" if mi("`lbn'") { loc SmclLbn "" forv j = 1/9 { loc abc : word `j' of `c(ALPHA)' loc SmclDir`abc' "txt" } } else { loc SmclLbn "`lbn'" forv j = 1/9 { loc abc : word `j' of `c(ALPHA)' loc SmclDir`abc' `"stata `"`macval(lcmd`j')'"'"' } } } `print' `"{bind:`SmclVar'}"' /// `"{col `tcol1'}{bind:{txt}`typ'}"' /// `"{col `tcol2'}{bind:{txt}`fmt'}"' /// `"{col `tcol3'}{bind:`SmclLbn'}"' /// `"{col `tcol4'}{bind:{res}`macval(vlb)'}"' `newl' if ("`cmdbar'" != "") { forv j = 1/`ncr' { if mi(`"`Cmdbar`j''"') continue `print' `"{bind:{txt}`Cmdbar`j''}"' `newl' } } if ("`vspace'" != "") `print' _n(`vspace') `newl' } if mi("`view'") e 0 // done file w `fh' _n file close `fh' if (`"`saving'"' != "") { copy `des2view' `"`saving'"' ,`replace' di as txt `"file `saving' saved"' view `"`saving'"' } else view `des2view' ,smcl end /* CUSTOMIZE THE DEFAULT OPTIONS PERMANENTLY ********************************************************************** The program below (Des2Defaults) sets the defaults for options. Each line of code consists of 5 parts 1. // line is commented out 2. c_local a non-documented Stata command 3. default_ part of local macro name 4. option's name the respective option's name 5. default for the option To change the default value for an option 1. find the line you wish to change (see 4. above) 2. remove the double slash (//) in that line (if any) 3. change to whatever default you wish 4. save the changes you made to this file 5. in Stata type -discard- DO NOT MAKE ANY OTHER CHANGES TO THE CODE */ pr Des2DefaultOpts // c_local default_view // c_local default_nocmdbar // c_local default_cmdbar c_local default_cmdorder 1 2 3 L1 L2 \ 4 5 6 7 8 // c_local default_lookfor // c_local default_more c_local default_vspace 0 c_local default_varwidth 15 c_local default_valwidth 12 c_local default_varlabelwidth 1, . c_local default_cmd1 tabulate // c_local default_txt1 c_local default_cmd2 summarize // c_local default_txt2 c_local default_cmd3 codebook // c_local default_txt3 // c_local default_cmd4 // c_local default_txt4 // c_local default_cmd5 // c_local default_txt5 // c_local default_cmd6 // c_local default_txt6 // c_local default_cmd7 // c_local default_txt7 // c_local default_cmd8 // c_local default_txt8 // c_local default_cmd9 // c_local default_txt9 c_local default_lcmd1 label list c_local default_ltxt1 "label list" c_local default_lcmd2 labelbook // c_local default_ltxt2 // c_local default_lcmd3 // c_local default_ltxt3 // c_local default_lcmd4 // c_local default_ltxt4 // c_local default_lcmd5 // c_local default_ltxt5 // c_local default_lcmd6 // c_local default_ltxt6 // c_local default_lcmd7 // c_local default_ltxt7 // c_local default_lcmd8 // c_local default_ltxt8 // c_local default_lcmd9 // c_local default_ltxt9 c_local default_strcmd \`cmd1' c_local default_tabvalues 0 // c_local default_has // c_local default_not // c_local default_insensitive end /* DO NOT MAKE ANY CHANGES TO THE CODE FOLLOWING ********************************************************************** */ pr Des2GetOpts forv j = 1/9 { loc CMDTXT `CMDTXT' /// CMD`j'(str asis) TXT`j'(str asis) // if (`j' > 2) continue loc LCMDTXT `LCMDTXT' LCMD`j'(str asis) loc LCMDTXT `LCMDTXT' LTXT`j'(str asis) } syntax [ , /// View SAVING(str) /// NOCMDBar CMDBar CMDOrder(str) /// noLOOKfor /// VSPACE VSPACE2(numlist int max = 1 >=0) /// VARWidth(numlist int max = 1 >=14 <=32) /// VALWidth(numlist int max = 1 >=11 <=32) /// VARLabelwidth(numlist int max = 2 >= 0) /// VARLWidth(numlist int max = 2 >= 0) /// MORE /// `CMDTXT' `LCMDTXT' LAbelcmd(str asis) /// STRcmd(str asis) TABValues(str) /// SET SET2(str) RESET RESET2(str) /// HAS(passthru) NOT(passthru) INSEnsitive /// Short * ] // the limit is 70 options per command! // check options loc oldoptions `"`options'"' if ("`cmdbar'$Des2_Opt_Cmdbar" != "") /// & ("`nocmdbar'$Des2_Opt_Nocmdbar" != "") { Des2OptNotAllowed cmdbar nocmdbar } if (`"`saving'"' != "") { gettoken filename subopts : saving ,p(",") if mi(`"`filename'"') Des2InvOpt saving() loc 0 `subopts' syntax [ , REPLACE ] m : mDes2ConfSmclFile(`"`filename'"', "saving") if ("`replace'" != "") loc rcok ", 602" cap conf new file `saving' if !inlist(_rc, 0`rcok') conf new file `saving' } if ("`vspace2'" != "") loc vspace `vspace2' else if ("`vspace'" != "") loc vspace 1 if ("`varlwidth'" != "") { if !inlist("`varlabelwidth'", "`varlwidth'", "") { Des2OptNotAllowed varlwidth } loc varlabelwidth `varlwidth' } loc nv_varlw : word count `varlabelwidth' if (`nv_varlw') { token `varlabelwidth' if (`nv_varlw' == 1) loc varlabelwidth 1, `1' else loc varlabelwidth `1', `2' } if (`"`labelcmd'"' != "") { if !inlist(`"`lcmd1'"', `"`labelcmd'"', "") { Des2InvOpt labelcmd() } loc lcmd1 `"`labelcmd'"' } forv j = 1/9 { foreach x in txt cmd ltxt lcmd { loc nx : word count ``x'`j'' gettoken dmp : `x'`j' ,qed(q) if (`q') { if (`nx' > 1) Des2InvOpt `x'`j'() gettoken `x'`j' : `x'`j' } loc `x'`j'_usermiss = mi(`"``x'`j''"') & (`q') } } if (`cmd1_usermiss') Des2InvOpt cmd1() if (`lcmd1_usermiss') Des2Invopt lcmd1() loc nx : word count `strcmd' gettoken dmp : strcmd ,qed(q) if (`q') { if (`nx' > 1) Des2InvOpt strcmd() gettoken strcmd : strcmd } loc strcmd_usermiss = mi(`"`strcmd'"') & (`q') if (`strcmd_usermiss') Des2InvOpt strcmd() if (`"`oldoptions'"' != "") { loc cmd_spec = (`"`cmd1'"' != "") Des2Old `cmd_spec' ,opts(`"`oldoptions'"') } if (`"`cmdorder'"' != "") Des2CmdOrder `cmdorder' if (`"`tabvalues'"' != "") { loc 0 `tabvalues' syntax anything [ , CHAR SET_sub ] cap n numlist `"`anything'"' ,int max(1) r(>=0) if (_rc) Des2InvOpt tabvalues() `= (_rc)' loc tabvalues `r(numlist)' if ("`set_sub'" != "") loc char char } // all setable options loc rsopts view results nocmdbar cmdbar cmdorder /// lookfor vspace varwidth valwidth varlabelwidth more /// cmd1 txt1 cmd2 txt2 cmd3 txt3 cmd4 txt4 /// cmd5 txt5 cmd6 txt6 cmd7 txt7 cmd8 txt8 cmd9 txt9 /// lcmd1 ltxt1 lcmd2 ltxt2 lcmd3 ltxt3 lcmd4 ltxt4 /// lcmd5 ltxt5 lcmd6 ltxt6 lcmd7 ltxt7 lcmd8 ltxt8 /// lcmd9 ltxt9 strcmd tabvalues has not insensitive if ("`set'" != "") & mi(`"`set2'"') loc set2 `rsopts' else if (`"`set2'"' != "") { m : mDes2RSOpts(`"`set2'"', "set2", "`rsopts'") } if (`"`reset'"' != "") & mi(`"`reset2'"') loc reset2 `rsopts' else if (`"`reset2'"' != "") { m : mDes2RSOpts(`"`reset2'"', "reset2", "`rsopts'") } // set the options Des2DefaultOpts foreach opt of loc rsopts { loc Gopt = "Des2_Opt_" + strproper("`opt'") if (`: list posof "`opt'" in reset2') gl `Gopt' if mi(`"``opt''"') & ("``opt'_usermiss'" != "1") { loc `opt' `"$`Gopt'"' } if (`: list posof "`opt'" in set2') { if mi(`"``opt''"') & ("``opt'_usermiss'" == "1") { loc opt `""""' } if (`"``opt''"' != `"`default_`opt''"') { gl `Gopt' `"``opt''"' } } if mi(`"``opt''"') & ("``opt'_usermiss'" != "1") { loc `opt' `"`default_`opt''"' } } // implications if (`"`saving'"' != "") loc view view if ("`view'" != "") & mi("`nocmdbar'") loc cmdbar cmdbar if ("`cmdbar'" != "") & mi("`ncr'") { Des2CmdOrder `cmdorder' } // complete cmd#() and lcnd#(); build command bar forv j = 1/9 { loc C loc L if (`"`cmd`j''"' != "") { loc dmp : subinstr loc cmd`j' "@" "" ,all c(loc at) if !(`at') loc cmd`j' `"`cmd`j'' @"' loc cmd`j' : subinstr loc cmd`j' "@" "\`var'" ,all if ("`cmdbar'" != "") { if mi(`"`txt`j''"') & !(`txt`j'_usermiss') { gettoken txt`j' : cmd`j' } loc C /// `"{bind:[{stata `"`macval(cmd`j')'"':`txt`j''}]}"' } } if (`"`lcmd`j''"' != "") { loc dmp : subinstr loc lcmd`j' "@" "\`lbn'" ,all c(loc at) if !(`at') loc lcmd`j' `"`lcmd`j'' @"' loc lcmd`j' : subinstr loc lcmd`j' "@" "\`lbn'" ,all if ("`cmdbar'" != "") { if mi(`"`ltxt`j''"') & !(`ltxt`j'_usermiss') { gettoken ltxt`j' : lcmd`j' } loc L `"[{bind:{SmclDir:`ltxt`j''}}]"' loc abc : word `j' of `c(ALPHA)' loc L : subinstr loc L "SmclDir" "\`SmclDir`abc''" } } if ("`cmdbar'" != "") { forv k = 1/`ncr' { loc Cmdbar`k' : /// subinstr loc Cmdbar`k' "L`j'" `"`macval(L)'"' ,all loc Cmdbar`k' : /// subinstr loc Cmdbar`k' "`j'" `"`macval(C)'"' ,all } } } if (`"`strcmd'"' != "") { loc dmp : subinstr loc strcmd "@" "" ,all c(loc at) if !(`at') loc strcmd `"`strcmd' @"' loc strcmd : subinstr loc strcmd "@" "\`var'" ,all } loc vspace = max(`vspace', 0) if !(`vspace') loc vspace else loc vspace = max(0, min(`vspace', c(pagesize)) - 1) loc tcol1 = `varwidth' + 2 loc tcol2 = `tcol1' + 8 loc tcol3 = `tcol2' + 10 loc tcol4 = `tcol3' + `valwidth' + 2 // return locals to main c_local view `view' c_local saving `saving' c_local replace `replace' c_local cmdbar `cmdbar' if ("`cmdbar'" != "") { forv j = 1/`ncr' { c_local Cmdbar`j' `macval(Cmdbar`j')' } c_local ncr `ncr' } c_local lookfor `lookfor' c_local vspace `vspace' c_local varwidth `varwidth' c_local valwidth `valwidth' c_local varlabelwidth `varlabelwidth' forv j = 1/9 { c_local cmd`j' `macval(cmd`j')' c_local lcmd`j' `macval(lcmd`j')' } c_local strcmd `macval(strcmd)' c_local tabvalues `tabvalues' c_local more `more' c_local char `char' c_local has `has' c_local not `not' c_local insensitive `insensitive' c_local short `short' forv j = 1/4 { c_local tcol`j' `tcol`j'' } end pr Des2GetVarlist syntax anything(equalok everything) /// [ , noLOOKfor HAS(passthru) NOT(passthru) INSEnsitive ] cap unab varlist : `anything' if (_rc) { if ("`lookfor'" != "") unab varslist : `anything' loc canything : list retok anything loc canything : subinstr loc canything "- " "-" ,all loc canything : subinstr loc canything " -" "-" ,all while (`"`canything'"' != "") { gettoken A canything : canything ,q cap unab vars : `A' if (_rc) { qui lookfor `A' loc vars `r(varlist)' } loc varlist : list varlist | vars } } if (`"`has'`not'"' != "") { qui ds ,`has' `not' `insensitive' loc vars `r(varlist)' loc varlist : list varlist | vars } c_local varlist `varlist' end pr Des2CmdOrder m : st_local("cmdorder", strupper(st_local("0"))) forv k = 0/8 { loc l = `k' + 1 loc cmdorder : subinstr loc cmdorder "L`l'" "1`k'" ,all } loc Rows 1 while (`"`cmdorder'"' != "") { gettoken tok cmdorder : cmdorder ,p("\") if (`"`tok'"' != "\") { cap n numlist `"`tok'"' ,int r(>0 <18) if (_rc) Des2InvOpt cmdorder() `= (_rc)' loc tok `r(numlist)' loc Cmdbar`Rows' `Cmdbar`Rows'' `tok' } else loc ++Rows loc Cmdorder `Cmdorder' `tok' } c_local cmdorder `Cmdorder' c_local ncr `Rows' forv j = 1/`Rows' { forv k = 0/8 { loc l = `k' + 1 loc Cmdbar`j' : subinstr loc Cmdbar`j' "1`k'" "L`l'" ,all } c_local Cmdbar`j' `Cmdbar`j'' } end pr Des2Old syntax anything , OPTS(str asis) if (`anything') Des2OptNotAllowed `"`: word 1 of `opts''"' di as txt "(note: you are using old {cmd:des2} syntax;" /// " see {helpb des2} for new syntax)" c_local cmd1 `opts' c_local cmd1_usermiss 0 end pr Des2InvOpt args opt rc if mi("`rc'") loc rc 198 di as err `"invalid option `opt'"' e `rc' end pr Des2OptNotAllowed args opt1 opt2 if mi(`"`opt1'`opt2'"') loc opts options else loc opts "option " if ("`opt2'" != "") { loc opt2 `" and `opt2'"' loc both " both" } di as err `"`opts'`opt1'`opt2' not`both' allowed"' e 198 end vers 9.2 m : void mDes2RSOpts(string rowvector usropts, string scalar lnam, string rowvector rsopts) { string scalar optsok usropts = tokens(usropts) rsopts = tokens(rsopts) optsok = J(1, 1, "") for (i = 1; i <= cols(usropts); ++i) { opts = select(rsopts, strmatch(rsopts, usropts[1, i])) if (!cols(opts)) { errprintf("may not set option %s\n", usropts[1, i]) exit(198) } for (k = 1; k <= cols(opts); ++k) { optsok = optsok + char(32) + opts[1, k] } } st_local(lnam, optsok) } void mDes2ConfSmclFile(string scalar fn, string scalar lnam) { fn = strtrim(fn) if (pathsuffix(fn) == "") fn = fn + ".smcl" if (pathsuffix(fn) != ".smcl") { errprintf("%s files not allowed\n", pathsuffix(fn)) exit(198) } st_local(lnam, fn) } end e 3.2.0 05aug2014 new 'viewer' mode new option -cmdbar- up to 9 cmd#() up to 9 lcmd#() new options -[l]txt#()- new option -cmdorder- lookfor strings enclosed in quotes tabvalues can set variable chars new option -vspace- new option -varlabelwidth()- subroutines and Mata functions 3.1.0 29jul2014 include options from -ds- bug fix default -strcmd- never released on SSC 3.0.0 26jul2014 default cmd is -tabulate- (prefomance) new options -set-/-reset- new option -strcmd- new option -more- sent to SSC (but never available) 2.0.0 11mar2014 -lookfor- varname if varname not found new option -nolookfor- default -cmd- is -tabulate- or -summarize- new option -labelcmd- new option -tabvalues- never released on SSC 1.1.0 10mar2012 prefix for commands returning r(varlist) 1.0.1 14nov2011 fix bug variable labels containing quotes 1.0.0 15oct2011 first version sent to SSC