]> code.delx.au - gnu-emacs/blob - lisp/calc/calc-menu.el
* lisp/calc/calc.el (calc-digit-start-entry): Fix typo.
[gnu-emacs] / lisp / calc / calc-menu.el
1 ;;; calc-menu.el --- a menu for Calc
2
3 ;; Copyright (C) 2007-2015 Free Software Foundation, Inc.
4
5 ;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com>
6
7 ;; This file is part of GNU Emacs.
8
9 ;; GNU Emacs is free software: you can redistribute it and/or modify
10 ;; it under the terms of the GNU General Public License as published by
11 ;; the Free Software Foundation, either version 3 of the License, or
12 ;; (at your option) any later version.
13
14 ;; GNU Emacs is distributed in the hope that it will be useful,
15 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
16 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 ;; GNU General Public License for more details.
18
19 ;; You should have received a copy of the GNU General Public License
20 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
21
22 ;;; Commentary:
23
24 (defvar calc-arithmetic-menu
25 (list "Arithmetic"
26 (list "Basic"
27 ["-(1:)" calc-change-sign
28 :keys "n" :active (>= (calc-stack-size) 1)]
29 ["(2:) + (1:)" calc-plus
30 :keys "+" :active (>= (calc-stack-size) 2)]
31 ["(2:) - (1:)" calc-minus
32 :keys "-" :active (>= (calc-stack-size) 2)]
33 ["(2:) * (1:)" calc-times
34 :keys "*" :active (>= (calc-stack-size) 2)]
35 ["(2:) / (1:)" calc-divide
36 :keys "/" :active (>= (calc-stack-size) 2)]
37 ["(2:) ^ (1:)" calc-power
38 :keys "^" :active (>= (calc-stack-size) 2)]
39 ["(2:) ^ (1/(1:))"
40 (progn
41 (require 'calc-ext)
42 (let ((calc-inverse-flag t))
43 (call-interactively 'calc-power)))
44 :keys "I ^"
45 :active (>= (calc-stack-size) 2)
46 :help "The (1:)th root of (2:)"]
47 ["abs(1:)"
48 (progn
49 (require 'calc-arith)
50 (call-interactively 'calc-abs))
51 :keys "A"
52 :active (>= (calc-stack-size) 1)
53 :help "Absolute value"]
54 ["1/(1:)"
55 (progn
56 (require 'calc-arith)
57 (call-interactively 'calc-inv))
58 :keys "&"
59 :active (>= (calc-stack-size) 1)]
60 ["sqrt(1:)"
61 (progn
62 (require 'calc-math)
63 (call-interactively 'calc-sqrt))
64 :keys "Q"
65 :active (>= (calc-stack-size) 1)]
66 ["idiv(2:,1:)"
67 (progn
68 (require 'calc-arith)
69 (call-interactively 'calc-idiv))
70 :keys "\\"
71 :active (>= (calc-stack-size) 2)
72 :help "The integer quotient of (2:) over (1:)"]
73 ["(2:) mod (1:)"
74 (progn
75 (require 'calc-misc)
76 (call-interactively 'calc-mod))
77 :keys "%"
78 :active (>= (calc-stack-size) 2)
79 :help "The remainder when (2:) is divided by (1:)"])
80 (list "Rounding"
81 ["floor(1:)"
82 (progn
83 (require 'calc-arith)
84 (call-interactively 'calc-floor))
85 :keys "F"
86 :active (>= (calc-stack-size) 1)
87 :help "The greatest integer less than or equal to (1:)"]
88 ["ceiling(1:)"
89 (progn
90 (require 'calc-arith)
91 (call-interactively 'calc-ceiling))
92 :keys "I F"
93 :active (>= (calc-stack-size) 1)
94 :help "The smallest integer greater than or equal to (1:)"]
95 ["round(1:)"
96 (progn
97 (require 'calc-arith)
98 (call-interactively 'calc-round))
99 :keys "R"
100 :active (>= (calc-stack-size) 1)
101 :help "The nearest integer to (1:)"]
102 ["truncate(1:)"
103 (progn
104 (require 'calc-arith)
105 (call-interactively 'calc-trunc))
106 :keys "I R"
107 :active (>= (calc-stack-size) 1)
108 :help "The integer part of (1:)"])
109 (list "Complex Numbers"
110 ["Re(1:)"
111 (progn
112 (require 'calc-cplx)
113 (call-interactively 'calc-re))
114 :keys "f r"
115 :active (>= (calc-stack-size) 1)]
116 ["Im(1:)"
117 (progn
118 (require 'calc-cplx)
119 (call-interactively 'calc-im))
120 :keys "f i"
121 :active (>= (calc-stack-size) 1)]
122 ["conj(1:)"
123 (progn
124 (require 'calc-cplx)
125 (call-interactively 'calc-conj))
126 :keys "J"
127 :active (>= (calc-stack-size) 1)
128 :help "The complex conjugate of (1:)"]
129 ["length(1:)"
130 (progn (require 'calc-arith)
131 (call-interactively 'calc-abs))
132 :keys "A"
133 :active (>= (calc-stack-size) 1)
134 :help "The length (absolute value) of (1:)"]
135 ["arg(1:)"
136 (progn
137 (require 'calc-cplx)
138 (call-interactively 'calc-argument))
139 :keys "G"
140 :active (>= (calc-stack-size) 1)
141 :help "The argument (polar angle) of (1:)"])
142 (list "Conversion"
143 ["Convert (1:) to a float"
144 (progn
145 (require 'calc-ext)
146 (call-interactively 'calc-float))
147 :keys "c f"
148 :active (>= (calc-stack-size) 1)]
149 ["Convert (1:) to a fraction"
150 (progn
151 (require 'calc-ext)
152 (call-interactively 'calc-fraction))
153 :keys "c F"
154 :active (>= (calc-stack-size) 1)])
155 (list "Binary"
156 ["Set word size"
157 (progn
158 (require 'calc-bin)
159 (call-interactively 'calc-word-size))
160 :keys "b w"]
161 ["Clip (1:) to word size"
162 (progn
163 (require 'calc-bin)
164 (call-interactively 'calc-clip))
165 :keys "b c"
166 :active (>= (calc-stack-size) 1)
167 :help "Reduce (1:) modulo 2^wordsize"]
168 ["(2:) and (1:)"
169 (progn
170 (require 'calc-bin)
171 (call-interactively 'calc-and))
172 :keys "b a"
173 :active (>= (calc-stack-size) 2)
174 :help "Bitwise AND [modulo 2^wordsize]"]
175 ["(2:) or (1:)"
176 (progn
177 (require 'calc-bin)
178 (call-interactively 'calc-or))
179 :keys "b o"
180 :active (>= (calc-stack-size) 2)
181 :help "Bitwise inclusive OR [modulo 2^wordsize]"]
182 ["(2:) xor (1:)"
183 (progn
184 (require 'calc-bin)
185 (call-interactively 'calc-xor))
186 :keys "b x"
187 :active (>= (calc-stack-size) 2)
188 :help "Bitwise exclusive OR [modulo 2^wordsize]"]
189 ["diff(2:,1:)"
190 (progn
191 (require 'calc-bin)
192 (call-interactively 'calc-diff))
193 :keys "b d"
194 :active (>= (calc-stack-size) 2)
195 :help "Bitwise difference [modulo 2^wordsize]"]
196 ["not (1:)"
197 (progn
198 (require 'calc-bin)
199 (call-interactively 'calc-not))
200 :keys "b n"
201 :active (>= (calc-stack-size) 1)
202 :help "Bitwise NOT [modulo 2^wordsize]"]
203 ["left shift(1:)"
204 (progn
205 (require 'calc-bin)
206 (call-interactively 'calc-lshift-binary))
207 :keys "b l"
208 :active (>= (calc-stack-size) 1)
209 :help "Shift (1:)[modulo 2^wordsize] one bit left"]
210 ["right shift(1:)"
211 (progn
212 (require 'calc-bin)
213 (call-interactively 'calc-rshift-binary))
214 :keys "b r"
215 :active (>= (calc-stack-size) 1)
216 :help "Shift (1:)[modulo 2^wordsize] one bit right, putting 0s on the left"]
217 ["arithmetic right shift(1:)"
218 (progn
219 (require 'calc-bin)
220 (call-interactively 'calc-rshift-arith))
221 :keys "b R"
222 :active (>= (calc-stack-size) 1)
223 :help "Shift (1:)[modulo 2^wordsize] one bit right, duplicating the leftmost bit"]
224 ["rotate(1:)"
225 (progn
226 (require 'calc-bin)
227 (call-interactively 'calc-rotate-binary))
228 :keys "b t"
229 :active (>= (calc-stack-size) 1)
230 :help "Rotate (1:)[modulo 2^wordsize] one bit left"])
231 "-------"
232 ["Help on Arithmetic"
233 (calc-info-goto-node "Arithmetic")])
234 "Menu for Calc's arithmetic functions.")
235
236 (defvar calc-scientific-function-menu
237 (list "Scientific Functions"
238 (list "Constants"
239 ["pi"
240 (progn
241 (require 'calc-math)
242 (call-interactively 'calc-pi))
243 :keys "P"]
244 ["e"
245 (progn
246 (require 'calc-math)
247 (let ((calc-hyperbolic-flag t))
248 (call-interactively 'calc-pi)))
249 :keys "H P"]
250 ["phi"
251 (progn
252 (require 'calc-math)
253 (let ((calc-inverse-flag t)
254 (calc-hyperbolic-flag t))
255 (call-interactively 'calc-pi)))
256 :keys "I H P"
257 :help "The golden ratio"]
258 ["gamma"
259 (progn
260 (require 'calc-math)
261 (let ((calc-inverse-flag t))
262 (call-interactively 'calc-pi)))
263 :keys "I P"
264 :help "Euler's constant"])
265 (list "Logs and Exps"
266 ["ln(1:)"
267 (progn
268 (require 'calc-math)
269 (call-interactively 'calc-ln))
270 :keys "L"
271 :active (>= (calc-stack-size) 1)
272 :help "The natural logarithm"]
273 ["e^(1:)"
274 (progn
275 (require 'calc-math)
276 (call-interactively 'calc-exp))
277 :keys "E"
278 :active (>= (calc-stack-size) 1)]
279 ["log(1:) [base 10]"
280 (progn
281 (require 'calc-math)
282 (call-interactively 'calc-log10))
283 :keys "H L"
284 :active (>= (calc-stack-size) 1)
285 :help "The common logarithm"]
286 ["10^(1:)"
287 (progn
288 (require 'calc-math)
289 (let ((calc-inverse-flag t))
290 (call-interactively 'calc-log10)))
291 :keys "I H L"
292 :active (>= (calc-stack-size) 1)]
293 ["log(2:) [base(1:)]"
294 (progn
295 (require 'calc-math)
296 (call-interactively 'calc-log))
297 :keys "B"
298 :active (>= (calc-stack-size) 2)
299 :help "The logarithm with an arbitrary base"]
300 ["(2:) ^ (1:)"
301 calc-power
302 :keys "^"
303 :active (>= (calc-stack-size) 2)])
304 (list "Trigonometric Functions"
305 ["sin(1:)"
306 (progn
307 (require 'calc-math)
308 (call-interactively 'calc-sin))
309 :keys "S"
310 :active (>= (calc-stack-size) 1)]
311 ["cos(1:)"
312 (progn
313 (require 'calc-math)
314 (call-interactively 'calc-cos))
315 :keys "C"
316 :active (>= (calc-stack-size) 1)]
317 ["tan(1:)"
318 (progn
319 (require 'calc-math)
320 (call-interactively 'calc-tan))
321 :keys "T"
322 :active (>= (calc-stack-size) 1)]
323 ["arcsin(1:)"
324 (progn
325 (require 'calc-math)
326 (call-interactively 'calc-arcsin))
327 :keys "I S"
328 :active (>= (calc-stack-size) 1)]
329 ["arccos(1:)"
330 (progn
331 (require 'calc-math)
332 (call-interactively 'calc-arccos))
333 :keys "I C"
334 :active (>= (calc-stack-size) 1)]
335 ["arctan(1:)"
336 (progn
337 (require 'calc-math)
338 (call-interactively 'calc-arctan))
339 :keys "I T"
340 :active (>= (calc-stack-size) 1)]
341 ["arctan2(2:,1:)"
342 (progn
343 (require 'calc-math)
344 (call-interactively 'calc-arctan2))
345 :keys "f T"
346 :active (>= (calc-stack-size) 2)]
347 "--Angle Measure--"
348 ["Radians"
349 (progn
350 (require 'calc-math)
351 (calc-radians-mode))
352 :keys "m r"
353 :style radio
354 :selected (eq calc-angle-mode 'rad)]
355 ["Degrees"
356 (progn
357 (require 'calc-math)
358 (calc-degrees-mode))
359 :keys "m d"
360 :style radio
361 :selected (eq calc-angle-mode 'deg)]
362 ["HMS"
363 (progn
364 (require 'calc-math)
365 (calc-hms-mode))
366 :keys "m h"
367 :style radio
368 :selected (eq calc-angle-mode 'hms)])
369 (list "Hyperbolic Functions"
370 ["sinh(1:)"
371 (progn
372 (require 'calc-math)
373 (call-interactively 'calc-sinh))
374 :keys "H S"
375 :active (>= (calc-stack-size) 1)]
376 ["cosh(1:)"
377 (progn
378 (require 'calc-math)
379 (call-interactively 'calc-cosh))
380 :keys "H C"
381 :active (>= (calc-stack-size) 1)]
382 ["tanh(1:)"
383 (progn
384 (require 'calc-math)
385 (call-interactively 'calc-tanh))
386 :keys "H T"
387 :active (>= (calc-stack-size) 1)]
388 ["arcsinh(1:)"
389 (progn
390 (require 'calc-math)
391 (call-interactively 'calc-arcsinh))
392 :keys "I H S"
393 :active (>= (calc-stack-size) 1)]
394 ["arccosh(1:)"
395 (progn
396 (require 'calc-math)
397 (call-interactively 'calc-arccosh))
398 :keys "I H C"
399 :active (>= (calc-stack-size) 1)]
400 ["arctanh(1:)"
401 (progn
402 (require 'calc-math)
403 (call-interactively 'calc-arctanh))
404 :keys "I H T"
405 :active (>= (calc-stack-size) 1)])
406 (list "Advanced Math Functions"
407 ["Gamma(1:)"
408 (progn
409 (require 'calc-comb)
410 (call-interactively 'calc-gamma))
411 :keys "f g"
412 :active (>= (calc-stack-size) 1)
413 :help "The Euler Gamma function"]
414 ["GammaP(2:,1:)"
415 (progn
416 (require 'calc-funcs)
417 (call-interactively 'calc-inc-gamma))
418 :keys "f G"
419 :active (>= (calc-stack-size) 2)
420 :help "The lower incomplete Gamma function"]
421 ["Beta(2:,1:)"
422 (progn
423 (require 'calc-funcs)
424 (call-interactively 'calc-beta))
425 :keys "f b"
426 :active (>= (calc-stack-size) 2)
427 :help "The Euler Beta function"]
428 ["BetaI(3:,2:,1:)"
429 (progn
430 (require 'calc-funcs)
431 (call-interactively 'calc-inc-beta))
432 :keys "f B"
433 :active (>= (calc-stack-size) 3)
434 :help "The incomplete Beta function"]
435 ["erf(1:)"
436 (progn
437 (require 'calc-funcs)
438 (call-interactively 'calc-erf))
439 :keys "f e"
440 :active (>= (calc-stack-size) 1)
441 :help "The error function"]
442 ["BesselJ(2:,1:)"
443 (progn
444 (require 'calc-funcs)
445 (call-interactively 'calc-bessel-J))
446 :keys "f j"
447 :active (>= (calc-stack-size) 2)
448 :help "The Bessel function of the first kind (of order (2:))"]
449 ["BesselY(2:,1:)"
450 (progn
451 (require 'calc-funcs)
452 (call-interactively 'calc-bessel-Y))
453 :keys "f y"
454 :active (>= (calc-stack-size) 2)
455 :help "The Bessel function of the second kind (of order (2:))"])
456 (list "Combinatorial Functions"
457 ["gcd(2:,1:)"
458 (progn
459 (require 'calc-comb)
460 (call-interactively 'calc-gcd))
461 :keys "k g"
462 :active (>= (calc-stack-size) 2)]
463 ["lcm(2:,1:)"
464 (progn
465 (require 'calc-comb)
466 (call-interactively 'calc-lcm))
467 :keys "k l"
468 :active (>= (calc-stack-size) 2)]
469 ["factorial(1:)"
470 (progn
471 (require 'calc-comb)
472 (call-interactively 'calc-factorial))
473 :keys "!"
474 :active (>= (calc-stack-size) 1)]
475 ["(2:) choose (1:)"
476 (progn
477 (require 'calc-comb)
478 (call-interactively 'calc-choose))
479 :keys "k c"
480 :active (>= (calc-stack-size) 2)]
481 ["permutations(2:,1:)"
482 (progn
483 (require 'calc-comb)
484 (call-interactively 'calc-perm))
485 :keys "H k c"
486 :active (>= (calc-stack-size) 2)]
487 ["Primality test for (1:)"
488 (progn
489 (require 'calc-comb)
490 (call-interactively 'calc-prime-test))
491 :keys "k p"
492 :active (>= (calc-stack-size) 1)
493 :help "For large (1:), a probabilistic test"]
494 ["Factor (1:) into primes"
495 (progn
496 (require 'calc-comb)
497 (call-interactively 'calc-prime-factors))
498 :keys "k f"
499 :active (>= (calc-stack-size) 1)]
500 ["Next prime after (1:)"
501 (progn
502 (require 'calc-comb)
503 (call-interactively 'calc-next-prime))
504 :keys "k n"
505 :active (>= (calc-stack-size) 1)]
506 ["Previous prime before (1:)"
507 (progn
508 (require 'calc-comb)
509 (call-interactively 'calc-prev-prime))
510 :keys "I k n"
511 :active (>= (calc-stack-size) 1)]
512 ["phi(1:)"
513 (progn
514 (require 'calc-comb)
515 (call-interactively 'calc-totient))
516 :keys "k n"
517 :active (>= (calc-stack-size) 1)
518 :help "Euler's totient function"]
519 ["random(1:)"
520 (progn
521 (require 'calc-comb)
522 (call-interactively 'calc-random))
523 :keys "k r"
524 :active (>= (calc-stack-size) 1)
525 :help "A random number >=1 and < (1:)"])
526 "----"
527 ["Help on Scientific Functions"
528 (calc-info-goto-node "Scientific Functions")])
529 "Menu for Calc's scientific functions.")
530
531 (defvar calc-algebra-menu
532 (list "Algebra"
533 (list "Simplification"
534 ["Simplify (1:)"
535 (progn
536 (require 'calc-alg)
537 (call-interactively 'calc-simplify))
538 :keys "a s"
539 :active (>= (calc-stack-size) 1)]
540 ["Simplify (1:) with extended rules"
541 (progn
542 (require 'calc-alg)
543 (call-interactively 'calc-simplify-extended))
544 :keys "a e"
545 :active (>= (calc-stack-size) 1)
546 :help "Apply possibly unsafe simplifications"])
547 (list "Manipulation"
548 ["Expand formula (1:)"
549 (progn
550 (require 'calc-alg)
551 (call-interactively 'calc-expand-formula))
552 :keys "a \""
553 :active (>= (calc-stack-size) 1)
554 :help "Expand (1:) into its defining formula, if possible"]
555 ["Evaluate variables in (1:)"
556 (progn
557 (require 'calc-ext)
558 (call-interactively 'calc-evaluate))
559 :keys "="
560 :active (>= (calc-stack-size) 1)]
561 ["Make substitution in (1:)"
562 (progn
563 (require 'calc-alg)
564 (call-interactively 'calc-substitute))
565 :keys "a b"
566 :active (>= (calc-stack-size) 1)
567 :help
568 "Substitute all occurrences of a sub-expression with a new sub-expression"])
569 (list "Polynomials"
570 ["Factor (1:)"
571 (progn
572 (require 'calc-alg)
573 (call-interactively 'calc-factor))
574 :keys "a f"
575 :active (>= (calc-stack-size) 1)]
576 ["Collect terms in (1:)"
577 (progn
578 (require 'calc-alg)
579 (call-interactively 'calc-collect))
580 :keys "a c"
581 :active (>= (calc-stack-size) 1)
582 :help "Arrange as a polynomial in a given variable"]
583 ["Expand (1:)"
584 (progn
585 (require 'calc-alg)
586 (call-interactively 'calc-expand))
587 :keys "a x"
588 :active (>= (calc-stack-size) 1)
589 :help "Apply distributive law everywhere"]
590 ["Find roots of (1:)"
591 (progn
592 (require 'calcalg2)
593 (call-interactively 'calc-poly-roots))
594 :keys "a P"
595 :active (>= (calc-stack-size) 1)])
596 (list "Calculus"
597 ["Differentiate (1:)"
598 (progn
599 (require 'calcalg2)
600 (call-interactively 'calc-derivative))
601 :keys "a d"
602 :active (>= (calc-stack-size) 1)]
603 ["Integrate (1:) [indefinite]"
604 (progn
605 (require 'calcalg2)
606 (call-interactively 'calc-integral))
607 :keys "a i"
608 :active (>= (calc-stack-size) 1)]
609 ["Integrate (1:) [definite]"
610 (progn
611 (require 'calcalg2)
612 (let ((var (read-string "Integration variable: ")))
613 (calc-tabular-command 'calcFunc-integ "Integration"
614 "intg" nil var nil nil)))
615 :keys "C-u a i"
616 :active (>= (calc-stack-size) 1)]
617 ["Integrate (1:) [numeric]"
618 (progn
619 (require 'calcalg2)
620 (call-interactively 'calc-num-integral))
621 :keys "a I"
622 :active (>= (calc-stack-size) 1)
623 :help "Integrate using the open Romberg method"]
624 ["Taylor expand (1:)"
625 (progn
626 (require 'calcalg2)
627 (call-interactively 'calc-taylor))
628 :keys "a t"
629 :active (>= (calc-stack-size) 1)]
630 ["Minimize (2:) [initial guess = (1:)]"
631 (progn
632 (require 'calcalg3)
633 (call-interactively 'calc-find-minimum))
634 :keys "a N"
635 :active (>= (calc-stack-size) 2)
636 :help "Find a local minimum"]
637 ["Maximize (2:) [initial guess = (1:)]"
638 (progn
639 (require 'calcalg3)
640 (call-interactively 'calc-find-maximum))
641 :keys "a X"
642 :active (>= (calc-stack-size) 2)
643 :help "Find a local maximum"])
644 (list "Solving"
645 ["Solve equation (1:)"
646 (progn
647 (require 'calcalg2)
648 (call-interactively 'calc-solve-for))
649 :keys "a S"
650 :active (>= (calc-stack-size) 1)]
651 ["Solve equation (2:) numerically [initial guess = (1:)]"
652 (progn
653 (require 'calcalg3)
654 (call-interactively 'calc-find-root))
655 :keys "a R"
656 :active (>= (calc-stack-size) 2)]
657 ["Find roots of polynomial (1:)"
658 (progn
659 (require 'calcalg2)
660 (call-interactively 'calc-poly-roots))
661 :keys "a P"
662 :active (>= (calc-stack-size) 1)])
663 (list "Curve Fitting"
664 ["Fit (1:)=[x values, y values] to a curve"
665 (progn
666 (require 'calcalg3)
667 (call-interactively 'calc-curve-fit))
668 :keys "a F"
669 :active (>= (calc-stack-size) 1)])
670 "----"
671 ["Help on Algebra"
672 (calc-info-goto-node "Algebra")])
673 "Menu for Calc's algebraic facilities.")
674
675
676 (defvar calc-graphics-menu
677 (list "Graphics"
678 ["Graph 2D [(1:)= y values, (2:)= x values]"
679 (progn
680 (require 'calc-graph)
681 (call-interactively 'calc-graph-fast))
682 :keys "g f"
683 :active (>= (calc-stack-size) 2)]
684 ["Graph 3D [(1:)= z values, (2:)= y values, (3:)= x values]"
685 (progn
686 (require 'calc-graph)
687 (call-interactively 'calc-graph-fast-3d))
688 :keys "g F"
689 :active (>= (calc-stack-size) 3)]
690 "----"
691 ["Help on Graphics"
692 (calc-info-goto-node "Graphics")])
693 "Menu for Calc's graphics.")
694
695
696 (defvar calc-vectors-menu
697 (list "Matrices/Vectors"
698 (list "Matrices"
699 ["(2:) + (1:)" calc-plus
700 :keys "+" :active (>= (calc-stack-size) 2)]
701 ["(2:) - (1:)" calc-minus
702 :keys "-" :active (>= (calc-stack-size) 2)]
703 ["(2:) * (1:)" calc-times
704 :keys "*" :active (>= (calc-stack-size) 2)]
705 ["(1:)^(-1)"
706 (progn
707 (require 'calc-arith)
708 (call-interactively 'calc-inv))
709 :keys "&"
710 :active (>= (calc-stack-size) 1)]
711 ["Create an identity matrix"
712 (progn
713 (require 'calc-vec)
714 (call-interactively 'calc-ident))
715 :keys "v i"]
716 ["transpose(1:)"
717 (progn
718 (require 'calc-vec)
719 (call-interactively 'calc-transpose))
720 :keys "v t"
721 :active (>= (calc-stack-size) 1)]
722 ["det(1:)"
723 (progn
724 (require 'calc-mtx)
725 (call-interactively 'calc-mdet))
726 :keys "V D"
727 :active (>= (calc-stack-size) 1)]
728 ["trace(1:)"
729 (progn
730 (require 'calc-mtx)
731 (call-interactively 'calc-mtrace))
732 :keys "V T"
733 :active (>= (calc-stack-size) 1)]
734 ["LUD decompose (1:)"
735 (progn
736 (require 'calc-mtx)
737 (call-interactively 'calc-mlud))
738 :keys "V L"
739 :active (>= (calc-stack-size) 1)]
740 ["Extract a row from (1:)"
741 (progn
742 (require 'calc-vec)
743 (call-interactively 'calc-mrow))
744 :keys "v r"
745 :active (>= (calc-stack-size) 1)]
746 ["Extract a column from (1:)"
747 (progn
748 (require 'calc-vec)
749 (call-interactively 'calc-mcol))
750 :keys "v c"
751 :active (>= (calc-stack-size) 1)])
752 (list "Vectors"
753 ["Extract the first element of (1:)"
754 (progn
755 (require 'calc-vec)
756 (call-interactively 'calc-head))
757 :keys "v h"
758 :active (>= (calc-stack-size) 1)]
759 ["Extract an element from (1:)"
760 (progn
761 (require 'calc-vec)
762 (call-interactively 'calc-mrow))
763 :keys "v r"
764 :active (>= (calc-stack-size) 1)]
765 ["Reverse (1:)"
766 (progn
767 (require 'calc-vec)
768 (call-interactively 'calc-reverse-vector))
769 :keys "v v"
770 :active (>= (calc-stack-size) 1)]
771 ["Unpack (1:)"
772 (progn
773 (require 'calc-vec)
774 (call-interactively 'calc-unpack))
775 :keys "v u"
776 :active (>= (calc-stack-size) 1)
777 :help "Separate the elements of (1:)"]
778 ["(2:) cross (1:)"
779 (progn
780 (require 'calc-vec)
781 (call-interactively 'calc-cross))
782 :keys "V C"
783 :active (>= (calc-stack-size) 2)
784 :help "The cross product in R^3"]
785 ["(2:) dot (1:)"
786 calc-mult
787 :keys "*"
788 :active (>= (calc-stack-size) 2)
789 :help "The dot product"]
790 ["Map a function across (1:)"
791 (progn
792 (require 'calc-map)
793 (call-interactively 'calc-map))
794 :keys "V M"
795 :active (>= (calc-stack-size) 1)
796 :help "Apply a function to each element"])
797 (list "Vectors As Sets"
798 ["Remove duplicates from (1:)"
799 (progn
800 (require 'calc-vec)
801 (call-interactively 'calc-remove-duplicates))
802 :keys "V +"
803 :active (>= (calc-stack-size) 1)]
804 ["(2:) union (1:)"
805 (progn
806 (require 'calc-vec)
807 (call-interactively 'calc-set-union))
808 :keys "V V"
809 :active (>= (calc-stack-size) 2)]
810 ["(2:) intersect (1:)"
811 (progn
812 (require 'calc-vec)
813 (call-interactively 'calc-set-intersect))
814 :keys "V ^"
815 :active (>= (calc-stack-size) 2)]
816 ["(2:) \\ (1:)"
817 (progn
818 (require 'calc-vec)
819 (call-interactively 'calc-set-difference))
820 :keys "V -"
821 :help "Set difference"
822 :active (>= (calc-stack-size) 2)])
823 (list "Statistics On Vectors"
824 ["length(1:)"
825 (progn
826 (require 'calc-stat)
827 (call-interactively 'calc-vector-count))
828 :keys "u #"
829 :active (>= (calc-stack-size) 1)
830 :help "The number of data values"]
831 ["sum(1:)"
832 (progn
833 (require 'calc-stat)
834 (call-interactively 'calc-vector-sum))
835 :keys "u +"
836 :active (>= (calc-stack-size) 1)
837 :help "The sum of the data values"]
838 ["max(1:)"
839 (progn
840 (require 'calc-stat)
841 (call-interactively 'calc-vector-max))
842 :keys "u x"
843 :active (>= (calc-stack-size) 1)
844 :help "The maximum of the data values"]
845 ["min(1:)"
846 (progn
847 (require 'calc-stat)
848 (call-interactively 'calc-vector-min))
849 :keys "u N"
850 :active (>= (calc-stack-size) 1)
851 :help "The minimum of the data values"]
852 ["mean(1:)"
853 (progn
854 (require 'calc-stat)
855 (call-interactively 'calc-vector-mean))
856 :keys "u M"
857 :active (>= (calc-stack-size) 1)
858 :help "The average (arithmetic mean) of the data values"]
859 ["mean(1:) with error"
860 (progn
861 (require 'calc-stat)
862 (call-interactively 'calc-vector-mean-error))
863 :keys "I u M"
864 :active (>= (calc-stack-size) 1)
865 :help "The average (arithmetic mean) of the data values as an error form"]
866 ["rms(1:)"
867 (progn
868 (require 'calc-stat)
869 (call-interactively 'calc-vector-rms))
870 :keys "u R"
871 :active (>= (calc-stack-size) 1)
872 :help "The root mean square of the data values"]
873 ["sdev(1:)"
874 (progn
875 (require 'calc-stat)
876 (call-interactively 'calc-vector-sdev))
877 :keys "u S"
878 :active (>= (calc-stack-size) 1)
879 :help "The sample sdev, sqrt[sum((values - mean)^2)/(N-1)]"]
880 ["variance(1:)"
881 (progn
882 (require 'calc-stat)
883 (call-interactively 'calc-vector-variance))
884 :keys "H u S"
885 :active (>= (calc-stack-size) 1)
886 :help "The sample variance, sum((values - mean)^2)/(N-1)"]
887 ["population sdev(1:)"
888 (progn
889 (require 'calc-stat)
890 (call-interactively 'calc-vector-pop-sdev))
891 :keys "I u S"
892 :active (>= (calc-stack-size) 1)
893 :help "The population sdev, sqrt[sum((values - mean)^2)/N]"]
894 ["population variance(1:)"
895 (progn
896 (require 'calc-stat)
897 (call-interactively 'calc-vector-pop-variance))
898 :keys "H I u S"
899 :active (>= (calc-stack-size) 1)
900 :help "The population variance, sum((values - mean)^2)/N"]
901 ["median(1:)"
902 (progn
903 (require 'calc-stat)
904 (call-interactively 'calc-vector-median))
905 :keys "H u M"
906 :active (>= (calc-stack-size) 1)
907 :help "The median of the data values"]
908 ["harmonic mean(1:)"
909 (progn
910 (require 'calc-stat)
911 (call-interactively 'calc-vector-harmonic-mean))
912 :keys "H I u M"
913 :active (>= (calc-stack-size) 1)]
914 ["geometric mean(1:)"
915 (progn
916 (require 'calc-stat)
917 (call-interactively 'calc-vector-geometric-mean))
918 :keys "u G"
919 :active (>= (calc-stack-size) 1)]
920 ["arithmetic-geometric mean(1:)"
921 (progn
922 (require 'calc-stat)
923 (let ((calc-hyperbolic-flag t))
924 (call-interactively 'calc-vector-geometric-mean)))
925 :keys "H u G"
926 :active (>= (calc-stack-size) 1)]
927 ;; ["RMS(1:)"
928 ;; (progn (require 'calc-arith)
929 ;; (call-interactively 'calc-abs))
930 ;; :keys "A"
931 ;; :active (>= (calc-stack-size) 1)
932 ;; :help "The root-mean-square, or quadratic mean"]
933 )
934 ["Abbreviate long vectors"
935 (progn
936 (require 'calc-mode)
937 (call-interactively 'calc-full-vectors))
938 :keys "v ."
939 :style toggle
940 :selected (not calc-full-vectors)]
941 "----"
942 ["Help on Matrices/Vectors"
943 (calc-info-goto-node "Matrix Functions")])
944 "Menu for Calc's vector and matrix functions.")
945
946 (defvar calc-units-menu
947 (list "Units"
948 ["Convert units in (1:)"
949 (progn
950 (require 'calc-units)
951 (call-interactively 'calc-convert-units ))
952 :keys "u c"
953 :active (>= (calc-stack-size) 1)]
954 ["Convert temperature in (1:)"
955 (progn
956 (require 'calc-units)
957 (call-interactively 'calc-convert-temperature))
958 :keys "u t"
959 :active (>= (calc-stack-size) 1)]
960 ["Simplify units in (1:)"
961 (progn
962 (require 'calc-units)
963 (call-interactively 'calc-simplify-units))
964 :keys "u s"
965 :active (>= (calc-stack-size) 1)]
966 ["View units table"
967 (progn
968 (require 'calc-units)
969 (call-interactively 'calc-view-units-table))
970 :keys "u V"]
971 (list "Logarithmic Units"
972 ["Convert (1:) to dB (power)"
973 (progn
974 (require 'calc-units)
975 (call-interactively 'calc-db))
976 :keys "l d"
977 :active (>= (calc-stack-size) 1)]
978 ["Convert (2:) to dB (power) with reference level (1:)"
979 (progn
980 (require 'calc-units)
981 (let ((calc-option-flag t))
982 (call-interactively 'calc-db)))
983 :keys "O l d"
984 :active (>= (calc-stack-size) 2)]
985 ["Convert (1:) to Np (power)"
986 (progn
987 (require 'calc-units)
988 (call-interactively 'calc-np))
989 :keys "l n"
990 :active (>= (calc-stack-size) 1)]
991 ["Convert (2:) to Np (power) with reference level (1:)"
992 (progn
993 (require 'calc-units)
994 (let ((calc-option-flag t))
995 (call-interactively 'calc-np)))
996 :keys "O l n"
997 :active (>= (calc-stack-size) 2)]
998 ["Convert (1:) to power quantity"
999 (progn
1000 (require 'calc-units)
1001 (call-interactively 'calc-lu-quant))
1002 :keys "l q"
1003 :active (>= (calc-stack-size) 1)]
1004 ["Convert (2:) to power quantity with reference level (1:)"
1005 (progn
1006 (require 'calc-units)
1007 (let ((calc-option-flag t))
1008 (call-interactively 'calc-lu-quant)))
1009 :keys "O l q"
1010 :active (>= (calc-stack-size) 2)]
1011 "----"
1012 ["Convert (1:) to dB (field)"
1013 (progn
1014 (require 'calc-units)
1015 (let ((calc-hyperbolic-flag t))
1016 (call-interactively 'calc-db)))
1017 :keys "H l d"
1018 :active (>= (calc-stack-size) 1)]
1019 ["Convert (2:) to dB (field) with reference level (1:)"
1020 (progn
1021 (require 'calc-units)
1022 (let ((calc-option-flag t)
1023 (calc-hyperbolic-flag t))
1024 (call-interactively 'calc-db)))
1025 :keys "O H l d"
1026 :active (>= (calc-stack-size) 2)]
1027 ["Convert (1:) to Np (field)"
1028 (progn
1029 (require 'calc-units)
1030 (let ((calc-hyperbolic-flag t))
1031 (call-interactively 'calc-np)))
1032 :keys "H l n"
1033 :active (>= (calc-stack-size) 1)]
1034 ["Convert (2:) to Np (field) with reference level (1:)"
1035 (progn
1036 (require 'calc-units)
1037 (let ((calc-option-flag t)
1038 (calc-hyperbolic-flag t))
1039 (call-interactively 'calc-np)))
1040 :keys "O H l d"
1041 :active (>= (calc-stack-size) 2)]
1042 ["Convert (1:) to field quantity"
1043 (progn
1044 (require 'calc-units)
1045 (let ((calc-hyperbolic-flag t))
1046 (call-interactively 'calc-lu-quant)))
1047 :keys "H l q"
1048 :active (>= (calc-stack-size) 1)]
1049 ["Convert (2:) to field quantity with reference level (1:)"
1050 (progn
1051 (require 'calc-units)
1052 (let ((calc-option-flag t)
1053 (calc-hyperbolic-flag))
1054 (call-interactively 'calc-lu-quant)))
1055 :keys "O H l q"
1056 :active (>= (calc-stack-size) 2)])
1057 (list "Musical Notes"
1058 ["Convert (1:) to scientific pitch notation"
1059 (progn
1060 (require 'calc-units)
1061 (call-interactively 'calc-spn))
1062 :keys "l s"
1063 :active (>= (calc-stack-size) 1)]
1064 ["Convert (1:) to midi number"
1065 (progn
1066 (require 'calc-units)
1067 (call-interactively 'calc-midi))
1068 :keys "l m"
1069 :active (>= (calc-stack-size) 1)]
1070 ["Convert (1:) to frequency"
1071 (progn
1072 (require 'calc-units)
1073 (call-interactively 'calc-freq))
1074 :keys "l f"
1075 :active (>= (calc-stack-size) 1)])
1076 "----"
1077 ["Help on Units"
1078 (calc-info-goto-node "Units")])
1079 "Menu for Calc's units functions.")
1080
1081 (defvar calc-variables-menu
1082 (list "Variables"
1083 ["Store (1:) into a variable"
1084 (progn
1085 (require 'calc-store)
1086 (call-interactively 'calc-store))
1087 :keys "s s"
1088 :active (>= (calc-stack-size) 1)]
1089 ["Recall a variable value"
1090 (progn
1091 (require 'calc-store)
1092 (call-interactively 'calc-recall ))
1093 :keys "s r"]
1094 ["Edit the value of a variable"
1095 (progn
1096 (require 'calc-store)
1097 (call-interactively 'calc-edit-variable))
1098 :keys "s e"]
1099 ["Exchange (1:) with a variable value"
1100 (progn
1101 (require 'calc-store)
1102 (call-interactively 'calc-store-exchange))
1103 :keys "s x"
1104 :active (>= (calc-stack-size) 1)]
1105 ["Clear variable value"
1106 (progn
1107 (require 'calc-store)
1108 (call-interactively 'calc-unstore))
1109 :keys "s u"]
1110 ["Evaluate variables in (1:)"
1111 (progn
1112 (require 'calc-ext)
1113 (call-interactively 'calc-evaluate))
1114 :keys "="
1115 :active (>= (calc-stack-size) 1)]
1116 ["Evaluate (1:), assigning a value to a variable"
1117 (progn
1118 (require 'calc-store)
1119 (call-interactively 'calc-let))
1120 :keys "s l"
1121 :active (>= (calc-stack-size) 1)
1122 :help "Evaluate (1:) under a temporary assignment of a variable"]
1123 "----"
1124 ["Help on Variables"
1125 (calc-info-goto-node "Store and Recall")])
1126 "Menu for Calc's variables.")
1127
1128 (defvar calc-stack-menu
1129 (list "Stack"
1130 ["Remove (1:)"
1131 calc-pop
1132 :keys "DEL"
1133 :active (>= (calc-stack-size) 1)]
1134 ["Switch (1:) and (2:)"
1135 calc-roll-down
1136 :keys "TAB"
1137 :active (>= (calc-stack-size) 2)]
1138 ["Duplicate (1:)"
1139 calc-enter
1140 :keys "RET"
1141 :active (>= (calc-stack-size) 1)]
1142 ["Edit (1:)"
1143 (progn
1144 (require 'calc-yank)
1145 (call-interactively calc-edit))
1146 :keys "`"
1147 :active (>= (calc-stack-size) 1)]
1148 "----"
1149 ["Help on Stack"
1150 (calc-info-goto-node "Stack and Trail")])
1151 "Menu for Calc's stack functions.")
1152
1153 (defvar calc-errors-menu
1154 (list "Undo"
1155 ["Undo"
1156 (progn
1157 (require 'calc-undo)
1158 (call-interactively 'calc-undo))
1159 :keys "U"]
1160 ["Redo"
1161 (progn
1162 (require 'calc-undo)
1163 (call-interactively 'calc-redo))
1164 :keys "D"]
1165 "----"
1166 ["Help on Undo"
1167 (progn
1168 (calc-info-goto-node "Introduction")
1169 (Info-goto-node "Undo"))]))
1170
1171 (defvar calc-modes-menu
1172 (list "Modes"
1173 ["Precision"
1174 (progn
1175 (require 'calc-ext)
1176 (call-interactively 'calc-precision))
1177 :keys "p"
1178 :help "Set the precision for floating point calculations"]
1179 ["Fraction mode"
1180 (progn
1181 (require 'calc-frac)
1182 (call-interactively 'calc-frac-mode))
1183 :keys "m f"
1184 :style toggle
1185 :selected calc-prefer-frac
1186 :help "Leave integer quotients as fractions"]
1187 ["Symbolic mode"
1188 (lambda ()
1189 (interactive)
1190 (require 'calc-mode)
1191 (calc-symbolic-mode nil))
1192 :keys "m s"
1193 :style toggle
1194 :selected calc-symbolic-mode
1195 :help "Leave functions producing inexact answers in symbolic form"]
1196 ["Infinite mode"
1197 (lambda ()
1198 (interactive)
1199 (require 'calc-mode)
1200 (calc-infinite-mode nil))
1201 :keys "m i"
1202 :style toggle
1203 :selected calc-infinite-mode
1204 :help "Let expressions like 1/0 produce infinite results"]
1205 ["Abbreviate long vectors"
1206 (progn
1207 (require 'calc-mode)
1208 (call-interactively 'calc-full-vectors))
1209 :keys "v ."
1210 :style toggle
1211 :selected (not calc-full-vectors)]
1212 (list "Simplification"
1213 ["No simplification mode"
1214 (progn
1215 (require 'calc-mode)
1216 (calc-no-simplify-mode t))
1217 :keys "m O"
1218 :style radio
1219 :selected (eq calc-simplify-mode 'none)
1220 :help "No simplifications are done automatically"]
1221 ["Numeric simplification mode"
1222 (progn
1223 (require 'calc-mode)
1224 (calc-num-simplify-mode t))
1225 :keys "m N"
1226 :style radio
1227 :selected (eq calc-simplify-mode 'num)
1228 :help "Only numeric simplifications are done automatically"]
1229 ["Basic simplification mode"
1230 (progn
1231 (require 'calc-mode)
1232 (calc-basic-simplify-mode t))
1233 :keys "m I"
1234 :style radio
1235 :selected (eq calc-simplify-mode nil)
1236 :help "Only basic simplifications are done automatically"]
1237 ["Binary simplification mode"
1238 (progn
1239 (require 'calc-mode)
1240 (calc-bin-simplify-mode t))
1241 :keys "m B"
1242 :style radio
1243 :selected (eq calc-simplify-mode 'binary)
1244 :help "Basic simplifications with binary clipping are done automatically"]
1245 ["Algebraic simplification mode"
1246 (progn
1247 (require 'calc-mode)
1248 (calc-alg-simplify-mode t))
1249 :keys "m A"
1250 :style radio
1251 :selected (eq calc-simplify-mode 'alg)
1252 :help "Standard algebraic simplifications are done automatically"]
1253 ["Extended simplification mode"
1254 (progn
1255 (require 'calc-mode)
1256 (calc-ext-simplify-mode t))
1257 :keys "m E"
1258 :style radio
1259 :selected (eq calc-simplify-mode 'ext)
1260 :help "Extended (unsafe) simplifications are done automatically"]
1261 ["Units simplification mode"
1262 (progn
1263 (require 'calc-mode)
1264 (calc-units-simplify-mode t))
1265 :keys "m U"
1266 :style radio
1267 :selected (eq calc-simplify-mode 'units)
1268 :help "Algebraic and unit simplifications are done automatically"])
1269 (list "Angle Measure"
1270 ["Radians"
1271 (progn
1272 (require 'calc-math)
1273 (call-interactively 'calc-radians-mode))
1274 :keys "m r"
1275 :style radio
1276 :selected (eq calc-angle-mode 'rad)]
1277 ["Degrees"
1278 (progn
1279 (require 'calc-math)
1280 (call-interactively 'calc-degrees-mode))
1281 :keys "m d"
1282 :style radio
1283 :selected (eq calc-angle-mode 'deg)]
1284 ["HMS"
1285 (progn
1286 (require 'calc-math)
1287 (call-interactively 'calc-hms-mode))
1288 :keys "m h"
1289 :style radio
1290 :selected (eq calc-angle-mode 'hms)])
1291 (list "Radix"
1292 ["Decimal"
1293 (progn
1294 (require 'calc-bin)
1295 (call-interactively 'calc-decimal-radix))
1296 :keys "d 0"
1297 :style radio
1298 :selected (and (= calc-number-radix 10)
1299 (not calc-twos-complement-mode))]
1300 ["Binary"
1301 (progn
1302 (require 'calc-bin)
1303 (call-interactively 'calc-binary-radix))
1304 :keys "d 2"
1305 :style radio
1306 :selected (and (= calc-number-radix 2)
1307 (not calc-twos-complement-mode))]
1308 ["Octal"
1309 (progn
1310 (require 'calc-bin)
1311 (call-interactively 'calc-octal-radix))
1312 :keys "d 8"
1313 :style radio
1314 :selected (and (= calc-number-radix 8)
1315 (not calc-twos-complement-mode))]
1316 ["Hexadecimal"
1317 (progn
1318 (require 'calc-bin)
1319 (call-interactively 'calc-hex-radix))
1320 :keys "d 6"
1321 :style radio
1322 :selected (and (= calc-number-radix 16)
1323 (not calc-twos-complement-mode))]
1324 ["Other"
1325 (progn
1326 (require 'calc-bin)
1327 (call-interactively 'calc-radix))
1328 :keys "d r"
1329 :style radio
1330 :selected (and
1331 (not calc-twos-complement-mode)
1332 (not
1333 (or
1334 (= calc-number-radix 10)
1335 (= calc-number-radix 2)
1336 (= calc-number-radix 8)
1337 (= calc-number-radix 16))))]
1338 ["--Two's Complement--"
1339 (lambda () ())
1340 :style radio
1341 :selected nil]
1342 ["Binary"
1343 (progn
1344 (require 'calc-bin)
1345 (call-interactively
1346 (lambda () (interactive) (calc-binary-radix t))))
1347 :keys "C-u d 2"
1348 :style radio
1349 :selected (and (= calc-number-radix 2)
1350 calc-twos-complement-mode)]
1351 ["Octal"
1352 (progn
1353 (require 'calc-bin)
1354 (call-interactively
1355 (lambda () (interactive) (calc-octal-radix t))))
1356 :keys "C-u d 8"
1357 :style radio
1358 :selected (and (= calc-number-radix 8)
1359 calc-twos-complement-mode)]
1360 ["Hexadecimal"
1361 (progn
1362 (require 'calc-bin)
1363 (call-interactively
1364 (lambda () (interactive) (calc-hex-radix t))))
1365 :keys "C-u d 6"
1366 :style radio
1367 :selected (and (= calc-number-radix 16)
1368 calc-twos-complement-mode)])
1369 (list "Float Format"
1370 ["Normal"
1371 (progn
1372 (require 'calc-mode)
1373 (call-interactively 'calc-normal-notation))
1374 :keys "d n"
1375 :style radio
1376 :selected (eq (car-safe calc-float-format) 'float)]
1377 ["Fixed point"
1378 (progn
1379 (require 'calc-mode)
1380 (call-interactively 'calc-fix-notation))
1381 :keys "d f"
1382 :style radio
1383 :selected (eq (car-safe calc-float-format) 'fix)]
1384 ["Scientific notation"
1385 (progn
1386 (require 'calc-mode)
1387 (call-interactively 'calc-sci-notation))
1388 :keys "d s"
1389 :style radio
1390 :selected (eq (car-safe calc-float-format) 'sci)]
1391 ["Engineering notation"
1392 (progn
1393 (require 'calc-mode)
1394 (call-interactively 'calc-eng-notation))
1395 :keys "d e"
1396 :style radio
1397 :selected (eq (car-safe calc-float-format) 'eng)])
1398 (list "Complex Format"
1399 ["Default"
1400 (progn
1401 (require 'calc-cplx)
1402 (calc-complex-notation))
1403 :style radio
1404 :selected (not calc-complex-format)
1405 :keys "d c"
1406 :help "Display complex numbers as ordered pairs."]
1407 ["i notation"
1408 (progn
1409 (require 'calc-cplx)
1410 (calc-i-notation))
1411 :style radio
1412 :selected (eq calc-complex-format 'i)
1413 :keys "d i"
1414 :help "Display complex numbers as a+bi."]
1415 ["j notation"
1416 (progn
1417 (require 'calc-cplx)
1418 (calc-i-notation))
1419 :style radio
1420 :selected (eq calc-complex-format 'j)
1421 :keys "d j"
1422 :help "Display complex numbers as a+bj."]
1423 ["Other"
1424 (calc-complex-notation)
1425 :style radio
1426 :selected (and calc-complex-format
1427 (not (eq calc-complex-format 'i))
1428 (not (eq calc-complex-format 'j)))
1429 :active nil]
1430 "----"
1431 ["Polar mode"
1432 (progn
1433 (require 'calc-cplx)
1434 (calc-polar-mode nil))
1435 :style toggle
1436 :selected (eq calc-complex-mode 'polar)
1437 :keys "m p"
1438 :help "Prefer polar form for complex numbers."])
1439 (list "Algebraic"
1440 ["Normal"
1441 (progn
1442 (require 'calc-mode)
1443 (cond
1444 (calc-incomplete-algebraic-mode
1445 (calc-algebraic-mode t))
1446 (calc-algebraic-mode
1447 (calc-algebraic-mode nil))))
1448 :style radio
1449 :selected (not calc-algebraic-mode)]
1450 ["Algebraic mode"
1451 (progn
1452 (require 'calc-mode)
1453 (if (or
1454 calc-incomplete-algebraic-mode
1455 (not calc-algebraic-mode))
1456 (calc-algebraic-mode nil)))
1457 :keys "m a"
1458 :style radio
1459 :selected (and calc-algebraic-mode
1460 (not calc-incomplete-algebraic-mode))
1461 :help "Keys which start numeric entry also start algebraic entry"]
1462 ["Incomplete algebraic mode"
1463 (progn
1464 (require 'calc-mode)
1465 (unless calc-incomplete-algebraic-mode
1466 (calc-algebraic-mode t)))
1467 :keys "C-u m a"
1468 :style radio
1469 :selected calc-incomplete-algebraic-mode
1470 :help "Only ( and [ begin algebraic entry"]
1471 ["Total algebraic mode"
1472 (progn
1473 (require 'calc-mode)
1474 (unless (eq calc-algebraic-mode 'total)
1475 (calc-total-algebraic-mode nil)))
1476 :keys "m t"
1477 :style radio
1478 :selected (eq calc-algebraic-mode 'total)
1479 :help "All regular letters and punctuation begin algebraic entry"])
1480 (list "Matrix"
1481 ["Off"
1482 (progn
1483 (require 'calc-mode)
1484 (calc-matrix-mode -1))
1485 :style radio
1486 :selected (eq calc-matrix-mode nil)
1487 :help "Variables are not assumed to be matrix or scalar"]
1488 ["Matrix mode"
1489 (progn
1490 (require 'calc-mode)
1491 (calc-matrix-mode -2))
1492 :style radio
1493 :selected (eq calc-matrix-mode 'matrix)
1494 :help "Variables are assumed to be matrices"]
1495 ["Square matrix mode"
1496 (progn
1497 (require 'calc-mode)
1498 (calc-matrix-mode '(4)))
1499 :style radio
1500 :selected (eq calc-matrix-mode 'sqmatrix)
1501 :help "Variables are assumed to be square matrices"]
1502 ["Dimensioned matrix mode"
1503 (let ((dim (string-to-number (read-from-minibuffer "Dimension: "))))
1504 (if (natnump dim)
1505 (progn
1506 (require 'calc-mode)
1507 (calc-matrix-mode dim))
1508 (error "The dimension must be a positive integer")))
1509 :style radio
1510 :selected (and (integerp calc-matrix-mode) (> calc-matrix-mode 0))
1511 :help "Variables are assumed to be NxN matrices"]
1512 ["Scalar mode"
1513 (progn
1514 (require 'calc-mode)
1515 (calc-matrix-mode 0))
1516 :style radio
1517 :selected (eq calc-matrix-mode 'scalar)
1518 :help "Variables are assumed to be scalars"])
1519 (list "Language"
1520 ["Normal"
1521 (progn
1522 (require 'calc-lang)
1523 (call-interactively 'calc-normal-language))
1524 :keys "d N"
1525 :style radio
1526 :selected (eq calc-language nil)]
1527 ["Big"
1528 (progn
1529 (require 'calc-lang)
1530 (call-interactively 'calc-big-language))
1531 :keys "d B"
1532 :style radio
1533 :selected (eq calc-language 'big)
1534 :help "Use textual approximations to various mathematical notations"]
1535 ["Flat"
1536 (progn
1537 (require 'calc-lang)
1538 (call-interactively 'calc-flat-language))
1539 :keys "d O"
1540 :style radio
1541 :selected (eq calc-language 'flat)
1542 :help "Write matrices on a single line"]
1543 ["C"
1544 (progn
1545 (require 'calc-lang)
1546 (call-interactively 'calc-c-language))
1547 :keys "d C"
1548 :style radio
1549 :selected (eq calc-language 'c)]
1550 ["Pascal"
1551 (progn
1552 (require 'calc-lang)
1553 (call-interactively 'calc-pascal-language))
1554 :keys "d P"
1555 :style radio
1556 :selected (eq calc-language 'pascal)]
1557 ["Fortran"
1558 (progn
1559 (require 'calc-lang)
1560 (call-interactively 'calc-fortran-language))
1561 :keys "d F"
1562 :style radio
1563 :selected (eq calc-language 'fortran)]
1564 ["TeX"
1565 (progn
1566 (require 'calc-lang)
1567 (call-interactively 'calc-tex-language))
1568 :keys "d T"
1569 :style radio
1570 :selected (eq calc-language 'tex)]
1571 ["LaTeX"
1572 (progn
1573 (require 'calc-lang)
1574 (call-interactively 'calc-latex-language))
1575 :keys "d L"
1576 :style radio
1577 :selected (eq calc-language 'latex)]
1578 ["Eqn"
1579 (progn
1580 (require 'calc-lang)
1581 (call-interactively 'calc-eqn-language))
1582 :keys "d E"
1583 :style radio
1584 :selected (eq calc-language 'eqn)]
1585 ["Yacas"
1586 (progn
1587 (require 'calc-lang)
1588 (call-interactively 'calc-yacas-language))
1589 :keys "d Y"
1590 :style radio
1591 :selected (eq calc-language 'yacas)]
1592 ["Maxima"
1593 (progn
1594 (require 'calc-lang)
1595 (call-interactively 'calc-maxima-language))
1596 :keys "d X"
1597 :style radio
1598 :selected (eq calc-language 'maxima)]
1599 ["Giac"
1600 (progn
1601 (require 'calc-lang)
1602 (call-interactively 'calc-giac-language))
1603 :keys "d A"
1604 :style radio
1605 :selected (eq calc-language 'giac)]
1606 ["Mma"
1607 (progn
1608 (require 'calc-lang)
1609 (call-interactively 'calc-mathematica-language))
1610 :keys "d M"
1611 :style radio
1612 :selected (eq calc-language 'math)]
1613 ["Maple"
1614 (progn
1615 (require 'calc-lang)
1616 (call-interactively 'calc-maple-language))
1617 :keys "d W"
1618 :style radio
1619 :selected (eq calc-language 'maple)])
1620 "----"
1621 ["Save mode settings" calc-save-modes :keys "m m"]
1622 "----"
1623 ["Help on Modes"
1624 (calc-info-goto-node "Mode settings")])
1625 "Menu for Calc's mode settings.")
1626
1627 (defvar calc-help-menu
1628 (list "Help"
1629 ["Manual"
1630 calc-info
1631 :keys "h i"]
1632 ["Tutorial"
1633 calc-tutorial
1634 :keys "h t"]
1635 ["Summary"
1636 calc-info-summary
1637 :keys "h s"]
1638 "----"
1639 ["Help on Help"
1640 (progn
1641 (calc-info-goto-node "Introduction")
1642 (Info-goto-node "Help Commands"))])
1643 "Menu for Calc's help functions.")
1644
1645 ;; Needed to make this file loadable in isolation.
1646 ;; Another option would be to use calc-load-hook.
1647 (require 'calc)
1648
1649 (easy-menu-define
1650 calc-menu
1651 calc-mode-map
1652 "Menu for Calc."
1653 (list "Calc"
1654 :visible '(eq major-mode 'calc-mode)
1655 calc-arithmetic-menu
1656 calc-scientific-function-menu
1657 calc-algebra-menu
1658 calc-graphics-menu
1659 calc-vectors-menu
1660 calc-units-menu
1661 calc-variables-menu
1662 calc-stack-menu
1663 calc-errors-menu
1664 calc-modes-menu
1665 calc-help-menu
1666 ["Reset"
1667 (progn
1668 (require 'calc-ext)
1669 (call-interactively 'calc-reset))
1670 :help "Reset Calc to its initial state"]
1671 ["Quit" calc-quit]))
1672
1673 (provide 'calc-menu)