;;; calc-units.el --- unit conversion functions for Calc
-;; Copyright (C) 1990, 1991, 1992, 1993, 2001 Free Software Foundation, Inc.
+;; Copyright (C) 1990, 1991, 1992, 1993, 2001, 2002, 2003, 2004,
+;; 2005 Free Software Foundation, Inc.
;; Author: David Gillespie <daveg@synaptics.com>
-;; Maintainers: D. Goel <deego@gnufans.org>
-;; Colin Walters <walters@debian.org>
+;; Maintainer: Jay Belanger <belanger@truman.edu>
;; This file is part of GNU Emacs.
;;; Code:
;; This file is autoloaded from calc-ext.el.
-(require 'calc-ext)
+(require 'calc-ext)
(require 'calc-macs)
-
-(defun calc-Need-calc-units () nil)
+(eval-when-compile
+ (require 'calc-alg))
;;; Units operations.
( men "100/invcm" "Inverse energy in meters" )
( Hzen "h Hz" "Energy in Hertz")
( Ken "k K" "Energy in Kelvins")
- ( Wh "W h" "Watt hour")
+ ( Wh "W hr" "Watt hour")
( Ws "W s" "Watt second")
;; Power
(calc-slow-wrapper
(let ((expr (calc-top-n 1))
(uoldname nil)
- unew)
+ unew
+ units)
(unless (math-units-in-expr-p expr t)
(let ((uold (or old-units
(progn
(calc-enter-result 1 "rmun" (math-simplify-units
(math-extract-units (calc-top-n 1))))))
+;; The variables calc-num-units and calc-den-units are local to
+;; calc-explain-units, but are used by calc-explain-units-rec,
+;; which is called by calc-explain-units.
+(defvar calc-num-units)
+(defvar calc-den-units)
+
(defun calc-explain-units ()
(interactive)
(calc-wrapper
- (let ((num-units nil)
- (den-units nil))
+ (let ((calc-num-units nil)
+ (calc-den-units nil))
(calc-explain-units-rec (calc-top-n 1) 1)
- (and den-units (string-match "^[^(].* .*[^)]$" den-units)
- (setq den-units (concat "(" den-units ")")))
- (if num-units
- (if den-units
- (message "%s per %s" num-units den-units)
- (message "%s" num-units))
- (if den-units
- (message "1 per %s" den-units)
+ (and calc-den-units (string-match "^[^(].* .*[^)]$" calc-den-units)
+ (setq calc-den-units (concat "(" calc-den-units ")")))
+ (if calc-num-units
+ (if calc-den-units
+ (message "%s per %s" calc-num-units calc-den-units)
+ (message "%s" calc-num-units))
+ (if calc-den-units
+ (message "1 per %s" calc-den-units)
(message "No units in expression"))))))
(defun calc-explain-units-rec (expr pow)
(setq name (concat name "^"
(math-format-number (math-abs pow))))))
(if (math-posp pow)
- (setq num-units (if num-units
- (concat num-units " " name)
+ (setq calc-num-units (if calc-num-units
+ (concat calc-num-units " " name)
name))
- (setq den-units (if den-units
- (concat den-units " " name)
+ (setq calc-den-units (if calc-den-units
+ (concat calc-den-units " " name)
name))))
(cond ((eq (car-safe expr) '*)
(calc-explain-units-rec (nth 1 expr) pow)
(save-excursion
(goto-char (point-min))
(if (looking-at "Calculator Units Table")
- (let ((buffer-read-only nil))
+ (let ((inhibit-read-only t))
(insert "(Obsolete) "))))))))
(defun calc-get-unit-definition (uname)
(save-buffer))))
+;; The variable math-cu-unit-list is local to math-build-units-table,
+;; but is used by math-compare-unit-names, which is called (indirectly)
+;; by math-build-units-table.
+;; math-cu-unit-list is also local to math-convert-units, but is used
+;; by math-convert-units-rec, which is called by math-convert-units.
+(defvar math-cu-unit-list)
(defun math-build-units-table ()
(or math-units-table
(let* ((combined-units (append math-additional-units
math-standard-units))
- (unit-list (mapcar 'car combined-units))
+ (math-cu-unit-list (mapcar 'car combined-units))
tab)
(message "Building units table...")
(setq math-units-table-buffer-valid nil)
(message "Building units table...done")
(setq math-units-table tab))))
-(defun math-find-base-units (entry)
- (if (eq (nth 4 entry) 'boom)
- (error "Circular definition involving unit %s" (car entry)))
- (or (nth 4 entry)
- (let (base)
- (setcar (nthcdr 4 entry) 'boom)
- (math-find-base-units-rec (nth 1 entry) 1)
- '(or base
- (error "Dimensionless definition for unit %s" (car entry)))
- (while (eq (cdr (car base)) 0)
- (setq base (cdr base)))
- (let ((b base))
+;; The variables math-fbu-base and math-fbu-entry are local to
+;; math-find-base-units, but are used by math-find-base-units-rec,
+;; which is called by math-find-base-units.
+(defvar math-fbu-base)
+(defvar math-fbu-entry)
+
+(defun math-find-base-units (math-fbu-entry)
+ (if (eq (nth 4 math-fbu-entry) 'boom)
+ (error "Circular definition involving unit %s" (car math-fbu-entry)))
+ (or (nth 4 math-fbu-entry)
+ (let (math-fbu-base)
+ (setcar (nthcdr 4 math-fbu-entry) 'boom)
+ (math-find-base-units-rec (nth 1 math-fbu-entry) 1)
+ '(or math-fbu-base
+ (error "Dimensionless definition for unit %s" (car math-fbu-entry)))
+ (while (eq (cdr (car math-fbu-base)) 0)
+ (setq math-fbu-base (cdr math-fbu-base)))
+ (let ((b math-fbu-base))
(while (cdr b)
(if (eq (cdr (car (cdr b))) 0)
(setcdr b (cdr (cdr b)))
(setq b (cdr b)))))
- (setq base (sort base 'math-compare-unit-names))
- (setcar (nthcdr 4 entry) base)
- base)))
+ (setq math-fbu-base (sort math-fbu-base 'math-compare-unit-names))
+ (setcar (nthcdr 4 math-fbu-entry) math-fbu-base)
+ math-fbu-base)))
(defun math-compare-unit-names (a b)
- (memq (car b) (cdr (memq (car a) unit-list))))
+ (memq (car b) (cdr (memq (car a) math-cu-unit-list))))
(defun math-find-base-units-rec (expr pow)
(let ((u (math-check-unit-name expr)))
(let ((ulist (math-find-base-units u)))
(while ulist
(let ((p (* (cdr (car ulist)) pow))
- (old (assq (car (car ulist)) base)))
+ (old (assq (car (car ulist)) math-fbu-base)))
(if old
(setcdr old (+ (cdr old) p))
- (setq base (cons (cons (car (car ulist)) p) base))))
+ (setq math-fbu-base
+ (cons (cons (car (car ulist)) p) math-fbu-base))))
(setq ulist (cdr ulist)))))
((math-scalarp expr))
((and (eq (car expr) '^)
((eq (car expr) 'var)
(or (eq (nth 1 expr) 'pi)
(error "Unknown name %s in defining expression for unit %s"
- (nth 1 expr) (car entry))))
- (t (error "Malformed defining expression for unit %s" (car entry))))))
+ (nth 1 expr) (car math-fbu-entry))))
+ (t (error "Malformed defining expression for unit %s" (car math-fbu-entry))))))
(defun math-units-in-expr-p (expr sub-exprs)
(assq (intern (substring name 3))
math-units-table))))))))
+;; The variable math-which-standard is local to math-to-standard-units,
+;; but is used by math-to-standard-rec, which is called by
+;; math-to-standard-units.
+(defvar math-which-standard)
-(defun math-to-standard-units (expr which-standard)
+(defun math-to-standard-units (expr math-which-standard)
(math-to-standard-rec expr))
(defun math-to-standard-rec (expr)
(progn
(if (nth 1 u)
(setq expr (math-to-standard-rec (nth 1 u)))
- (let ((st (assq (car u) which-standard)))
+ (let ((st (assq (car u) math-which-standard)))
(if st
(setq expr (nth 1 st))
(setq expr (list 'var (car u)
(mapcar 'math-to-standard-rec (cdr expr))))))
(defun math-apply-units (expr units ulist &optional pure)
+ (setq expr (math-simplify-units expr))
(if ulist
(let ((new 0)
value)
- (setq expr (math-simplify-units expr))
(or (math-numberp expr)
(error "Incompatible units"))
(while (cdr ulist)
ulist (cdr ulist)))
(math-add new (math-mul (math-div expr (nth 1 (car ulist)))
(car (car ulist)))))
- (math-simplify-units (if pure
- expr
- (list '* expr units)))))
+ (if pure
+ expr
+ (math-simplify-units (list '* expr units)))))
(defvar math-decompose-units-cache nil)
(defun math-decompose-units (units)
unit nil))
t)))
+;; The variable math-fcu-u is local to math-find-compatible-unit,
+;; but is used by math-find-compatible-rec which is called by
+;; math-find-compatible-unit.
+(defvar math-fcu-u)
+
(defun math-find-compatible-unit (expr unit)
- (let ((u (math-check-unit-name unit)))
- (if u
+ (let ((math-fcu-u (math-check-unit-name unit)))
+ (if math-fcu-u
(math-find-compatible-unit-rec expr 1))))
(defun math-find-compatible-unit-rec (expr pow)
(math-find-compatible-unit-rec (nth 1 expr) (* pow (nth 2 expr))))
(t
(let ((u2 (math-check-unit-name expr)))
- (if (equal (nth 4 u) (nth 4 u2))
+ (if (equal (nth 4 math-fcu-u) (nth 4 u2))
(cons expr pow))))))
-(defun math-convert-units (expr new-units &optional pure)
+;; The variables math-cu-new-units and math-cu-pure are local to
+;; math-convert-units, but are used by math-convert-units-rec,
+;; which is called by math-convert-units.
+(defvar math-cu-new-units)
+(defvar math-cu-pure)
+
+(defun math-convert-units (expr math-cu-new-units &optional math-cu-pure)
(math-with-extra-prec 2
- (let ((compat (and (not pure) (math-find-compatible-unit expr new-units)))
- (unit-list nil)
+ (let ((compat (and (not math-cu-pure)
+ (math-find-compatible-unit expr math-cu-new-units)))
+ (math-cu-unit-list nil)
(math-combining-units nil))
(if compat
(math-simplify-units
(math-mul (math-mul (math-simplify-units
(math-div expr (math-pow (car compat)
(cdr compat))))
- (math-pow new-units (cdr compat)))
+ (math-pow math-cu-new-units (cdr compat)))
(math-simplify-units
(math-to-standard-units
- (math-pow (math-div (car compat) new-units)
+ (math-pow (math-div (car compat) math-cu-new-units)
(cdr compat))
nil))))
- (when (setq unit-list (math-decompose-units new-units))
- (setq new-units (nth 2 (car unit-list))))
+ (when (setq math-cu-unit-list (math-decompose-units math-cu-new-units))
+ (setq math-cu-new-units (nth 2 (car math-cu-unit-list))))
(when (eq (car-safe expr) '+)
(setq expr (math-simplify-units expr)))
(if (math-units-in-expr-p expr t)
(math-convert-units-rec expr)
(math-apply-units (math-to-standard-units
- (list '/ expr new-units) nil)
- new-units unit-list pure))))))
+ (list '/ expr math-cu-new-units) nil)
+ math-cu-new-units math-cu-unit-list math-cu-pure))))))
(defun math-convert-units-rec (expr)
(if (math-units-in-expr-p expr nil)
- (math-apply-units (math-to-standard-units (list '/ expr new-units) nil)
- new-units unit-list pure)
+ (math-apply-units (math-to-standard-units
+ (list '/ expr math-cu-new-units) nil)
+ math-cu-new-units math-cu-unit-list math-cu-pure)
(if (Math-primp expr)
expr
(cons (car expr)
(math-simplify a)))
(defalias 'calcFunc-usimplify 'math-simplify-units)
+;; The function created by math-defsimplify uses the variable
+;; math-simplify-expr, and so is used by functions in math-defsimplify
+(defvar math-simplify-expr)
+
(math-defsimplify (+ -)
(and math-simplifying-units
- (math-units-in-expr-p (nth 1 expr) nil)
- (let* ((units (math-extract-units (nth 1 expr)))
+ (math-units-in-expr-p (nth 1 math-simplify-expr) nil)
+ (let* ((units (math-extract-units (nth 1 math-simplify-expr)))
(ratio (math-simplify (math-to-standard-units
- (list '/ (nth 2 expr) units) nil))))
+ (list '/ (nth 2 math-simplify-expr) units) nil))))
(if (math-units-in-expr-p ratio nil)
(progn
- (calc-record-why "*Inconsistent units" expr)
- expr)
- (list '* (math-add (math-remove-units (nth 1 expr))
- (if (eq (car expr) '-) (math-neg ratio) ratio))
+ (calc-record-why "*Inconsistent units" math-simplify-expr)
+ math-simplify-expr)
+ (list '* (math-add (math-remove-units (nth 1 math-simplify-expr))
+ (if (eq (car math-simplify-expr) '-)
+ (math-neg ratio) ratio))
units)))))
(math-defsimplify *
(defun math-simplify-units-prod ()
(and math-simplifying-units
calc-autorange-units
- (Math-realp (nth 1 expr))
- (let* ((num (math-float (nth 1 expr)))
+ (Math-realp (nth 1 math-simplify-expr))
+ (let* ((num (math-float (nth 1 math-simplify-expr)))
(xpon (calcFunc-xpon num))
- (unitp (cdr (cdr expr)))
+ (unitp (cdr (cdr math-simplify-expr)))
(unit (car unitp))
- (pow (if (eq (car expr) '*) 1 -1))
+ (pow (if (eq (car math-simplify-expr) '*) 1 -1))
u)
(and (eq (car-safe unit) '*)
(setq unitp (cdr unit)
(or (not (eq p pref))
(< xpon (+ pxpon (* (math-abs pow) 3))))
(progn
- (setcar (cdr expr)
+ (setcar (cdr math-simplify-expr)
(let ((calc-prefer-frac nil))
- (calcFunc-scf (nth 1 expr)
+ (calcFunc-scf (nth 1 math-simplify-expr)
(- uxpon pxpon))))
(setcar unitp pname)
- expr)))))))
+ math-simplify-expr)))))))
+
+(defvar math-try-cancel-units)
(math-defsimplify /
(and math-simplifying-units
- (let ((np (cdr expr))
- (try-cancel-units 0)
+ (let ((np (cdr math-simplify-expr))
+ (math-try-cancel-units 0)
n nn)
- (setq n (if (eq (car-safe (nth 2 expr)) '*)
- (cdr (nth 2 expr))
- (nthcdr 2 expr)))
+ (setq n (if (eq (car-safe (nth 2 math-simplify-expr)) '*)
+ (cdr (nth 2 math-simplify-expr))
+ (nthcdr 2 math-simplify-expr)))
(if (math-realp (car n))
(progn
- (setcar (cdr expr) (math-mul (nth 1 expr)
+ (setcar (cdr math-simplify-expr) (math-mul (nth 1 math-simplify-expr)
(let ((calc-prefer-frac nil))
(math-div 1 (car n)))))
(setcar n 1)))
(while (eq (car-safe (setq n (car np))) '*)
- (math-simplify-units-divisor (cdr n) (cdr (cdr expr)))
+ (math-simplify-units-divisor (cdr n) (cdr (cdr math-simplify-expr)))
(setq np (cdr (cdr n))))
- (math-simplify-units-divisor np (cdr (cdr expr)))
- (if (eq try-cancel-units 0)
+ (math-simplify-units-divisor np (cdr (cdr math-simplify-expr)))
+ (if (eq math-try-cancel-units 0)
(let* ((math-simplifying-units nil)
- (base (math-simplify (math-to-standard-units expr nil))))
+ (base (math-simplify
+ (math-to-standard-units math-simplify-expr nil))))
(if (Math-numberp base)
- (setq expr base))))
- (if (eq (car-safe expr) '/)
+ (setq math-simplify-expr base))))
+ (if (eq (car-safe math-simplify-expr) '/)
(math-simplify-units-prod))
- expr)))
+ math-simplify-expr)))
(defun math-simplify-units-divisor (np dp)
(let ((n (car np))
(setq ud1 ud)
(while ud1
(and (eq (car (car un)) (car (car ud1)))
- (setq try-cancel-units
- (+ try-cancel-units
+ (setq math-try-cancel-units
+ (+ math-try-cancel-units
(- (* (cdr (car un)) pow1)
(* (cdr (car ud)) pow2)))))
(setq ud1 (cdr ud1)))
(math-defsimplify ^
(and math-simplifying-units
- (math-realp (nth 2 expr))
- (if (memq (car-safe (nth 1 expr)) '(* /))
- (list (car (nth 1 expr))
- (list '^ (nth 1 (nth 1 expr)) (nth 2 expr))
- (list '^ (nth 2 (nth 1 expr)) (nth 2 expr)))
- (math-simplify-units-pow (nth 1 expr) (nth 2 expr)))))
+ (math-realp (nth 2 math-simplify-expr))
+ (if (memq (car-safe (nth 1 math-simplify-expr)) '(* /))
+ (list (car (nth 1 math-simplify-expr))
+ (list '^ (nth 1 (nth 1 math-simplify-expr))
+ (nth 2 math-simplify-expr))
+ (list '^ (nth 2 (nth 1 math-simplify-expr))
+ (nth 2 math-simplify-expr)))
+ (math-simplify-units-pow (nth 1 math-simplify-expr)
+ (nth 2 math-simplify-expr)))))
(math-defsimplify calcFunc-sqrt
(and math-simplifying-units
- (if (memq (car-safe (nth 1 expr)) '(* /))
- (list (car (nth 1 expr))
- (list 'calcFunc-sqrt (nth 1 (nth 1 expr)))
- (list 'calcFunc-sqrt (nth 2 (nth 1 expr))))
- (math-simplify-units-pow (nth 1 expr) '(frac 1 2)))))
+ (if (memq (car-safe (nth 1 math-simplify-expr)) '(* /))
+ (list (car (nth 1 math-simplify-expr))
+ (list 'calcFunc-sqrt (nth 1 (nth 1 math-simplify-expr)))
+ (list 'calcFunc-sqrt (nth 2 (nth 1 math-simplify-expr))))
+ (math-simplify-units-pow (nth 1 math-simplify-expr) '(frac 1 2)))))
(math-defsimplify (calcFunc-floor
calcFunc-ceil
calcFunc-abs
calcFunc-clean)
(and math-simplifying-units
- (= (length expr) 2)
- (if (math-only-units-in-expr-p (nth 1 expr))
- (nth 1 expr)
- (if (and (memq (car-safe (nth 1 expr)) '(* /))
+ (= (length math-simplify-expr) 2)
+ (if (math-only-units-in-expr-p (nth 1 math-simplify-expr))
+ (nth 1 math-simplify-expr)
+ (if (and (memq (car-safe (nth 1 math-simplify-expr)) '(* /))
(or (math-only-units-in-expr-p
- (nth 1 (nth 1 expr)))
+ (nth 1 (nth 1 math-simplify-expr)))
(math-only-units-in-expr-p
- (nth 2 (nth 1 expr)))))
- (list (car (nth 1 expr))
- (cons (car expr)
- (cons (nth 1 (nth 1 expr))
- (cdr (cdr expr))))
- (cons (car expr)
- (cons (nth 2 (nth 1 expr))
- (cdr (cdr expr)))))))))
+ (nth 2 (nth 1 math-simplify-expr)))))
+ (list (car (nth 1 math-simplify-expr))
+ (cons (car math-simplify-expr)
+ (cons (nth 1 (nth 1 math-simplify-expr))
+ (cdr (cdr math-simplify-expr))))
+ (cons (car math-simplify-expr)
+ (cons (nth 2 (nth 1 math-simplify-expr))
+ (cdr (cdr math-simplify-expr)))))))))
(defun math-simplify-units-pow (a pow)
(if (and (eq (car-safe a) '^)
(math-defsimplify calcFunc-sin
(and math-simplifying-units
- (math-units-in-expr-p (nth 1 expr) nil)
+ (math-units-in-expr-p (nth 1 math-simplify-expr) nil)
(let ((rad (math-simplify-units
(math-evaluate-expr
- (math-to-standard-units (nth 1 expr) nil))))
+ (math-to-standard-units (nth 1 math-simplify-expr) nil))))
(calc-angle-mode 'rad))
(and (eq (car-safe rad) '*)
(math-realp (nth 1 rad))
(math-defsimplify calcFunc-cos
(and math-simplifying-units
- (math-units-in-expr-p (nth 1 expr) nil)
+ (math-units-in-expr-p (nth 1 math-simplify-expr) nil)
(let ((rad (math-simplify-units
(math-evaluate-expr
- (math-to-standard-units (nth 1 expr) nil))))
+ (math-to-standard-units (nth 1 math-simplify-expr) nil))))
(calc-angle-mode 'rad))
(and (eq (car-safe rad) '*)
(math-realp (nth 1 rad))
(math-defsimplify calcFunc-tan
(and math-simplifying-units
- (math-units-in-expr-p (nth 1 expr) nil)
+ (math-units-in-expr-p (nth 1 math-simplify-expr) nil)
(let ((rad (math-simplify-units
(math-evaluate-expr
- (math-to-standard-units (nth 1 expr) nil))))
+ (math-to-standard-units (nth 1 math-simplify-expr) nil))))
(calc-angle-mode 'rad))
(and (eq (car-safe rad) '*)
(math-realp (nth 1 rad))
(eq (nth 1 (nth 2 rad)) 'rad)
(list 'calcFunc-tan (nth 1 rad))))))
+(math-defsimplify calcFunc-sec
+ (and math-simplifying-units
+ (math-units-in-expr-p (nth 1 math-simplify-expr) nil)
+ (let ((rad (math-simplify-units
+ (math-evaluate-expr
+ (math-to-standard-units (nth 1 math-simplify-expr) nil))))
+ (calc-angle-mode 'rad))
+ (and (eq (car-safe rad) '*)
+ (math-realp (nth 1 rad))
+ (eq (car-safe (nth 2 rad)) 'var)
+ (eq (nth 1 (nth 2 rad)) 'rad)
+ (list 'calcFunc-sec (nth 1 rad))))))
+
+(math-defsimplify calcFunc-csc
+ (and math-simplifying-units
+ (math-units-in-expr-p (nth 1 math-simplify-expr) nil)
+ (let ((rad (math-simplify-units
+ (math-evaluate-expr
+ (math-to-standard-units (nth 1 math-simplify-expr) nil))))
+ (calc-angle-mode 'rad))
+ (and (eq (car-safe rad) '*)
+ (math-realp (nth 1 rad))
+ (eq (car-safe (nth 2 rad)) 'var)
+ (eq (nth 1 (nth 2 rad)) 'rad)
+ (list 'calcFunc-csc (nth 1 rad))))))
+
+(math-defsimplify calcFunc-cot
+ (and math-simplifying-units
+ (math-units-in-expr-p (nth 1 math-simplify-expr) nil)
+ (let ((rad (math-simplify-units
+ (math-evaluate-expr
+ (math-to-standard-units (nth 1 math-simplify-expr) nil))))
+ (calc-angle-mode 'rad))
+ (and (eq (car-safe rad) '*)
+ (math-realp (nth 1 rad))
+ (eq (car-safe (nth 2 rad)) 'var)
+ (eq (nth 1 (nth 2 rad)) 'rad)
+ (list 'calcFunc-cot (nth 1 rad))))))
+
(defun math-remove-units (expr)
(if (math-check-unit-name expr)
(save-excursion
(message "Formatting units table...")
(set-buffer buf)
- (setq buffer-read-only nil)
- (erase-buffer)
- (insert "Calculator Units Table:\n\n")
- (insert "Unit Type Definition Description\n\n")
- (while uptr
- (setq u (car uptr)
- name (nth 2 u))
- (when (eq (car u) 'm)
- (setq std t))
- (setq shadowed (and std (assq (car u) math-additional-units)))
- (when (and name
- (> (length name) 1)
- (eq (aref name 0) ?\*))
- (unless (eq uptr math-units-table)
- (insert "\n"))
- (setq name (substring name 1)))
- (insert " ")
- (and shadowed (insert "("))
- (insert (symbol-name (car u)))
- (and shadowed (insert ")"))
- (if (nth 3 u)
- (progn
- (indent-to 10)
- (insert (symbol-name (nth 3 u))))
- (or std
- (progn
- (indent-to 10)
- (insert "U"))))
- (indent-to 14)
- (and shadowed (insert "("))
- (if (nth 1 u)
- (insert (math-format-value (nth 1 u) 80))
- (insert (symbol-name (car u))))
- (and shadowed (insert ")"))
- (indent-to 41)
- (insert " ")
- (when name
- (insert name))
- (if shadowed
- (insert " (redefined above)")
- (unless (nth 1 u)
- (insert " (base unit)")))
- (insert "\n")
- (setq uptr (cdr uptr)))
- (insert "\n\nUnit Prefix Table:\n\n")
- (setq uptr math-unit-prefixes)
- (while uptr
- (setq u (car uptr))
- (insert " " (char-to-string (car u)))
- (if (equal (nth 1 u) (nth 1 (nth 1 uptr)))
- (insert " " (char-to-string (car (car (setq uptr (cdr uptr)))))
- " ")
- (insert " "))
- (insert "10^" (int-to-string (nth 2 (nth 1 u))))
- (indent-to 15)
- (insert " " (nth 2 u) "\n")
- (while (eq (car (car (setq uptr (cdr uptr)))) 0)))
- (insert "\n")
- (setq buffer-read-only t)
+ (let ((inhibit-read-only t))
+ (erase-buffer)
+ (insert "Calculator Units Table:\n\n")
+ (insert "Unit Type Definition Description\n\n")
+ (while uptr
+ (setq u (car uptr)
+ name (nth 2 u))
+ (when (eq (car u) 'm)
+ (setq std t))
+ (setq shadowed (and std (assq (car u) math-additional-units)))
+ (when (and name
+ (> (length name) 1)
+ (eq (aref name 0) ?\*))
+ (unless (eq uptr math-units-table)
+ (insert "\n"))
+ (setq name (substring name 1)))
+ (insert " ")
+ (and shadowed (insert "("))
+ (insert (symbol-name (car u)))
+ (and shadowed (insert ")"))
+ (if (nth 3 u)
+ (progn
+ (indent-to 10)
+ (insert (symbol-name (nth 3 u))))
+ (or std
+ (progn
+ (indent-to 10)
+ (insert "U"))))
+ (indent-to 14)
+ (and shadowed (insert "("))
+ (if (nth 1 u)
+ (insert (math-format-value (nth 1 u) 80))
+ (insert (symbol-name (car u))))
+ (and shadowed (insert ")"))
+ (indent-to 41)
+ (insert " ")
+ (when name
+ (insert name))
+ (if shadowed
+ (insert " (redefined above)")
+ (unless (nth 1 u)
+ (insert " (base unit)")))
+ (insert "\n")
+ (setq uptr (cdr uptr)))
+ (insert "\n\nUnit Prefix Table:\n\n")
+ (setq uptr math-unit-prefixes)
+ (while uptr
+ (setq u (car uptr))
+ (insert " " (char-to-string (car u)))
+ (if (equal (nth 1 u) (nth 1 (nth 1 uptr)))
+ (insert " " (char-to-string (car (car (setq uptr (cdr uptr)))))
+ " ")
+ (insert " "))
+ (insert "10^" (int-to-string (nth 2 (nth 1 u))))
+ (indent-to 15)
+ (insert " " (nth 2 u) "\n")
+ (while (eq (car (car (setq uptr (cdr uptr)))) 0)))
+ (insert "\n"))
+ (view-mode)
(message "Formatting units table...done"))
(setq math-units-table-buffer-valid t)
(let ((oldbuf (current-buffer)))
(pop-to-buffer (get-buffer "*Units Table*"))
(display-buffer (get-buffer "*Units Table*")))))
+(provide 'calc-units)
+
;; Local Variables:
;; coding: iso-latin-1
;; End: