aboutsummaryrefslogtreecommitdiff
path: root/exercisesheets.el
diff options
context:
space:
mode:
Diffstat (limited to 'exercisesheets.el')
-rw-r--r--exercisesheets.el113
1 files changed, 113 insertions, 0 deletions
diff --git a/exercisesheets.el b/exercisesheets.el
new file mode 100644
index 0000000..c446522
--- /dev/null
+++ b/exercisesheets.el
@@ -0,0 +1,113 @@
+;;; exercisesheets.el --- AUCTeX style for `exercisesheets.sty'
+;;
+;; Author: Sebastian Kuhnert <mail@sebastian-kuhnert.de>
+;; Created: 2009-11-18
+;; Keywords: tex
+;;
+;; This work may be distributed and/or modified under the conditions
+;; of the LaTeX Project Public License, either version 1.3c of this
+;; license or (at your option) any later version. The latest version
+;; of this license is in https://www.latex-project.org/lppl.txt and
+;; version 1.3c or later is part of all distributions of LaTeX
+;; version 2005/12/01 or later.
+;;
+;; This work has the LPPL maintenance status `maintained'.
+;;
+;; The Current Maintainer of this work is Sebastian Kuhnert.
+;;
+;; This work consists of the files listed in README.
+
+
+(defun LaTeX-exercisesheets-read-kwopt (context spec)
+ "Ask the user if/how an option should be included.
+
+CONTEXT is used in the prompt.
+
+SPEC is a string of the form
+`opt' for boolean options (ask if it should be included, default no),
+`!opt' for boolean options (ask if it should be included, default yes),
+`opt=' for free-form arguments for the option (include if non-empty),
+`!opt=' for free-form arguments for the option (always included),
+`opt=arg1,arg2,arg3' for suggestions with completion (empty means skip),
+`!opt=arg1,arg2,arg3' for suggestions with completion (always included),
+`opt=!arg1,arg2,arg3' for alternatives with completion (empty means skip),
+`!opt=!arg1,arg2,arg3' for alternatives with completion (always included).
+
+The result is the string to be used as argument. If the option is skipped, the result is nil."
+ (if (string-match "^\\(!?\\)\\(.*\\)=\\(!?\\)\\(.*\\)$" spec)
+ (let* ((required (if (match-string 1 spec) nil t))
+ (optstr (if required "optional " ""))
+ (require-match (if (match-string 3 spec) t nil))
+ (answer (save-match-data
+ (if (string= "" (match-string 4 spec))
+ (read-string (concat context ": " optstr "argument " (match-string 2 spec) "="))
+ (completing-read (concat context ": " optstr "argument " (match-string 2 spec) "=")
+ (split-string (match-string 4 spec) ",")
+ nil
+ require-match)))))
+ (if (or (not (string= "" answer)) required)
+ (if (string-match-p "[,= ]" answer)
+ (concat (match-string 2 spec) "={" answer "}")
+ (concat (match-string 2 spec) "=" answer))))
+ (if (string-match "^!\\(.*\\)$" spec)
+ (if (Y-or-n-p (concat context ": include argument " (match-string 1 spec) "? "))
+ (match-string 1 spec))
+ (if (y-or-N-p (concat context ": include argument " spec "? "))
+ spec))))
+
+(defun Y-or-n-p (query)
+ "Variant of `y-or-n-p' where return/enter means yes"
+ (let ((query-replace-map
+ (append '(keymap (return . act) (enter . act)) (cdr query-replace-map))))
+ (y-or-n-p query)))
+
+(defun y-or-N-p (query)
+ "Variant of `y-or-n-p' where return/enter means no"
+ (let ((query-replace-map
+ (append '(keymap (return . skip) (enter . skip)) (cdr query-replace-map))))
+ (y-or-n-p query)))
+
+(defun LaTeX-exercisesheets-read-kwopts(context startdelim enddelim &rest specs)
+ (let* ((anslist (mapcar
+ (lambda (spec) (LaTeX-exercisesheets-read-kwopt context spec))
+ args))
+ (ansstr (list-to-string (delq nil anslist) ",")))
+ (if (not (string= "" ansstr))
+ (concat startdelim ansstr enddelim))))
+
+(defun LaTeX-exercisesheets-insert-kwopts(optional &rest specs)
+ (if optional
+ (LaTeX-exercisesheets-read-kwopts(nil "[" "]" specs))
+ (LaTeX-exercisesheets-read-kwopts(nil "{" "}" specs))))
+
+(defun LaTeX-exercisesheets-insert-environment (env &rest args)
+ "Insert environment ENV considering keyword arguments specified by ARGS.
+
+See `LaTeX-exercisesheets-read-kwopt' for the format of the strings in ARGS."
+ (LaTeX-insert-environment env (LaTeX-exercisesheets-read-kwopts (concat env " environment") "[" "]" args)))
+
+(TeX-add-style-hook "exercisesheets"
+ (lambda ()
+ ;; New symbols
+ (TeX-add-symbols
+ '("subject" 1)
+ '("TODO" 0)
+ '("points" [ (LaTeX-exercisesheets-insert-kwopts "optional" "bonus") ] "points")
+ '("exshset" 1)
+ '("ifsolutions" 2))
+ ;; New environments
+ (LaTeX-add-environments
+ '("sheet" LaTeX-exercisesheets-insert-environment "date=" "note=" "title=")
+ '("exercise" LaTeX-exercisesheets-insert-environment "points=" "oral" "name=" "firstline=")
+ '("solution" LaTeX-exercisesheets-insert-environment "oral")
+ '("hint" LaTeX-exercisesheets-insert-environment "remark")
+ '("hint*" LaTeX-exercisesheets-insert-environment "remark"))
+ ;; Warning keywords
+ (font-latex-add-keywords '("TODO")
+ 'warning)
+ ))
+
+(defvar LaTeX-exercisesheets-package-options '("only=" "all" "solutions" "solutions=oral" "solutionsby=" "language=")
+ "Package options for the exercisesheets package.")
+
+;;; exercisesheets.el ends here