program define latab

*! 1.1.1 Ian Watson 20jan2002 (Minor changes to display plus updated help file)
*  1.1 Ian Watson 16dec2002 (File output option added)
*  1.0.2 Ian Watson 9dec2002 (Fixed indents in multicolumns)
*  1.0.2 Ian Watson 5dec2002 (Fixed footnote to span columns)
*  1.0.1 Ian Watson 27nov2002 (Support for tabularx included)
*  1.0.0 Ian Watson 25nov2002
    version 7.0
    syntax varlist(max=2) [if] [in] [fweight aweight iweight] [,tf(string) Replace APPend ncom dec(string) row col tx(string)]

    tokenize `varlist'

    tempvar touse
    tempname hh

    mark `touse' `if' `in'

    local totper="100"
    local nvars : word count `varlist'

     if "`ncom'" ~=""{
                   local tail="f"
                   }
                   else {
                   local tail="fc"
                   }

     if "`dec'" ~=""{
                   local head="`dec'"
                   }
                   else {
                   local head="0"
                   }

     if "`tx'" ~=""{
                     if "`tx'"=="0" {
                     local wide="\linewidth"
                     }
                     else {
                     local wide="`tx'cm"
                     }
                    }



    local form="%9.`head'`tail'"

   if "`row'"~= "row" & "`col'"~="col"{
         local perc=""
         }
         else {
           if "`row'"=="row"{
             local perc="row"
             }
             else if "`col'"=="col"{
             local perc="col"
             }
         }


    if `nvars'==2 {
     qui{
        tabulate `1' `2' [`weight' `exp'] if `touse', /*
        */ matrow(rowname) matcol(colname) matcell(cells)
       }
    mat rtots=rowname
    mat ctots=colname
    local grandtot=r(N)
    local rowvarlbl: variable label `1'
    local colvarlbl: variable label `2'
    local rowvallbl : value label `1'
    local colvallbl : value label `2'
    if "`colvallbl'"=="" | "`rowvallbl'"==""{
      di
      di in red "Variable(s) are not labelled! Cannot proceed."
      di in red "Define/attach labels for variable(s), then re-run."
      exit
    }
    local i=r(r)
    local j=r(c)
    local m=1
    local n=1
      while `m'<=`i' {
        local n=1
        mat rtots[`m',1]=0
        while `n'<=`j'{
            mat rtots[`m',1]=rtots[`m',1]+cells[`m',`n']
            local n=`n'+1
        }
        local m=`m'+1
      }
      local m=1
      local n=1
      while `n'<=`j' {
        local m=1
        mat ctots[1,`n']=0
        while `m'<=`i'{
            mat ctots[1,`n']=ctots[1,`n']+cells[`m',`n']
            local m=`m'+1
        }
        local n=`n'+1
      }
    local m=1
    local n=1
    di
    di in green "\begin{table}[htbp]\centering"
    if "`tx'"~=""{
    di "\newcolumntype{Y}{>{\raggedleft\arraybackslash}X}"
    di "\parbox{`wide'} {"
    }
    di "\caption{\label{`1'_by_`2'} "
    di _c "\textbf{`rowvarlbl' by " lower("`colvarlbl'")
    if "`perc'"~="" {
      di _c "~(\%)}}"
      }
      else {
      di _c "}}"
      }
    if "`tx'"~="" {
    di "}"
    di _c "\begin{tabularx} {`wide'} {@{} l"
    }
    else {
    di
    di _c "\begin{tabular} {@{} l"
    }
    local p=1
    while `p'<=`j' {
      if "`tx'"~="" {
        di _c " Y "
        }
        else {
        di _c " r "
        }
      local p=`p'+1
      }
      if "`tx'"~="" {
        di _c "Y @{}} \\\ \hline"
        }
        else {
        di _c "r @{}} \\\ \hline"
        }
     di
     di "& \multicolumn{" `j'+1 "}{@{} c @{}}{\textbf{`colvarlbl'}} \\\"
     di "\textbf{`rowvarlbl'} & "
     local p=1
     while `p'<=`j' {
       local colnum=colname[1,`p']
       local colabel: label `colvallbl' `colnum'
       di _c "`colabel' &"
       local p=`p'+1
       }
     di "Total \\\  \hline"
    while `m'<=`i' {
      local n=1
      local rownum=rowname[`m',1]
      local rowlabel: label `rowvallbl' `rownum'
      di _c in yellow "`rowlabel'"
      di _c "&"
      while `n'<=`j' {
        if "`perc'"=="" {
          di _c `form' cells[`m',`n']
          }
          else if "`perc'"=="row"{
          di _c `form' (cells[`m',`n']/rtots[`m',1])*100
          }
          else if "`perc'"=="col"{
          di _c `form' (cells[`m',`n']/ctots[1,`n'])*100
          }
          di _c "&"
          local n=`n'+1
      }
      if "`perc'"=="" {
        di _c `form' rtots[`m',1]
        }
        else if "`perc'"=="row"{
        di _c `form' `totper'
        }
        else if "`perc'"=="col" {
        di _c `form' (rtots[`m',1]/`grandtot')*100
        }
      di _c "\\\"
      di
      local m=`m'+1
      }
      di _c "Total"
      local f=1
      while `f'<=`j' {
        di _c "&"
        if "`perc'"=="" {
          di _c  `form' ctots[1,`f']
          }
          else if "`perc'"=="row"{
          di _c  `form' (ctots[1,`f']/`grandtot')*100
          }
          else if "`perc'"=="col" {
          di _c  `form' `totper'
          }
        local f=`f'+1
        }
        di _c "&"
        if "`perc'"=="" {
          di _c `form' `grandtot'
          }
          else {
          di _c  `form' `totper'
          }
      di _c "\\\"
      di in green "\hline "
      di _c  "\multicolumn{" `j'+2 "}{@{}l}{"
      di  "\footnotesize{\emph{Source:} $S_FN}}"
    if "`tx'"~=""{
      di "\end{tabularx}"
      }
      else {
      di "\end{tabular}"
      }
      di "\end{table}"
      di
      di
      di in white "This table can be cross-referenced in the body of your text"
      di in white "with the name: `1'_by_`2'"
      di
    }  * end if 2 vars
     else if `nvars'==1{
     qui {
        tabulate `1' [`weight' `exp'] if `touse', matrow(rowname) matcell(cells)
        }
      local varlbl : variable label `1'
      local vallbl : value label `1'
      local grandtot=r(N)
      local i=r(r)
      local m=1
      if "`vallbl'"==""{
      di
      di in red "Variable is not labelled! Cannot proceed."
      di in red "Define/attach labels for variable, then re-run."
      exit
      }
      di
      di in green "\begin{table}[htbp]\centering
      di "\caption{\label{freq_`1'} "
      di "\textbf{`varlbl'}}"
      di _c "\begin{tabular} {@{} l r r @{}} \\\ "
      di "\hline"
      di "Item& Number & Per cent \\\"
      di "\hline"
      while `m'<=`i' {
        local num=rowname[`m',1]
        local rowlabel: label `vallbl' `num'
        di _c in yellow "`rowlabel'"
        di _c "&"
        di _c  `form' cells[`m',1]
        di _c "&"
        di _c  `form' (cells[`m',1]/`grandtot')*100
        local m=`m'+1
        di _c "\\\"
        di
        }
      di _c "Total"
      di _c  "&"
      di _c `form' `grandtot'
      di _c "&"
      di _c `form' `totper'
      di _c "\\\"
      di
      di in green "\hline"
      di _c  "\multicolumn{3}{@{}l}{"
      di "\footnotesize{\emph{Source:} $S_FN}}"
      di "\end{tabular}"
      di "\end{table}"
      di
      di
      di in white "This table can be cross-referenced in the body of your text"
      di in white "with the name: freq_`1'"
      di

    } * end if one var


     if "`tf'" ~="" {
       if "`replace'" == "replace" {local opt "replace"}
       if "`append'" == "append" {local opt "append"}
       file open `hh' using"`tf'.tex", write `opt'
       if `nvars'==2 {
         file write `hh' _n
         file write `hh' "\begin{table}[htbp]\centering" _n
         if "`tx'"~=""{
           file write `hh' "\newcolumntype{Y}{>{\raggedleft\arraybackslash}X}" _n
           file write `hh' "\parbox{`wide'} {" _n
           }
         file write `hh' "\caption{\label{`1'_by_`2'} " _n
         file write `hh'  "\textbf{`rowvarlbl' by `colvarlbl'"
         if "`perc'"~="" {
           file write `hh' "~(\%)}}"
           }
           else {
           file write `hh' "}}"
           }
         if "`tx'"~="" {
           file write `hh' "}" _n
           file write `hh' "\begin{tabularx} {`wide'} {@{} l"
           }
           else {
           file write `hh'  _n
           file write `hh' "\begin{tabular} {@{} l"
           }
         local p=1
         while `p'<=`j' {
           if "`tx'"~="" {
             file write `hh' " Y "
             }
             else {
             file write `hh' " r "
             }
           local p=`p'+1
           }  * while loop
         if "`tx'"~="" {
           file write `hh' "Y @{}} \\\ \hline"
           }
           else {
           file write `hh' "r @{}} \\\ \hline"
           }
         file write `hh' _n
         file write `hh' "& \multicolumn{" (`j'+1) "}{@{} c @{}}{\textbf{`colvarlbl'}} \\\" _n
         file write `hh' "\textbf{`rowvarlbl'} & " _n
         local p=1
         while `p'<=`j' {
           local colnum=colname[1,`p']
           local colabel: label `colvallbl' `colnum'
           file write `hh' "`colabel' &"
           local p=`p'+1
           } * while loop
         file write `hh' "Total \\\  \hline" _n
         local m=1
         while `m'<=`i' {
           local n=1
           local rownum=rowname[`m',1]
           local rowlabel: label `rowvallbl' `rownum'
           file write `hh' "`rowlabel'"
           file write `hh' "&"
           while `n'<=`j' {
             if "`perc'"=="" {
               file write `hh' `form' (cells[`m',`n'])
               }
               else if "`perc'"=="row"{
               file write `hh' `form' (cells[`m',`n']/rtots[`m',1])*100
               }
               else if "`perc'"=="col"{
               file write `hh' `form' (cells[`m',`n']/ctots[1,`n'])*100
               }
             file write `hh' "&"
             local n=`n'+1
             } * inner while loop
           if "`perc'"=="" {
             file write `hh'  `form' (rtots[`m',1])
             }
             else if "`perc'"=="row"{
             file write `hh' `form' (`totper')
             }
             else if "`perc'"=="col" {
             file write `hh' `form' (rtots[`m',1]/`grandtot')*100
             } * end if
           file write `hh' "\\\"
           file write `hh' _n
           local m=`m'+1
           } * outer while loop
         file write `hh' "Total"
         local f=1
         while `f'<=`j' {
           file write `hh' "&"
           if "`perc'"=="" {
             file write `hh'  `form' (ctots[1,`f'])
             }
             else if "`perc'"=="row"{
             file write `hh'  `form' (ctots[1,`f']/`grandtot')*100
             }
             else if "`perc'"=="col" {
             file write `hh'  `form' (`totper')
             }
           local f=`f'+1
           } * while loop
           file write `hh' "&"
           if "`perc'"=="" {
             file write `hh'  `form' (`grandtot')
             }
             else {
             file write `hh'  `form' (`totper')
             }
         file write `hh' "\\\"
         file write `hh' "\hline " _n
         file write `hh' "\multicolumn{" (`j'+2) "}{@{}l}{"
         file write `hh'  "\footnotesize{\emph{Source:} $S_FN}}" _n
         if "`tx'"~=""{
           file write `hh' "\end{tabularx}" _n
           }
           else {
           file write `hh' "\end{tabular}"  _n
           }
         file write `hh' "\end{table}" _n
         file write `hh' _n
         file write `hh' _n
         di
         di in white "The table has been written to the file:`tf'.tex"
         file write `hh' _n
         file close `hh'
       }  * end if 2 vars
       else if `nvars'==1{
         file write `hh' _n
         file write `hh' "\begin{table}[htbp]\centering " _n
         file write `hh' "\caption{\label{freq_`1'} " _n
         file write `hh' "\textbf{`varlbl'}}" _n
         file write `hh' "\begin{tabular} {@{} l r r @{}} \\\ "
         file write `hh' "\hline" _n
         file write `hh' "Item& Number & Per cent \\\" _n
         file write `hh' "\hline" _n
         local m=1
         while `m'<=`i' {
           local num=rowname[`m',1]
           local rowlabel: label `vallbl' `num'
           file write `hh' "`rowlabel'"
           file write `hh' "&"
           file write `hh'  `form' (cells[`m',1])
           file write `hh' "&"
           file write `hh'  `form' (cells[`m',1]/`grandtot')*100
           local m=`m'+1
           file write `hh' "\\\"
           file write `hh' _n
           } * while loop
         file write `hh' "Total"
         file write `hh'  "&"
         file write `hh' `form' (`grandtot')
         file write `hh' "&"
         file write `hh' `form' (`totper')
         file write `hh' "\\\"
         file write `hh' _n
         file write `hh' "\hline" _n
         file write `hh' "\multicolumn{3}{@{}l}{"
         file write `hh' "\footnotesize{\emph{Source:} $S_FN}}" _n
         file write `hh' "\end{tabular}" _n
         file write `hh' "\end{table}" _n
         file write `hh' _n
         file write `hh' _n
         di
         di in white "The table has been written to the file: `tf'.tex"
         file write `hh' _n
         file close `hh'
       } * end if one var
    } * end if tex file option


end