You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

139 lines
3.4 KiB
Plaintext

7 months ago
*! version 1.1.0 11/4/94 (STB-25: dm28)
program define nicenum
version 4.0
local mac "`1'"
if "`2'" != "=" {
di in red /*
*/ "nicenum macroname = arglist [if expr] [in range], Number(#)"
error 198
}
mac shift 2
local remain "`*'"
parse "`*'", parse(",")
local arglist "`1'"
local opts "`3'"
parse "`arglist'", parse(" ")
while "`1'" != "" & "`1'" != "if" & "`1'" != "in" {
capture confirm var `1'
if _rc != 0 {
local numlist "`numlist' `1'"
}
else { local varlist "`varlist' `1'" }
mac shift
}
tempvar use
mark `use' `*'
markout `use' `varlist'
tempname gmin gmax
scalar `gmin' = . /* uninitialized state */
scalar `gmax' = .
if "`varlist'" != "" {
parse "`varlist'", parse(" ")
quietly summ `1' if `use'
scalar `gmin' = _result(5)
scalar `gmax' = _result(6)
mac shift
while "`1'" != "" {
quietly summ `1' if `use'
scalar `gmin'=cond(_result(5)<`gmin',_result(5),`gmin')
scalar `gmax'=cond(_result(6)>`gmax',_result(6),`gmax')
mac shift
}
}
parse "`numlist'", parse(" ")
while "`1'" != "" {
if `gmin'==. { scalar `gmin' = `1' }
if `gmax'==. { scalar `gmax' = `1' }
scalar `gmin' = cond(`1'<`gmin',`1',`gmin')
scalar `gmax' = cond(`1'>`gmax',`1',`gmax')
mac shift
}
local command "`*' , `opts'"
local varlist "opt"
local options "Number(int 4)"
parse "`command'"
if `number' < 1 | `number' > 19 {
di in red "number must be in [1,19]"
error 198
}
local inter = `number' + 1
local ntick = `inter'
quietly {
tempname gran exp d f nf tmp1 tmp2
scalar `gran' = `gmax'-`gmin'
scalar `exp' = log10(`gran')
scalar `exp' = int(`exp') - (`exp'<0.0)
scalar `f' = `gran'/(10^`exp')
if `f' <= 1. { scalar `nf' = 1. }
else if `f' <= 2. { scalar `nf' = 2. }
else if `f' <= 5. { scalar `nf' = 5. }
else { scalar `nf' = 10. }
scalar `gran' = `nf'*10^`exp'
scalar `d' = `gran'/(`ntick'-1)
scalar `exp' = log10(`d')
scalar `exp' = int(`exp')-(`exp'<0.0)
scalar `f' = `d'/(10^`exp')
if `f' < 1.5 { scalar `nf' = 1. }
else if `f' < 3. { scalar `nf' = 2. }
else if `f' < 7. { scalar `nf' = 5. }
else { scalar `nf' = 10. }
scalar `d' = `nf'*10^`exp'
scalar `gmin' = `gmin'/`d'
scalar `gmin' = (int(`gmin') - (`gmin'<0.0))*`d'
scalar `tmp1' = `gmax'/`d'
scalar `tmp2' = int(`tmp1')
if `tmp2' < float(`tmp1') { scalar `tmp2' = `tmp2'+1 }
scalar `gmax' = `tmp2'*`d'
scalar `tmp1' = log10(`d')
local nfrac = int(-`tmp1')+(`tmp1'<0.0)
if `nfrac'<=0 { local nfrac = 0 }
if `nfrac' > 20 {
noi di in red "numbers too small for nice labels"
error 198
}
global `mac' ""
if `nfrac' == 0 {
scalar `tmp1' = `gmin'
}
else {
scalar `tmp1' = `gmin' + 1/(10^(`nfrac'+1))
}
scalar `tmp2' = `gmax' + `d'/2
local comma ""
while `tmp1' <= `tmp2' {
local stub = int(`tmp1')
if `nfrac' {
local gminb = int(`tmp1'*(10^`nfrac'))
local stubb = int(`stub'*(10^`nfrac'))
local frac = `gminb'-`stubb'
local frst = "00000000000000000000" + /*
*/ string(`frac')
local fstr = substr("`frst'",-`nfrac',.)
global `mac' = "${`mac'}`comma'`stub'.`fstr'"
}
else {
local tstr = string(`tmp1')
global `mac' = "${`mac'}`comma'`tstr'"
}
scalar `tmp1' = `tmp1' + `d'
local comma ","
}
end