summaryrefslogtreecommitdiff
path: root/elpa/auctex-13.1.3/style/tikz.el
diff options
context:
space:
mode:
Diffstat (limited to 'elpa/auctex-13.1.3/style/tikz.el')
-rw-r--r--elpa/auctex-13.1.3/style/tikz.el286
1 files changed, 286 insertions, 0 deletions
diff --git a/elpa/auctex-13.1.3/style/tikz.el b/elpa/auctex-13.1.3/style/tikz.el
new file mode 100644
index 0000000..f3a50bc
--- /dev/null
+++ b/elpa/auctex-13.1.3/style/tikz.el
@@ -0,0 +1,286 @@
+;;; tikz.el --- AUCTeX style for `tikz.sty' -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2016-2021 Free Software Foundation, Inc.
+
+;; Author: Matthew Leach <matthew@mattleach.net>
+;; Maintainer: auctex-devel@gnu.org
+;; Created: 2016-22-03
+;; Keywords: tex tikz
+
+;; This file is part of AUCTeX.
+
+;; AUCTeX 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 3, or (at your option)
+;; any later version.
+
+;; AUCTeX 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 AUCTeX; see the file COPYING. If not, write to the Free
+;; Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+;; 02110-1301, USA.
+
+;;; Commentary:
+
+;; This file adds some support for `tikz.sty'
+
+;;; Code:
+
+(require 'tex)
+(require 'latex)
+
+(defcustom TeX-TikZ-point-name-regexp
+ "(\\([A-Za-z0-9]+\\))"
+ "A regexp that matches TikZ names."
+ :type 'regexp
+ :group 'auctex-tikz)
+
+(defconst TeX-TikZ-point-function-map
+ '(("Rect Point" TeX-TikZ-arg-rect-point)
+ ("Polar Point" TeX-TikZ-arg-polar-point)
+ ("Named Point" TeX-TikZ-arg-named-point))
+ "An alist of point specification types and their functions.")
+
+(defconst TeX-TikZ-relative-point-function-map
+ (apply #'append (mapcar
+ (lambda (point-map)
+ (let ((key (car point-map))
+ (value (cadr point-map)))
+ `((,(concat "+" key) ,value "+")
+ (,(concat "++" key) ,value "++"))))
+ TeX-TikZ-point-function-map))
+ "`TeX-TikZ-point-function-map' with \"+\" and \"++\" as a
+prefix.")
+
+(defconst TeX-TikZ-path-connector-function-map
+ '(("--" identity)
+ ("|-" identity)
+ ( "-|" identity)
+ ("sin" identity)
+ ("cos" identity))
+ "An alist of path connectors.")
+
+(defconst TeX-TikZ-draw-arg-function-map
+ `(,@TeX-TikZ-point-function-map
+ ,@TeX-TikZ-relative-point-function-map
+ ,@TeX-TikZ-path-connector-function-map
+ ("Node" TeX-TikZ-arg-node)
+ ("Circle" TeX-TikZ-arg-circle)
+ ("Arc" TeX-TikZ-arg-arc)
+ ("Parabola" TeX-TikZ-arg-parabola)
+ ("Grid" TeX-TikZ-arg-grid))
+ "An alist of argument names and functoins for TikZ's \draw.")
+
+(defun TeX-TikZ-get-opt-arg-string (arg &optional open close)
+ "Return a string for optional arguments.
+If ARG is nil or \"\", return \"\". Otherwise return \"OPEN ARG
+CLOSE\". If OPEN or CLOSE are nil, set them to `LaTeX-optop' and
+`LaTeX-optcl' respectively."
+ (unless (or open close)
+ (setq open LaTeX-optop)
+ (setq close LaTeX-optcl))
+ (if (and arg (> (length arg) 0))
+ (concat open arg close)
+ ""))
+
+(defun TeX-TikZ-arg-rect-point (_ignored &optional prefix)
+ "Prompt the user for a point on the Cartesian plane.
+Ask the user for an X and Y coordinate, and return the string
+\"(X,Y)\"."
+ (let ((x (TeX-read-string (TeX-argument-prompt nil nil "X-coordinate")))
+ (y (TeX-read-string (TeX-argument-prompt nil nil "Y-coordinate"))))
+ (concat " " prefix "(" x ", " y") ")))
+
+(defun TeX-TikZ-arg-polar-point (_ignored &optional prefix)
+ "Prompt the user for a point on the polar plane.
+Ask the user for r and theta values, and return the string
+\"(THETA:R)\"."
+ (let ((r (TeX-read-string (TeX-argument-prompt nil nil "R")))
+ (theta (TeX-read-string (TeX-argument-prompt nil nil "Theta"))))
+ (concat " " prefix "(" theta ":" r ") ")))
+
+(defun TeX-TikZ-arg-options (optional)
+ "Prompt the user for options to a TikZ macro.
+If OPTIONAL is non-nil, always return `LaTeX-optop' and
+`LaTeX-optcl', even if the user doesn't provide any input."
+ (let ((options (TeX-read-string (TeX-argument-prompt optional nil "Options" ))))
+ (if optional
+ (TeX-TikZ-get-opt-arg-string options)
+ (concat LaTeX-optop options LaTeX-optcl))))
+
+(defun TeX-TikZ-arg-name (optional)
+ "Prompt the user for a TikZ name.
+If OPTIONAL is non-nil, always return \"()\", even if the user
+doesn't provide any input."
+ (let ((name (TeX-read-string (TeX-argument-prompt optional nil "Name" ))))
+ (if optional
+ (TeX-TikZ-get-opt-arg-string name "(" ")")
+ (concat "(" name ")"))))
+
+(defun TeX-TikZ-arg-label (optional)
+ "Prompt the user for TikZ label.
+If OPTIONAL is non-nil always return `TeX-grop' and `TeX-grcl',
+even if the user doesn't provide any input."
+ (let ((label (TeX-read-string (TeX-argument-prompt optional nil "Label" ))))
+ (if optional
+ (TeX-TikZ-get-opt-arg-string label TeX-grop TeX-grcl)
+ (concat TeX-grop label TeX-grcl))))
+
+(defun TeX-TikZ-arg-node (_ignored)
+ "Prompt the user for the deatils of a node.
+Ask the user for the name and text for a node and return the
+string \"node[OPTIONS](NAME){TEXT}\"."
+ (let ((options (TeX-TikZ-arg-options t))
+ (name (TeX-TikZ-arg-name t))
+ (label (TeX-TikZ-arg-label nil)))
+ (concat "node" options name label " ")))
+
+(defun TeX-TikZ-get-arg-type (types prompt)
+ "Prompt the user for an argument type.
+TYPES is a list of possible types that the user can specify. Use
+PROMPT as the prompt for input."
+ (let ((completion-ignore-case t))
+ (completing-read prompt types nil t)))
+
+(defun TeX-TikZ-single-macro-arg (function-alist prompt &optional optional)
+ "Prompt the user for a single argument to compose a TikZ macro.
+FUNCTION-ALIST is a mapping of argument-types to functions. The
+user is prompted for the argument type, the chosen function is
+then called and the value returned. PROMPT is used as the prompt
+for the argument type. When OPTIONAL is non-nil, add \"\" to
+FUNCTION-ALIST with a mapping to `identity', permitting an
+optional input."
+ (let* ((selected-argument-type (TeX-TikZ-get-arg-type function-alist prompt))
+ (fn-alist-with-optional-elm (if optional
+ `(,@function-alist ("" identity))
+ function-alist))
+ (selected-mapping (assoc selected-argument-type
+ fn-alist-with-optional-elm)))
+
+ ;; Build the funcall we wish to evaluate. This will be the function
+ ;; to be called (the second element in the assoc element),
+ ;; followed by the type name (the first element), followed by any
+ ;; other elements in the list as extra arguments.
+ (apply
+ (cadr selected-mapping)
+ (car selected-mapping)
+ (cddr selected-mapping))))
+
+
+(defun TeX-TikZ-macro-arg (function-alist)
+ "Prompt the user for arguments to compose a TikZ macro.
+FUNCTION-ALIST is a mapping of argument-types to functions. The
+user is repeatedly prompted for the next argument-type; they can
+choose form the cars in FUNCTION-ALIST and the appropriate
+function is then called. If the user enters \"\", then the macro
+is finished."
+ (let* ((options (TeX-TikZ-arg-options t))
+ (prompt "Next argument type (RET to finish): ")
+ (string-to-insert (TeX-TikZ-single-macro-arg function-alist prompt t)))
+
+ ;; Insert the macro options.
+ (insert options " ")
+
+ ;; Iteratively prompt the user for TikZ's arguments until "" is
+ ;; returned.
+ (while (not (string= string-to-insert ""))
+ (insert string-to-insert)
+ (setq string-to-insert
+ (TeX-TikZ-single-macro-arg function-alist prompt t)))
+
+ ;; Finish the macro.
+ (insert ";")))
+
+(defun TeX-TikZ-find-named-points ()
+ "Find TiKZ named points in current enviroment.
+Begin by finding the span of the current TikZ enviroment and then
+searching within that span to find all named-points and return
+them as a list of strings, dropping the '()'."
+ (let* ((env-end (save-excursion
+ (LaTeX-find-matching-end)
+ (point)))
+ (matches))
+ ;; TODO: Handle cases where we are in a nested environment, \scope
+ ;; for example.
+ (save-excursion
+ (LaTeX-find-matching-begin)
+ (save-match-data
+ (while (re-search-forward TeX-TikZ-point-name-regexp env-end t)
+ (push (match-string 1) matches))))
+ matches))
+
+(defun TeX-TikZ-arg-named-point (_ignored &optional prefix)
+ "Prompt the user for the name of a previous named-point."
+ (let ((point-name (completing-read "Point name: "
+ (TeX-TikZ-find-named-points))))
+ (concat " " prefix "(" point-name ") ")))
+
+(defun TeX-TikZ-arg-circle (_ignored)
+ "Prompt the user for the arguments to the circle command."
+ (let ((options (TeX-TikZ-arg-options t)))
+ (concat "circle" options)))
+
+(defun TeX-TikZ-arg-arc (_ignored)
+ "Prompt the user for the arguments to the arc command."
+ (let ((options (TeX-TikZ-arg-options t)))
+ (concat "arc" options)))
+
+(defun TeX-TikZ-arg-bend (optional)
+ "Prompt the user for a bend argument.
+If OPTIONAL is non-nil and the user doesn't provide a point,
+ return \"\"."
+ (let ((point
+ (TeX-TikZ-single-macro-arg TeX-TikZ-point-function-map
+ (TeX-argument-prompt optional nil "Bend point")
+ optional)))
+ (if (string= point "")
+ point
+ (concat " bend" point))))
+
+(defun TeX-TikZ-arg-parabola (_ignored)
+ "Prompt the user for the arguments to the parabola command."
+ (let ((options (TeX-TikZ-arg-options t))
+ (bend (TeX-TikZ-arg-bend t)))
+ (concat "parabola" options bend)))
+
+(defun TeX-TikZ-arg-grid (_ignored)
+ "Prompt the user for the arguments to the grid command."
+ (let ((options (TeX-TikZ-arg-options t)))
+ (concat "grid" options)))
+
+(defun TeX-TikZ-draw-arg (_ignored)
+ "Prompt the user for the arguments to a TikZ draw macro."
+ (TeX-TikZ-macro-arg TeX-TikZ-draw-arg-function-map))
+
+(defun TeX-TikZ-coordinate-arg (_ignored)
+ "Prompt the user for the arguments to a TikZ coordinate macro."
+ (let ((options (TeX-TikZ-arg-options t))
+ (name (TeX-TikZ-arg-name nil))
+ (point (TeX-TikZ-single-macro-arg TeX-TikZ-point-function-map
+ "Coordinate point type: ")))
+ (insert options " " name " at" point ";")))
+
+(defun TeX-TikZ-node-arg (_ignored)
+ "Prompt the user for the arguments to a TikZ node macro."
+ (let ((options (TeX-TikZ-arg-options t))
+ (name (TeX-TikZ-arg-name nil))
+ (point (TeX-TikZ-single-macro-arg TeX-TikZ-point-function-map
+ "Node point type: "))
+ (label (TeX-TikZ-arg-label nil)))
+ (insert options " " name " at" point label ";")))
+
+(TeX-add-style-hook
+ "tikz"
+ (lambda ()
+ (TeX-add-symbols
+ '("draw" (TeX-TikZ-draw-arg))
+ '("coordinate" (TeX-TikZ-coordinate-arg))
+ '("node" (TeX-TikZ-node-arg)))
+ (LaTeX-add-environments
+ '("tikzpicture"))))
+
+;;; tikz.el ends here