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