diff options
Diffstat (limited to 'graphics/epix/epix.el.in')
-rw-r--r-- | graphics/epix/epix.el.in | 1068 |
1 files changed, 0 insertions, 1068 deletions
diff --git a/graphics/epix/epix.el.in b/graphics/epix/epix.el.in deleted file mode 100644 index 19d69c2155..0000000000 --- a/graphics/epix/epix.el.in +++ /dev/null @@ -1,1068 +0,0 @@ -;;; epix.el --- A major mode for working with ePiX files. - -;; Copyright (C) 2002, 2007 Jay Belanger - -;; Author: Jay Belanger -;; Maintainer: Jay Belanger <belanger@truman.edu> - -;; Keywords: epix - -;; This program is free software; you can redistribute it and/or -;; modify it under the terms of the GNU General Public License as -;; published by the Free Software Foundation; either version 2 of -;; the License, or (at your option) any later version. -;; -;; This program is distributed in the hope that it will be -;; useful, but WITHOUT ANY WARRANTY; without even the implied -;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -;; PURPOSE. See the GNU General Public License for more details. -;; -;; You should have received a copy of the GNU General Public -;; License along with this program; if not, write to the Free -;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, -;; MA 02111-1307 USA -;; -;; -;; Please send suggestions and bug reports to <belanger@truman.edu>. - -;;; Commentary: - -;; Quick intro - -;; epix-mode is an extension of c++-mode with some extra commands for -;; editing ePiX files. The commands are -;; C-cC-x run epix on the current file (x for epiX, I guess) -;; C-cC-l run elaps on the current file (l for eLaps) -;; The output of the run can be seen by -;; C-cC-r show the output buffer (r for Results) -;; and in case of errors, they can be jumped to, in sequence, with -;; C-c` go to the next error -;; The file created by elaps can be viewed with -;; C-cC-v view the output file (v for View) -;; By default, the output will be encapsulated postscript. This -;; can be changed by changing the customizable variable -;; `epix-elaps-output-format'. This can be changed for the current -;; emacs session with `C-cC-r'. -;; An unwanted ePiX process can be killed with -;; C-cC-k -;; A reminder of some ePiX commands will be given with -;; C-cC-h get help on ePiX -;; If the file extension is .flx, then there will also be the commands -;; C-cC-f run flix on the current file -;; C-cC-w view the mng file. -;; -;; To install, put both epix.el and epix.info in the emacs load path. -;; Adding the lines -;; (autoload 'epix-mode "epix" "ePiX editing mode" t) -;; (autoload 'flix-mode "epix" "flix editing mode" t) -;; to your .emacs file will ensure that the command is always available. -;; Adding the lines -;; (setq auto-mode-alist (cons '("\\.xp" . epix-mode) auto-mode-alist)) -;; (setq auto-mode-alist (cons '("\\.flx" . flix-mode) auto-mode-alist)) -;; will ensure that any file ending in .xp or .flx will be recognized as -;; an ePiX file or flix file, and started in the proper mode. -;; -;; Some variables that the user may wish to change (via customization -;; or otherwise) are -;; epix-postscript-viewer (default "gv") -;; The command used to view postscript files. -;; epix-mng-viewer (default "display") -;; The command used to view mng files. -;; epix-mark-files-as-epix (default nil) -;; Setting this to t will ensure that any file in ePiX mode -;; will be marked with a /* -*-ePiX-* */ so that next -;; time it is opened, it will be put in epix-mode. (This isn't necessary -;; if auto-mode-alist is set up properly.) -;; epix-mark-files-as-flix (default nil) -;; Setting this to t will ensure that any file in flix mode -;; will be marked with a /* -*-flix-* */ so that next -;; time it is opened, it will be put in flix-mode. (This isn't necessary -;; if auto-mode-alist is set up properly.) -;; epix-insert-template-in-empty-buffer (default nil) -;; Setting this to t will cause any empty buffer which is put in -;; ePiX mode to have a skeleton of commands inserted into it. -;; The skeleton can be inserted at any time with the command -;; epix-insert-template -;; epix-template -;; This is the skeleton which will inserted. -;; By default, it is -;; #include \"epix.h\" -;; using namespace ePiX; -;; -;; int main() -;; { -;; picture(P(,), P(,), \"\"); -;; -;; begin(); -;; -;; end(); -;; } -;; -;; epix-flix-template -;; This is the skeleton which will inserted. -;; By default, it is -;; #include \"epix.h\" -;; using namespace ePiX; -;; -;; int main(int argc, char* argv[]) -;; { -;; if (argc == 3) -;; { -;; char* arg; -;; double temp1, temp2; -;; temp1=strtod(argv[1], &arg); -;; temp2=strtod(argv[2], &arg); -;; -;; tix()=temp1/temp2; -;; } -;; picture(P(,), P(,), \"\"); -;; -;; begin(); -;; -;; end(); -;; } - -;;; Require -(require 'cc-mode) - -;;; Customization - -(defgroup epix nil - "ePiX mode" - :prefix "epix-" - :tag "ePiX") - -(defcustom epix-elaps-output-format 'eps - "The output format for elaps." - :group 'epix - :type '(choice (const :tag "EPS" eps) - (const :tag "PS" ps) - (const :tag "PDF" pdf))) - -(defcustom epix-info-file "@docdir@/epix.info.bz2" - "The info file for ePiX." - :group 'epix - :type 'file) - -(defcustom epix-mark-files-as-epix nil - "Non-nil means to make sure that any ePiX file is marked as such." - :group 'epix - :type 'boolean) - -(defcustom epix-mark-files-as-flix nil - "Non-nil means to make sure that any flix file is marked as such." - :group 'epix - :type 'boolean) - -(defcustom epix-template -"#include \"epix.h\" -using namespace ePiX; - -int main() -{ -picture(P(,), P(,), \"\"); - -begin(); - -end(); -} -" - "The information to enter into an empty ePiX buffer." - :group 'epix - :type 'string) - -(defcustom epix-template-start "P(" - "The place to start the point in the template." - :group 'epix - :type 'string) - -(defcustom epix-flix-template -"#include \"epix.h\" -using namespace ePiX; - -int main(int argc, char* argv[]) -{ - if (argc == 3) - { - char* arg; - double temp1(strtod(argv[1], &arg)), temp2(strtod(argv[2], &arg)); - - tix()=temp1/temp2; - } -picture(P(,), P(,), \"\"); - -begin(); - -end(); -} -" - "The information to enter into an empty ePiX buffer." - :group 'epix - :type 'string) - -(defcustom epix-flix-template-start "P(" - "The place to start the point in the template." - :group 'epix - :type 'string) - -(defcustom epix-insert-template-in-empty-buffer nil - "Non-nil means to insert the template into an empty ePiX buffer." - :group 'epix - :type 'boolean) - -(defcustom epix-command-name "epix" - "The name of the ePiX program." - :group 'epix - :type 'string) - -(defcustom epix-command-args "" - "Arguments to pass to epix" - :group 'epix - :type 'string) - -(defcustom epix-elaps-command-name "elaps" - "The name of the elaps program." - :group 'epix - :type 'string) - -(defcustom epix-elaps-command-args "" - "Arguments to pass to elaps" - :group 'epix - :type 'string) - -(defcustom epix-flix-command-name "flix" - "The name of the flix program." - :group 'epix - :type 'string) - -(defcustom epix-flix-command-args "" - "Arguments to pass to flix" - :group 'epix - :type 'string) - -(defcustom epix-postscript-viewer "gv" - "The name of the program used to view postscript files." - :group 'epix - :type 'string) - -(defcustom epix-pdf-viewer "xpdf" - "The name of the program used to view pdf files." - :group 'epix - :type 'string) - -(defcustom epix-mng-viewer "display" - "The name of the program used to view mng files." - :group 'epix - :type 'string) - -;;; Some utility variables - -(defvar epix-output-buffer nil) -(make-variable-buffer-local 'epix-output-buffer) - -(defvar epix-error-point nil) -(make-variable-buffer-local 'epix-error-point) - -(defvar epix-elaps-output-format-list - '((ps " -ps" ".ps") - (pdf " -pdf" ".pdf") - (eps "" ".eps"))) - -(defun epix-change-elaps-output-format () - "Change the output format for elaps." - (interactive) - (let ((newformat - (read-string - "New output format (ps,eps,pdf): "))) - (cond - ((string= newformat "pdf") - (setq epix-elaps-output-format 'pdf)) - ((string= newformat "ps") - (setq epix-elaps-output-format 'ps)) - ((string= newformat "eps") - (setq epix-elaps-output-format 'eps)) - (t - (message "Not an acceptable format."))))) - -;;; Functions to run epix and friends - -(defun epix-check-process () - "See if there is a process associated with the output buffer. -If there is and it is running, offer to kill it." - (let ((epp) - (epix-proc (get-buffer-process epix-output-buffer))) - (if epix-proc (setq epp t) (setq epp nil)) - (if (and - epix-proc - (y-or-n-p "There is an ePiX process running. Kill it? ")) - (progn - (kill-process epix-proc) - (setq epp nil))) - epp)) - -(defun epix-kill-process () - "Kill any epix process running." - (interactive) - (let ((epix-proc (get-buffer-process epix-output-buffer))) - (if (and - epix-proc - (y-or-n-p "Really kill ePiX process? ")) - (kill-process epix-proc)))) - - -(defun epix-check-buffer () - "See if the buffer has been modified since it was last saved. -If it has been, offer to save it." - (if (and - (buffer-modified-p) - (y-or-n-p (concat "Save file " (buffer-file-name) "?"))) - (save-buffer))) - -(defun epix-run-command (command file &optional args) - "Create a process to run COMMAND on FILE. -Return the new process." - (let ((buffer epix-output-buffer)) - (epix-check-buffer) - (unless (epix-check-process) - (set-buffer (get-buffer-create buffer)) - (setq epix-error-point nil) - (erase-buffer) - (insert "Running `" command "' on `" file "\n") - (message "Type `C-c C-r' to display results of compilation.") - (let ((process) - (cmd)) - (if (not (string= args "")) - (setq cmd - (append - (list 'start-process "ePiX" buffer "/bin/sh" command) - (split-string args) - (list file))) - (setq cmd (list 'start-process "ePiX" buffer "/bin/sh" command file))) - (setq process (eval cmd)) - (set-process-filter process 'epix-command-filter) - (set-process-sentinel process 'epix-command-sentinel) - (set-marker (process-mark process) (point-max)) - process)))) - -(defun epix-command-sentinel (process event) - (when (string-match "finished" event) - (message "ePiX process finished") - (set-buffer epix-output-buffer) - (goto-char (point-max)) - (insert "\nePiX process finished\n"))) - -(defun epix-command-filter (process string) - "Filter to process normal output." - (save-excursion - (set-buffer (process-buffer process)) - (save-excursion - (goto-char (process-mark process)) - (insert-before-markers string) - (set-marker (process-mark process) (point)))) - (if (string-match "Compilation failed" string) - (message (concat "ePiX errors in `" (buffer-name) - "'. Use C-c ` to display.")))) -(defun epix-run-epix () - "Run epix on the current file." - (interactive) - (let ((file (file-name-nondirectory (buffer-file-name)))) - (epix-run-command epix-command-name file epix-command-args))) - -(defun epix-run-elaps () - "Run elaps on the current file." - (interactive) - (let ((file (file-name-nondirectory (buffer-file-name)))) - (epix-run-command epix-elaps-command-name file - (concat - epix-elaps-command-args - (nth 1 (assoc epix-elaps-output-format - epix-elaps-output-format-list)))))) - -(defun epix-run-flix () - "Run flix on the current file." - (interactive) - (let ((file (file-name-nondirectory (buffer-file-name)))) - (epix-run-command epix-flix-command-name file epix-flix-command-args))) - -(defun epix-view-elaps-output () - "View the eps output of the file." - (interactive) - (let ((filename (file-name-nondirectory (buffer-file-name))) - (file nil) - (extension (nth 2 (assoc epix-elaps-output-format - epix-elaps-output-format-list)))) - (if (file-name-extension filename) - (setq file (concat (file-name-sans-extension filename) extension))) - (unless (file-exists-p file) - (setq file (concat filename extension))) - (message file) - (if (file-exists-p file) - (call-process - (if (eq epix-elaps-output-format 'pdf) - epix-pdf-viewer - epix-postscript-viewer) - nil epix-output-buffer nil file) - (message (concat "No file " file ". Run elaps first."))))) - -(defun epix-view-mng () - "View the mng output of the file." - (interactive) - (let ((filename (file-name-nondirectory (buffer-file-name))) - (file nil)) - (if (file-name-extension filename) - (setq file (concat (file-name-sans-extension filename) ".mng"))) - (unless (file-exists-p file) - (setq file (concat filename ".mng"))) - (message file) - (if (file-exists-p file) - (call-process epix-mng-viewer nil epix-output-buffer nil file) - (message (concat "No file " file ". Run flix first."))))) - -;;; Dealing with output - -(defun epix-show-output-buffer () - "Show the epix output buffer." - (interactive) - (let ((buf (current-buffer))) - (if (get-buffer epix-output-buffer) - (progn - (pop-to-buffer epix-output-buffer t) - (bury-buffer buf) - (goto-char (point-max)) - (recenter (/ (window-height) 2)) - (pop-to-buffer buf)) - (message "No output buffer.")))) - -(defun epix-find-error (arg) - "Go to the next ePiX error." - (interactive "P") - (if arg - (save-excursion - (set-buffer epix-output-buffer) - (setq epix-error-point nil))) - (let ((ln) - (col) - (epix-error-end) - (buf (current-buffer))) - (switch-to-buffer-other-window epix-output-buffer) - (widen) - (if epix-error-point - (goto-char epix-error-point) - (goto-char (point-min))) - (if (re-search-forward ":\\([0-9]+\\):\\([0-9]+\\):" (point-max) t) - (progn - (setq epix-error-point (point)) - (setq ln (string-to-int (match-string 1))) - (setq col (string-to-int (match-string 2))) - (save-excursion - (if (re-search-forward ":[0-9]+:[0-9]+:" (point-max) t) - (setq epix-error-end (line-beginning-position)) - (if (search-forward "Compilation failed" (point-max) t) - (setq epix-error-end (line-beginning-position)) - (setq epix-error-end (point-max))))) - (recenter) - (beginning-of-line) - (if (looking-at "epix: Compiling...") - (forward-char (length "epix: Compiling..."))) - (narrow-to-region (point) epix-error-end) - (switch-to-buffer-other-window buf) - (goto-line ln) - (move-to-column col)) - (switch-to-buffer-other-window buf) - (message "No more errors.")))) - - -;;; Auxiliary functions - -(defun epix-mark-file-as-epix () - "Mark the file as an ePiX buffer. -The next time the file is loaded, it will then be in ePiX mode" - (interactive) - (save-excursion - (goto-char (point-min)) - (unless (looking-at ".*-\\*-ePiX-\\*-") - (insert "/* -*-ePiX-*- */\n")))) - -(defun epix-mark-file-as-flix () - "Mark the file as a flix buffer. -The next time the file is loaded, it will then be in flix mode" - (interactive) - (save-excursion - (goto-char (point-min)) - (unless (looking-at ".*-\\*-flix-\\*-") - (insert "/* -*-flix-*- */\n")))) - -(defun epix-insert-epix-template () - "Insert a template." - (interactive) - (if (looking-at ".*-\\*-ePiX-\\*-") - (forward-line 1)) - (let ((beg (point))) - (insert epix-template) - (indent-region beg (point) nil) - (goto-char beg) - (search-forward epix-template-start))) - -(defun epix-insert-flix-template () - "Insert a template." - (interactive) - (if (looking-at ".*-\\*-flix-\\*-") - (forward-line 1)) - (let ((beg (point))) - (insert epix-flix-template) - (indent-region beg (point) nil) - (goto-char beg) - (search-forward epix-flix-template-start))) - -(defun epix-help () - "Read an ePiX info file" - (interactive) - (info-other-window epix-info-file)) - -(require 'info-look) -(info-lookup-maybe-add-help - :mode 'epix-mode - :ignore-case nil - :regexp "[_a-zA-Z0-9./+-]+" - :doc-spec (list - (list - (concat "(" - epix-info-file - ")Function Index")))) -; nil -; "^ -+ [^:]+:[ ]+\\(\\[[^=]*=[ ]+\\)?" nil))) - - -;;; To take care of the different types - -(defvar epix-preface -"int[ \t\n]*main()[ \t\n]*{") - -(defvar epix-flix-preface -"int main(int argc, char* argv[]) -{ - if (argc == 3) - { - char* arg; - double temp1(strtod(argv[1], &arg)), temp2(strtod(argv[2], &arg)); - - tix()=temp1/temp2; - }") - -(defun epix-epix-to-flix () - "Change some of the buffer to accomodate flix." - (interactive) - (save-excursion - (goto-char (point-min)) - (replace-regexp "-\\*-ePiX-\\*-" "-*-flix-*-") - (goto-char (point-min)) - (replace-regexp epix-preface epix-flix-preface)) - (flix-mode)) - -;;; ePiX mode - -(defvar epix-mode-map nil - "The keymap for ePiX mode.") - -(if epix-mode-map - nil - (let ((map (copy-keymap c++-mode-map))) - (define-key map "\C-c\C-k" 'epix-kill-process) - (define-key map "\C-c\C-x" 'epix-run-epix) - (define-key map "\C-c\C-l" 'epix-run-elaps) - (define-key map "\C-c\C-r" 'epix-show-output-buffer) - (define-key map "\C-c\C-v" 'epix-view-elaps-output) - (define-key map "\C-c\C-r" 'epix-change-elaps-output-format) - (define-key map "\C-c\C-h" 'epix-help) - (define-key map "\C-c\C-i" 'info-complete-symbol) - (define-key map "\C-c`" 'epix-find-error) - (setq epix-mode-map map))) - -(easy-menu-define epix-mode-menu epix-mode-map - "ePiX mode menu" - '("ePiX" - ["Run ePiX" epix-run-epix t] - ["Run elaps" epix-run-elaps t] - ["View the eps file" epix-view-elaps-output t] - ["Change the output format" epix-change-elaps-output-format t] - ["Get help on ePiX" epix-help t] - ["Show the output buffer" epix-show-output-buffer t])) - -(define-derived-mode epix-mode c++-mode "ePiX" - "ePiX mode is a major mode for editing ePiX files. -It is C++ mode with a couple of extra commands: - -Run epix on the file being visited: C-cC-x -Run elaps on the file being visited: C-cC-l -View the output: C-cC-v -Change the output format: C-cC-r -Get help on ePiX: C-cC-h -Complete the ePiX symbol under point: C-cTAB - -In the case of errors: -Go to the (next) error: C-c` - -SUMMARY OF EPIX COMMANDS ------------------------- - -Preamble --------- -picture(P(a,b), P(c,d), \"height[dim] x width dim\"); - -The actual picture commands need to be between -begin(); -and -end(); - -Colors ------- -RGB(r,g,b); -Red(d); Green(d); Blue(d); Black(d); White(d); - -CMY(c,m,y); -Cyan(d); Magenta(d); Yellow(d); CMY_Black(d); CMY_White(d); - -CMYK(c,m,y,k); -CyanK(d); MagentaK(d); YellowK(d); CMYK_Black(d); CMYK_White(d); - -Primary densities interpolate linearly between anti-saturation (-1), -no color(0), full saturation (1), and saturation on all channels (2 -or -2). Densities are meaningful mod 4. Colors can be superposed, -blended, inverted, filtered, and scaled. - -Line and fill styles ------------ -Widths: plain([Color]); bold([Color]); bbold([Color]); - pen(Color, [len]); pen(len); - base(Color, [len]); base(len); -Styles: solid(); dashed(); dotted(); - line_style(string); -Fill: fill(Color); fill(bool); nofill(); - -The base pen draws an underlayer/border if wider than the line pen. -line_style accepts a WYSIWYG pattern of spaces, dashes, and periods. - -Lines ------ -line(P(a,b),P(c,d)); -Line(P(a,b),P(c,d)); -Line(P(a,b),m); - -The line goes from one point to the other, -the Line is that part of the entire line which lies inside the -bounding box. - -Polygons --------- -triangle(P(a,b),P(c,d),P(e,f)); -rect(P(a,b),P(c,d)); -quad(P(a,b),P(c,d),P(e,f),P(g,h)); - -Axes ----- -h_axis(P(a,b),P(c,d),n); -v_axis(P(a,b),P(c,d),n); -h_log_axis(P(a,b),P(c,d),n); -v_log_axis(P(a,b),P(c,d),n); - -h_axis_labels(P(a,b),P(c,d),n,P(u,v)); -v_axis_labels(P(a,b),P(c,d),n,P(u,v)); -h_log_axis_labels(P(a,b),P(c,d),n,P(u,v)); -v_log_axis_labels(P(a,b),P(c,d),n,P(u,v)); - -h_axis_masklabels(P(a,b),P(c,d),n,P(u,v)); -v_axis_masklabels(P(a,b),P(c,d),n,P(u,v)); -h_log_axis_masklabels(P(a,b),P(c,d),n,P(u,v)); -v_log_axis_masklabels(P(a,b),P(c,d),n,P(u,v)); - -The axis commands will put n+1 evenly spaced tick marks on the line. -The labeling commands will put n+1 evenly spaced labels, -masklabels will put the label on an opaque white rectangle. - -Points ------- -spot(P(a,b)); dot(P(a,b)); ddot(P(a,b)); box(P(a,b)); bbox(P(a,b)); -circ(P(a,b)); -ring(P(a,b)); - -spot, dot and ddot are various sized (in decreasing order) dots. -A circ is a small circle with white interior. -A ring is a small circle with transparent interior. - -Arrows ------- -arrow(P(a,b),P(c,d)); -dart(P(a,b),P(c,d)); - -A dart is a small arrow. - -Labels ------- -label(P(a,b),P(u,v),\"label\"); -label(P(a,b),\"label\"); -label(P(a,b),P(u,v),\"label\",posn); -masklabel(P(a,b),P(u,v),\"label\"); -masklabel(P(a,b),\"label\"); -masklabel(P(a,b),P(u,v),\"label\",posn); - -These commands put a label at the point P(a,b). -P(u,v) is an offset (in true points). -posn will specify the position of the label relative to the basepoint, -and can be c(enter), l(eft), r(ight), t(op), b(ottom) or an -appropriate pair. - -Text attributes ---------------- -label_color(Color); label_mask(Color); label_pad(len); -label_border(Color, [len]); label_border(len); no_label_border(); -font_size(LaTeX size); font_face(face); -label_angle(theta); - -The LaTeX size is a string such as \"Huge\" or \"scriptsize\". The -font face is one of \"rm\" (default), \"bf\", \"sc\", or \"tt\". - -Curves ------- -ellipse(P(a,b),P(c,d),P(e,f),tmin,tmax); -circle(P(a,b),r); -circle(P(a,b),P(c,d),P(e,f)); - -Ellipse draws (a,b)+Cos(t)*(c,d)+Sin(t)*(e,f) for tmin <= t <= tmax. - -Arcs ----- -arc(P(a,b),r,theta1,theta2); -arc_arrow(P(a,b),r,theta1,theta2); - -The angles are measured in current angle units (radians by default). - -Splines -------- -spline(P(a,b),P(c,d),P(e,f)); -spline(P(a,b),P(c,d),P(e,f),P(g,h)); - -Plotting --------- -plot(f,a,b,n); - -This plots the function f from a to b using n+1 evenly spaced points. -If f is P-valued, then this will be a parametric plot. - -Calc plotting -------------- -plot(Deriv(f),a,b,n); -plot(Integral(f),a,b,n); -plot(Integral(f),x0,a,b,n); - -plot(Deriv(f)...) plots f'. -plot(Integral(f)...) plots int_a^x f (or if x0 is given, int_x0^x f). - -Tangents --------- -tan_line(f,t); -envelope(f,t_min,t_max,n); -tan_field(f,t_min,t_max,n); - -tan_line will plot the tangent Line to the graph. -envelope will plot n+1 tangent Lines. -tan_field will plot n+1 tangent vectors. -Here, as above, f can be P-valued. - -Vector fields -------------- -slope_field(F,P(a,b),P(c,d),n1,n2); -dart_field(F,P(a,b),P(c,d),n1,n2); -vector_field(F,P(a,b),P(c,d),n1,n2); - -The slope_field elements will have fixed length, no arrows. -The dart_field elements will have fixed length, small arrows. -The vector_field elements will have true length. - -Fractals --------- -const int seed[] = {N, k1, k2, k3, ... , kn}; -fractal(P(a,b),P(c,d),D,seed); - -seed determines a path made up of equal space line segments, each of -which can point in the direction 2 pi k/N. Each integer after N in seed -will specify the direction of the next segment. -fractal will recursively replace each segment in seed by a copy of the -original, up to a depth of D, and draw it from P(a,b) to P(c,d)." - (setq font-lock-defaults - '((c++-font-lock-keywords - c++-font-lock-keywords-1 - c++-font-lock-keywords-2 - c++-font-lock-keywords-3) - nil nil ((?_ . "w")) beginning-of-defun - (font-lock-mark-block-function . mark-defun))) - (setq epix-output-buffer (concat "*" (buffer-file-name) " output*")) - (use-local-map epix-mode-map) - (if (and epix-insert-template-in-empty-buffer - (= (point-min) (point-max))) - (progn - (if epix-mark-files-as-epix - (epix-mark-file-as-epix)) - (epix-insert-epix-template)) - (if epix-mark-files-as-epix - (epix-mark-file-as-epix))) - (run-hooks 'epix-mode-hook)) - -;;; flix mode - -(defvar flix-mode-map nil - "The keymap for flix mode.") - -(if flix-mode-map - nil - (let ((map (copy-keymap c++-mode-map))) - (define-key map "\C-c\C-k" 'epix-kill-process) - (define-key map "\C-c\C-x" 'epix-run-epix) - (define-key map "\C-c\C-l" 'epix-run-elaps) - (define-key map "\C-c\C-r" 'epix-show-output-buffer) - (define-key map "\C-c\C-v" 'epix-view-elaps-output) - (define-key map "\C-c\C-h" 'epix-help) - (define-key map "\C-c`" 'epix-find-error) - (define-key map "\C-c\C-f" 'epix-run-flix) - (define-key map "\C-c\C-w" 'epix-view-mng) - (setq flix-mode-map map))) - -(easy-menu-define flix-mode-menu flix-mode-map - "flix mode menu" - '("flix" - ["Run flix" epix-run-flix t] - ["View the mng file" epix-view-mng t] - ["Get help on flix/ePiX" epix-help t] - ["Show the output buffer" epix-show-output-buffer t] - ("ePiX" - ["Run ePiX" epix-run-epix t] - ["Run elaps" epix-run-elaps t] - ["View the eps file" epix-view-elaps-output t]))) - -(define-derived-mode flix-mode c++-mode "flix" - "flix mode is a major mode for editing flix files. -It is C++ mode with a couple of extra commands: - -Run flix on the file being visited: C-cC-f -View the mng output: C-cC-w -Get help on flix: C-cC-h - -Since a flix file is a valid ePiX file, the -following commands are also available: -Run epix on the file being visited: C-cC-x -Run elaps on the file being visited: C-cC-l -View the postscript output: C-cC-v -In the case of errors: -Go to the (next) error: C-c` - -An ePiX file isn't necessarily a flix file, -but the command -M-x epix-epix-to-flix -will try to turn an ePiX file into a flix file. - -SUMMARY OF FLIX/EPIX COMMANDS ------------------------- - -Preamble --------- -picture(P(a,b), P(c,d), \"height[dim] x width dim\"); - -The actual picture commands need to be between -begin(); -and -end(); - -Colors ------- -RGB(r,g,b); -Red(d); Green(d); Blue(d); Black(d); White(d); - -CMY(c,m,y); -Cyan(d); Magenta(d); Yellow(d); CMY_Black(d); CMY_White(d); - -CMYK(c,m,y,k); -CyanK(d); MagentaK(d); YellowK(d); CMYK_Black(d); CMYK_White(d); - -Primary densities interpolate linearly between anti-saturation (-1), -no color(0), full saturation (1), and saturation on all channels (2 -or -2). Densities are meaningful mod 4. Colors can be superposed, -blended, inverted, filtered, and scaled. - -Line and fill styles ------------ -Widths: plain([Color]); bold([Color]); bbold([Color]); - pen(Color, [len]); pen(len); - base(Color, [len]); base(len); -Styles: solid(); dashed(); dotted(); - line_style(string); -Fill: fill(Color); fill(bool); nofill(); - -The base pen draws an underlayer/border if wider than the line pen. -line_style accepts a WYSIWYG pattern of spaces, dashes, and periods. - -Lines ------ -line(P(a,b),P(c,d)); -Line(P(a,b),P(c,d)); -Line(P(a,b),m); - -The line goes from one point to the other, -the Line is that part of the entire line which lies inside the -bounding box. - -Polygons --------- -triangle(P(a,b),P(c,d),P(e,f)); -rect(P(a,b),P(c,d)); -quad(P(a,b),P(c,d),P(e,f),P(g,h)); - -Axes ----- -h_axis(P(a,b),P(c,d),n); -v_axis(P(a,b),P(c,d),n); -h_log_axis(P(a,b),P(c,d),n); -v_log_axis(P(a,b),P(c,d),n); - -h_axis_labels(P(a,b),P(c,d),n,P(u,v)); -v_axis_labels(P(a,b),P(c,d),n,P(u,v)); -h_log_axis_labels(P(a,b),P(c,d),n,P(u,v)); -v_log_axis_labels(P(a,b),P(c,d),n,P(u,v)); - -h_axis_masklabels(P(a,b),P(c,d),n,P(u,v)); -v_axis_masklabels(P(a,b),P(c,d),n,P(u,v)); -h_log_axis_masklabels(P(a,b),P(c,d),n,P(u,v)); -v_log_axis_masklabels(P(a,b),P(c,d),n,P(u,v)); - -The axis commands will put n+1 evenly spaced tick marks on the line. -The labeling commands will put n+1 evenly spaced labels, -masklabels will put the label on an opaque white rectangle. - -Points ------- -spot(P(a,b)); dot(P(a,b)); ddot(P(a,b)); box(P(a,b)); bbox(P(a,b)); -circ(P(a,b)); -ring(P(a,b)); - -spot, dot and ddot are various sized (in decreasing order) dots. -A circ is a small circle with white interior. -A ring is a small circle with transparent interior. - -Arrows ------- -arrow(P(a,b),P(c,d)); -dart(P(a,b),P(c,d)); - -A dart is a small arrow. - -Labels ------- -label(P(a,b),P(u,v),\"label\"); -label(P(a,b),\"label\"); -label(P(a,b),P(u,v),\"label\",posn); -masklabel(P(a,b),P(u,v),\"label\"); -masklabel(P(a,b),\"label\"); -masklabel(P(a,b),P(u,v),\"label\",posn); - -These commands put a label at the point P(a,b). -P(u,v) is an offset (in true points). -posn will specify the position of the label relative to the basepoint, -and can be c(enter), l(eft), r(ight), t(op), b(ottom) or an -appropriate pair. - -Text attributes ---------------- -label_color(Color); label_mask(Color); label_pad(len); -label_border(Color, [len]); label_border(len); no_label_border(); -font_size(LaTeX size); font_face(face); -label_angle(theta); - -The LaTeX size is a string such as \"Huge\" or \"scriptsize\". The -font face is one of \"rm\" (default), \"bf\", \"sc\", or \"tt\". - -Curves ------- -ellipse(P(a,b),P(c,d),P(e,f),tmin,tmax); -circle(P(a,b),r); -circle(P(a,b),P(c,d),P(e,f)); - -Ellipse draws (a,b)+Cos(t)*(c,d)+Sin(t)*(e,f) for tmin <= t <= tmax. - -Arcs ----- -arc(P(a,b),r,theta1,theta2); -arc_arrow(P(a,b),r,theta1,theta2); - -The angles are measured in current angle units (radians by default). - -Splines -------- -spline(P(a,b),P(c,d),P(e,f)); -spline(P(a,b),P(c,d),P(e,f),P(g,h)); - -Plotting --------- -plot(f,a,b,n); - -This plots the function f from a to b using n+1 evenly spaced points. -If f is P-valued, then this will be a parametric plot. - -Calc plotting -------------- -plot(Deriv(f),a,b,n); -plot(Integral(f),a,b,n); -plot(Integral(f),x0,a,b,n); - -plot(Deriv(f)...) plots f'. -plot(Integral(f)...) plots int_a^x f (or if x0 is given, int_x0^x f). - -Tangents --------- -tan_line(f,t); -envelope(f,t_min,t_max,n); -tan_field(f,t_min,t_max,n); - -tan_line will plot the tangent Line to the graph. -envelope will plot n+1 tangent Lines. -tan_field will plot n+1 tangent vectors. -Here, as above, f can be P-valued. - -Vector fields -------------- -slope_field(F,P(a,b),P(c,d),n1,n2); -dart_field(F,P(a,b),P(c,d),n1,n2); -vector_field(F,P(a,b),P(c,d),n1,n2); - -The slope_field elements will have fixed length, no arrows. -The dart_field elements will have fixed length, small arrows. -The vector_field elements will have true length. - -Fractals --------- -const int seed[] = {N, k1, k2, k3, ... , kn}; -fractal(P(a,b),P(c,d),D,seed); - -seed determines a path made up of equal space line segments, each of -which can point in the direction 2 pi k/N. Each integer after N in seed -will specify the direction of the next segment. -fractal will recursively replace each segment in seed by a copy of the -original, up to a depth of D, and draw it from P(a,b) to P(c,d)." - (setq font-lock-defaults - '((c++-font-lock-keywords - c++-font-lock-keywords-1 - c++-font-lock-keywords-2 - c++-font-lock-keywords-3) - nil nil ((?_ . "w")) beginning-of-defun - (font-lock-mark-block-function . mark-defun))) - (setq epix-output-buffer (concat "*" (buffer-file-name) " output*")) - (use-local-map flix-mode-map) - (if (and epix-insert-template-in-empty-buffer - (= (point-min) (point-max))) - (progn - (if epix-mark-files-as-epix - (epix-mark-file-as-flix)) - (epix-insert-flix-template)) - (if epix-mark-files-as-epix - (epix-mark-file-as-flix))) - (run-hooks 'epix-mode-hook) - (run-hooks 'flix-mode-hook)) - -(provide 'epix) |