Показаны сообщения с ярлыком Emacs. Показать все сообщения
Показаны сообщения с ярлыком Emacs. Показать все сообщения

пятница, 2 мая 2014 г.

Fuzzy matching в popup-switcher с использованием flx

Наконец добрался до fuzzy matching в popup-switcher. Есть несколько решений для осуществления нечеткого поиска в Emacs. Например:

Настройка

В popup-switcher используется flx. ИМХО, это просто прекрасный движек для нечеткого поиска, хотя автор и предупреждает о том, что проект достаточно молодой и возможно еще остались ошибки.

В flx-ido есть более высокоуровневые функции, поэтому фактически зависимость именно от flx-ido.

Как и в случае с CEDET и projectile, явно зависимость не указывается (чтобы не превращать popup-switcher в монстра с большим количеством обязательных зависимостей). Чтобы воспользоваться возможностью нечеткого поиска, необходимо установить flx и flx-ido любым удобным вам способом, например через MELPA:

 M-x package-install [RET] flx-ido [RET]
Кроме этого, необходимо установить psw-use-flx в значение t
 (setq psw-use-flx t)

Пример использования

Например, неообходимо найти функцию psw-get-item-by-name. Вызываем psw-switch-function (любым выбранным клавиатурным сочетанием), набираем первые буквы слов "get" и "item" - "gi", flx сузит список поиска и отсортирует по релевантности:
Пример использования flx в popup-switcher.

P.S.

Happy hacking! :)

вторник, 5 ноября 2013 г.

popup-switcher - переключение буферов и навигация по функциям, используя TUI-меню

Эргономика промышленных решений

С некоторого времени для разработки на Java я использую IntelliJ IDEA. Какова там навигация по файлам или по методам! Нажимаешь C-S-n (или C-n для классов) и появляется окошко поиска со списком. Вводишь буквы из названия файла и список сокращается - самый удобный способ навигации по файлам проекта. Аналогично C-F12 для навигации по методам открытого класса - интерактивно изменяющееся меню на основе вводимых символов из имени метода. Ничего эргономичнее до этого не видел.

Изящество и красота текстовых интерфейсов

В emacs это все есть, безусловно, но выглядит это... в emacs вообще все выглядит абсолютно самобытно. Именно самобытно. Думаю, вряд ли кто-то скажет, что emacs предоставляет GUI - интерфейс, возможно лишь местами. В большинстве случаев, emacs не предоставляет и CLI - да, он часто интегрируется и CLI-инструментами: CLI-утилита является back-end-ом, а emacs предоставляет свою обертку, он имеет внутренние оболочки shell-ы и repl-ы, может сам быть запущен из внешних, но этот интерфейс, хоть и играет важную роль, все же является скорее вспомогательным. Выходит TUI? Во-многом, да. Но он зачастую деформируется механизмом окон. Если взять, например, mc, far, ndd, старые, времен DOS, среды разработки, антивирусы, архиваторы, предоставляющие TUI-интерфейс, то там любое диалоговое окно - часть общего текстового рабочего пространства. В emacs же окна жестко механически разделяют текстовые области. Данный подход стал идиоматическим. Скажем, org-mode и magit - примеры эффективного разделения возможностей TUI в рамках основного буфера и добавления вспомогательных окон и буферов. Такие буферы имеют свои специальные режимы с удобными таблицами ключей. Может оно и хорошо, и у такого подхода безусловно есть свои плюсы, но всегда ли это нужно? На каждый чих создается новое окно и в нем свой буфер. Лично мне куда приятнее чаще видеть старый-добрый TUI-интерфейс там, где создание отдельного окна избыточно.

TUI в emacs

Библиотеки popup-el (выпадающие меню) и direx-el (деревья) - примеры расширений, предоставляющих некоторую функциональность TUI. К сожалению, предоставляется лишь некоторая часть возможных виджетов, но тем не менее, имеющиеся весьма удобны.

Так, например, первая из них позволила мне реализовать в TUI некоторые из идей, используемых в IntelliJ IDEA: popup-switcher. Вызов интерактивной функции

  • psw-switch-buffer - приведет к появлению списка открытых буферов. Ввод символов имени буфера будет сокращать список. Именно в качестве (еще одного) механизма переключения буферов и задумывался изначально popup-switcher, однако на самом деле, он может быть использован для переключения чего угодно (отсюда и название).
  • psw-switch-projectile-files - работает со всеми файлами проекта (файлы проекта рассматриваются в контексте расширения projectile).
  • psw-switch-function - работает с функциями/методами в текущем файле.
Пример навигации по буферам.
Пример навигации по функциям в файле с исходным кодом на Clojure.

Установка

Установка расширения довольно проста. Добавьте MELPA в вашу переменную package-archives (если у вас он еще не был добавлен):
 (require 'package)
 (add-to-list 'package-archives
              '("melpa" . "http://melpa.milkbox.net/packages/"))
 (package-initialize)
Далее popup-switcher устанавливается командой:
 M-x package-install [RET] popup-switcher [RET]
Кроме того, в файле инициализации .emacs необходимо указать:
 (require 'popup-switcher)

Настройка

После установки psw-in-window-center в значение t всплывающее меню будет появляться в середине окна. По умолчанию появляется в посередине меду левым краем окна и значением fill-column.
 (setq psw-in-window-center t)
Вы можете установить интерактивные функции переключения буферов и навигации по методам для определенных клавиатурных сочетаний на ваш вкус, например:
 (global-set-key [f2] 'psw-switch-buffer)
 (global-set-key (kbd "C-S-n") 'psw-switch-projectile-files)
Для активации возможности навигации по функциям/методам необходимо установить последнюю версию CEDET и подключить библиотеку eassist. Это не является обязательным, и вы можете использовать popup-switcher без CEDET (и, очевидно, без данной функциональности). Пример настройки:
 ;; Activate semantic
 (semantic-mode 1)
 
 ;; Load contrib library
 (add-to-list 'load-path "~/.emacs.d/cedet/contrib/")
 (require 'eassist)
 
 (eval-after-load "eassist"
   '(global-set-key [f3] 'psw-switch-function))

Добавление переключений

Добавлять новые применения механизма переключения очень просто, так функция psw-switch-buffer выглядит следующим образом:
 (defun psw-switch-buffer ()
    (interactive)
    (psw-switcher
     :items-list (psw-get-buffer-list)
     :item-name-getter 'buffer-name
     :switcher 'switch-to-buffer))
где
  • items-list - список, в котором осуществляется выбор (psw-get-buffer-list - просто использует встроеную функцию buffer-list с некоторыми дополнительными фильтрами).
  • item-name-getter - функция получения текстового обозначения каждого элемента списка в меню выбора.
  • switcher - функция, описывающая что делать с выбранным элементом.

Заключение

Для emacs существуют хоть и не всеобъемлющие, но весьма удобные библиотеки работы с TUI. Например, popup-el уже использующаяся в проектах auto-complete и emacs-jedi, а теперь и в popup-switcher.

Библиотека direx-el используется, например, в проекте emacs-jedi-direx. direx-el потенциально может выступать в качестве основы для более простого и современного аналога ECB. Конечно, в данном случае создание нового окна будет необходимо, но мне кажется, что это как раз тот случай, когда это оправдано.

Надеюсь, вас зантересовала идея более широкого применения TUI в emacs, а также написания и развития расширений, как использующих эти возможности, так и предоставляющих новые возможности для TUI - виджетов.

пятница, 19 октября 2012 г.

Функциональная и информативная mode-line

Давно хотелось сделать отображаемую в emacs mode-line информацию более понятной. В то же время, слишком отходить от стандартного вида тоже не хотелось, т.к. уже есть много всего удобного, например всплывающее меню для основного режима. Конечно, прежде всего хотелось поменять обозначение кодировки, признак read-only и признак того, что буфер был изменен. По этому поводу Xah Lee верно подметил, что начало mode-line выглядит загадочно :). За основу я взял описание конфигурации в emacs-fu.

Несколько ключевых моментов:

  • mode-line-mule-info
    о сдной стороны не слишком красива и информативна, зато позволяет переключать кодировки и символ завершения строк мышкой (и да, я польуюсь мышкой в emacs :)).
  • buffer-file-coding-system
    все что нужно для красивого описания текущей кодировки.
  • mode-line-buffer-identification
    имя буфера (как в стандартой mode-line)
  • mode-line-modes
    еще одна важная деталь из стандартной mode-line, которая отображает список minor-mode, сужения и ассоциированный с буфером процесс.
  • Положение курсора в буфере, идентификация режима Insert/Overwrite взята из emacs-fu.

В итоге получилось так:

Полный вариант данной конфигурации на bitbucket.

понедельник, 8 октября 2012 г.

PageUp/PageDown в меню auto-complete

После длительного сидения на 1.2, обновился до версии 1.4 auto-complete.el (через ELPA). Красота, да еще и со всплывающими подсказками. Первое что захотелось сделать перевесить вызов как в популярных IDE:
 (define-key ac-mode-map (kbd "C-SPC") 'auto-complete)
Уже на списке автодополнений захотелось нажать привычную для IDE PageDown для прокрутки по списку. Ан нет, emacs выполняет прокрутку на странице. Сделаем возможность PageDown/PageUp на меню автодополнений:
 (defun ac-page-next ()
   "Select next completion candidate per `ac-menu-height' range.
 Pages down through completion menu."
   (interactive)
   (let ((counter 0))
     (dotimes (counter (1- ac-menu-height))
       (ac-next))))

 (defun ac-page-previous ()
   "Select previous completion candidate per `ac-menu-height' range.
 Pages up through completion menu."
   (interactive)
   (let ((counter 0))
     (dotimes (counter (1- ac-menu-height))
       (ac-previous))))
(define-key ac-complete-mode-map [next] 'ac-page-next)
(define-key ac-complete-mode-map [prior] 'ac-page-previous)
Поиск в меню давно хотелось перевесить, но все ни как руки не доходили. isearch-forward у меня висит на C-f, соответственно меняем:
(define-key ac-complete-mode-map (kbd "C-f") 'ac-isearch)

среда, 7 октября 2009 г.

Компоновка CLASSPATH с помощью emacs и muCommander

Вообще, CLASSPATH имеет по сути отношение к настоящей заметке как французское полусладкое к физике жидкости, но идея возникла именно в тот момент когда я в очередной раз компоновал CLASSPATH. На самом же деле объединением строк случается пользоваться не только и столько для этого. CLASSPATH - штука капризная. Бывает не любит пробелы или русские буквы в путях. А бывает этот фокус работает "на ура". Конечно, традиционно стараешься этого избежать. Тем не менее, иногда необходимо сформировать строку, в которой должна быть записана "пачка", "jar-ников". Иногда, этот процесс приходится повторять... Иногда и не раз...
Хочется этот процесс автоматизировать. Искать специализированные решения - несколько дико.
В качестве файлового менеджера я использую muCommander. Он реализует минимально необходимый набор функций файлового менеджера, не пытаясь стать системой по управлению ОС (аля TotalCommander), но и не столь аскетичен как dired (хотя, возможно, и менее гибок). Кроме того, cross-platform (java), распространяется под GPL. Настройка muCommander для того, чтобы emacs стал редактором по умолчанию, выглядит следующим образом:
В ~\.mucommander\preferences.xml указывается
<editor>
<use_custom>true</use_custom>
<custom_command>emacsclientw.exe -n &quot;$f&quot;</custom_command>
</editor>

Возвращаемся к CLASSPATH. Находясь в директории библиотеки, например C:\JavaLib\axis\ нажимаем (ключи я описал в стиле emacs, но все это, конечно, выполняется в muCommander):
C-a
M-S-c
Это приведет к тому, что пути к файлам будут скопированы в буфер обмена. Переходим в некоторый буфер emacs, например,temp. Вставляем содержимое буфера обмена (C-v или C-y в зависимости от настроек). Его содержимое принимает следующий вид, например:
C:\JavaLib\axis\axis-ant.jar
C:\JavaLib\axis\axis.jar
C:\JavaLib\axis\commons-discovery-0.2.jar
C:\JavaLib\axis\commons-logging-1.0.4.jar
C:\JavaLib\axis\jaxrpc.jar
C:\JavaLib\axis\log4j-1.2.8.jar
C:\JavaLib\axis\saaj.jar
C:\JavaLib\axis\wsdl4j-1.5.1.jar

Подобным образом дополняем список из библиотек других директорий.
Ниже предлагается ряд функций. Может, это и не очень существенная разработка :), но для меня частота их использования конкурирует разьве только что с к командами движения курсора.
;;=============================================================================
;; Join lines
;;=============================================================================
(defun circle-processing (arg function)
"Circle call 'function' 'arg' times, default - once"
(interactive)
(progn
(if arg
(setq times arg)
(setq times 1))
(let (counter)
(dotimes (counter times)
(apply function nil)))))

(defun join-next-line-space ()
"Joins next line with current with a space between them"
(interactive)
(progn
(end-of-line)
(next-line)
(join-line)))

(defun join-next-line ()
"Joins next line with current without space between them"
(interactive)
(progn
(join-next-line-space)
(delete-char 1)))

(defun join-next-line-semicolon ()
"Joins next line with current with semicolon between them"
(interactive)
(progn
(join-next-line)
(insert ";")))

(defun join-next-line-space-n (&optional arg)
"Joins number of next lines with current with a space between them"
(interactive "P")
(circle-processing arg 'join-next-line-space))
(global-set-key "\C-j" 'join-next-line-space-n)

(defun join-next-line-n (&optional arg)
"Joins number of next lines with current without space between them"
(interactive "P")
(circle-processing arg 'join-next-line))
(global-set-key "\C-cj" 'join-next-line-n)

(defun join-next-line-semicolon-n (&optional arg)
"Joins number of next lines with current with semicolon between them"
(interactive "P")
(circle-processing arg 'join-next-line-semicolon))
(global-set-key "\C-c\C-j" 'join-next-line-semicolon-n)

Так, точка в начале буфера.
M-<число строк> C-c C-j (join-next-line-semicolon-n).
CLASSPATH готов.
Обратная задача - преобразование из строки в список удобный для чтения. Вставив строку CLASSPATH в буфер набираем:
M-x replace-string ; <RET> ; C-q <RET> <RET>
К сожалению, перевод строки и/или возврат каретки будет представлен в буфере символом ^M вместо собственно начала новой строки. Но скопировав этот фрагмент из emacs, текст представляется в том виде, в котором изначально и ожидалось.

P.S. При поддержке emacs@conference.jabber.ru :)
P.P.S. Комментарии приветствуются, прежде всего, по стилю написания на elisp (можно ли что-то упростить, унифицировать, etc).

суббота, 26 сентября 2009 г.

Ограничения размера буфера для imenu

Сегодня обнаружил, что содержимое LaTeX-документа в окне методов ecb вдруг перестало автоматически перестраиваться по сохранению. Долго пытался понять что ж такого наизменял в .emacs, чтобы это перестало работать. На всякий пожарный попробовал старые конфиги, переустановил последовательно ecb, emacs, мир... :)

Но долго сказка сказывается, да скоро проблема решается:
;Imenu auto-rescan is disabled in buffers larger than this size (in bytes).
(setq imenu-auto-rescan-maxout 600000)

вторник, 28 июля 2009 г.

Emacs, Aspell и одновременное использование словарей.

Недавно задался вопросом как осуществлять проверку правописания для буфера, в котором есть как русские, так и английские слова.
На ЛОРе подсказали решение, которое показалось мне вполне приемлемым. Привожу его в том виде, в котором оно осталось в моем .emacs (т.е. почти без изменений):
;;=============================================================================
;;
;;Настройка проверки правописания Ispell
;;
(require 'flyspell)
(require 'ispell)

(setq
; i like aspel, and you?
ispell-program-name "aspell"

; my dictionary-alist, using for redefinition russian dictionary
ispell-dictionary-alist
'(("english" ; English
"[a-zA-Z]"
"[^a-zA-Z]"
"[']"
nil
("-d" "en")
nil iso-8859-1)
("russian" ; Russian
"[АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдеёжзийклмнопрстуфхцчшщьыъэюя]"
"[^АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдеёжзийклмнопрстуфхцчшщьыъэюя]"
"[-]"
nil
("-C" "-d" "ru")
nil utf-8)
(nil ; Default
"[A-Za-z]"
"[^A-Za-z]"
"[']"
nil
("-C")
nil iso-8859-1))

ispell-russian-dictionary "russian"
ispell-english-dictionary "english"
flyspell-default-dictionary ispell-russian-dictionary
ispell-dictionary ispell-english-dictionary
ispell-local-dictionary ispell-russian-dictionary
ispell-extra-args '("--sug-mode=ultra"))

(defun flyspell-russian ()
(interactive)
(flyspell-mode t)
(ispell-change-dictionary ispell-russian-dictionary)
(flyspell-buffer)
(message "Russian dictionary - Spell Checking completed."))

; English
(defun flyspell-english ()
(interactive)
(flyspell-mode t)
(ispell-change-dictionary ispell-english-dictionary)
(flyspell-buffer)
(message "English dictionary - Spell Checking completed."))

(setq ispell-highlight-face (quote flyspell-incorrect))
(setq ispell-have-new-look t)
(setq ispell-enable-tex-parser t)
(add-hook 'text-mode-hook 'flyspell-mode)
(setq flyspell-delay 1)
(setq flyspell-always-use-popup t)

(global-set-key [f1] 'ispell-word)
(global-set-key [f7] 'ispell-buffer); проверить орфографию в текущем буфере
(global-set-key [f8] 'ispell-region)
(global-set-key [f9] 'auto-fill-mode); вкл/выкл автозаполнения
(global-set-key [f10] 'flyspell-english)
(global-set-key [f11] 'flyspell-russian)
(global-set-key [f12] 'flyspell-mode); вкл/выкл проверки орфографии "на ходу"
;;
;;============================================================================
P.S. упражняемся c htmlize.el

понедельник, 6 июля 2009 г.

MIT/GNU Scheme и Emacs

Вот интересно, кому пришла в голову мысль что Linux сложнее Windows?

На днях разгребал архивы закаченных файлов и среди прочего были обнаружены несколько статей
о пользе бега и вреде курения о пользе лиспа и вреде java.
  1. http://www.nestor.minsk.by/sr/2003/07/30710.html
  2. http://local.joelonsoftware.com/wiki/Опасности_обучения_на_Java
  3. http://local.joelonsoftware.com/wiki/А_ваш_язык_программирования_так_может%3Fa

Сложно не заинтересоваться.

В то же время, неподалеку была обнаружена книжка Харольд Абельсон, Джеральд Джей Сассман Структура и интерпретация компьютерных программ. Английский вариант:http://mitpress.mit.edu/sicp/full-text/book/book.html. Книжка, вообще говоря, и не совсем про лисп, но примеры на Scheme. Хороший способ совместить приятное с полезным.

В чем же дело? Нам нужна реализация той самой Scheme, на которой написаны примеры в книжке. Вот она: http://mitpress.mit.edu/sicp/scheme/index.html Скачиваем, устанавливаем заботливо собранный и для пользователей Windows бинарник http://www.gnu.org/software/mit-scheme/. Там же рядом PDF - версии документации. После установки, конечно, прописываем C:\Program Files\MIT-GNU Scheme\bin\ в PATH.

Конечно, это все теперь нужно прикрутить к Emacs (а как же без этого?!). Тут все уже написано: http://xtalk.msk.su/~ott/ru/writings/emacs-devenv/EmacsScheme.html#xscheme.. Итак, нам нужен Xscheme. Он входит в стандартный комплект Emacs, конечно, можно взять и версию http://www.gnu.org/software/mit-scheme/, но она едва ли новее. Выглядит не сложно. Нужно лишь запустить процесс Scheme. В самом приложении (Scheme.exe) про существование Windows не очень в курсе, т.к. путь поиска по band-файла all.com по умолчанию \scheme\lib. Кхм, ладно смотрим документацию. Решение: использовать переменную окружения MITSCHEME_LIBRARY_PATH со значением, например C:\Program Files\MIT-GNU Scheme\lib.

Наконец, M-x start-scheme успешно запущен. Но в созданном буфере scheme никакого процесса scheme нет, хотя некая консоль в соседнем окне запустилась. Возвращаемся на http://www.gnu.org/software/mit-scheme/ (прикидывая, оформить это как вопрос или уж сразу баг-репорт, в конце-концов, кому придет в голову тестировать все это в Windows?:)). А там, тем временем, относительно использования xscheme и emacs черным по белому написано: This doesn't work on Windows or OS/2.

Ладно, все же в комплекте MIT/GNU Scheme идет emacs-подобный редактор Edwin. Но разве Windows проще Linux?

четверг, 2 июля 2009 г.

Пример символьных преобразований в EMaxima

Подробное описание использования интерфейсов интерактивной и пакетной работы с Maxima, а также интерфейса EMaxima приведено в документации Jay Belanger Maxima and Emacs. Найти ее можно в установленной версии Maxima, например,
C:\Program Files\Maxima-5.18.1\share\maxima\5.18.1\doc\EMaximaIntro.ps

Приведу наиболее часто используемые ключи:
C-c C-o Создание стандартной ячейки.
C-c + Переход к следующей ячейке.
C-c - Переход к предыдущей ячейке.
C-c C-u c Обновить (выполнить) текущую ячейку. Результат - в текстовом формате.
C-c C-u C Обновить (выполнить) текущую ячейку. Результат - в формате TeX.
C-c C-d Очистить вывод, генерируемый Maxima для данной ячейки.

Пришло время рассмотрения более серьезного примера использования EMaxima. Для его описания понадобится ввести еще несколько новых понятий, каждое из которых рассмотрим отдельно на простых примерах. Прежде всего, необходимо упомянуть ссылки на другие ячейки.

Ссылки на другие ячейки



Помечаем одну из ячеек, например [filename:definef]. Другая ячейка должна быть также помечена тем же filename, но с уникальной меткой ячейки. Добавялем ссылку <filename:definef>. Ткаим образом, вместо ссылки будет выполнена ячейка с этой меткой. Результат ее работы - также будет отображен в вызывающей ячейке. Таким образом, при вычислении ячейки filename:optional сначала переменной x будет присвоено значение 3, затем выражение в вызывающей ячейке будет вычислено с учетом этого значения.

\begin{maxima}[filename:optional]
<filename:definef>
x^2;
\maximaoutput*
\m 9 \\
\end{maxima}

\begin{maxima}[filename:definef]
x:3$%$
\end{maxima}


Использование $%$ - это предложенный в заметке Графики в EMaxima
способ подавления вывода Maxima в LaTeX-окружении.

Использование произвольных символов при обозначении переменных



Такие символы как a, b, c, x, y, z... не всегда оказываются достаточными для обозначения переменных. Что если нам требуется использовать символы греческого алфавита с подстрочными и надстрочными символами индексами и т.д.? В LaTeX имеются все необходимые средства для работы с ними, но Maxima ничего такого не предоставляет, а корректировать вручную генерируемые формулы слишком непроизводительно, кроме того, велика вероятность случайной ошибки. Ответ на этот вопрос, как ни странно, находится в FAQ Maxima:http://maxima.sourceforge.net/ru/faq.html#TeXOutput0.
Тогда для того чтобы возвести экспоненту в переменную лямбда с подстрочным символом гамма e^{\lambda_{\gamma}} необходимо:

Создать файл vars.lisp где-нибудь неподалеку от редактируемого tex-файла, и записать в нем:
(defprop $lambda_gamma "\\lambda_{\\gamma}" texword)

Тем самым мы ассоциируем обозначение lambda_gamma с его TeX-овым представлением \lambda_{\gamma}
Теперь записываем в ячейке:
\begin{maxima}
load("vars.lisp")$%$
exp(lambda_gamma);
\end{maxima}

Вычисляем C-c C-u C. Результат
\m e^{\lambda_{\gamma}} \\
т.е. как раз e^{\lambda_{\gamma}}

Скрытые элементы текста



Довольно часто бывает удобно иметь некую ячейку, в которой помимо загрузки обозначений переменных выполняются другие инициализирующие действия, которые актуальны для ряда других ячеек. Однако, в результирующем pdf-додкументе нам ее иметь совсем не обязательно. Такие ячейки следует обозначать звездочкой:
\begin{maxima*}
\end{maxima*}


Однако, эту ключевую ячейку также приходится довольно часто редактировать. Можно осуществлять навигацию по ячейкам, но когда их число велико это долго; можно использовать штатные средства Emacs, такие как закладки, но нельзя забывать, что мы используем такое мощное средство как ecb. Значит нам необходим элемент документа, который бы отображался в окне навигации по методам, но при этом отсутствовал в результирующем документе. Ответ был подсмотрен тут http://forum.ru-board.com/topic.cgi?forum=5&topic=30211

%Многострочный комментарий
\newcommand{\hidden}[1]{}
...
\begin{document}
...

\hidden{
\section{Инициализация}}


Комплексный пример


Попросим Maxima решить для нас несложный интеграл и выдать результат в виде, пригодном для использования в результирующем документе.

%-*-EMaxima-*-
\documentclass[russian, ucthesis ,14pt, oneside]{article}
\usepackage{mathtext}%Использование русского текста в формулах
\usepackage[T2A]{fontenc}
\usepackage[cp1251]{inputenc}
\usepackage[russian]{babel}
\usepackage{geometry}
\geometry{verbose,a4paper}
\pagestyle{plain}
\usepackage{emaxima} %Позволяет использование EMaxima
\usepackage{pdfcolmk} %Позволяет использование EMaxima для pdf

\usepackage{amsmath} %для набора мат. формул
\usepackage{mathrsfs} %дополнительные математические шрифты

%Многосторочный комментарий
\newcommand{\hidden}[1]{}

\begin{document}

\fontsize{12pt}{12pt}
\selectfont

\hidden{
\section{Инициализация}}
\begin{maxima*}[filename:definef]
load("vars.lisp")$%$
\end{maxima*}

\begin{maxima*}[filename:optional]
<filename:definef>
'integrate(exp(lambda_gamma*x), x, 0, t);
integrate(exp(lambda_gamma*x), x, 0, t);
\end{maxima*}

\end{document}


Результат вычислений ячейки с меткой filename:optional
\m \int_{0}^{t}{e^{\lambda_{\gamma}\,x}\;dx}\big. \\
\m {{e^{\lambda_{\gamma}\,t}}\over{\lambda_{\gamma}}}-{{1}\over{\lambda_{\gamma}}} \\


Осталось вынести его из окружения Maxima и внести минимальные корректировки:
$$
\int_{0}^{t}{e^{\lambda_{\gamma}\,x}\;dx}\big. \\ =
{{e^{\lambda_{\gamma}\,t}}\over{\lambda_{\gamma}}}-{{1}\over{\lambda_{\gamma}}} \\
$$


Результат:
\int_{0}^{t}{e^{\lambda_{\gamma}\,x}\;dx} ={{e^{\lambda_{\gamma}\,t}}\over{\lambda_{\gamma}}}-{{1}\over{\lambda_{\gamma}}} \\

Пример использования EMaxima

Создаем файл example1.tex, открываем его в emacs.
Содержимое простейшего emaxima - шаблона может иметь вид:

%-*-EMaxima-*-
\documentclass[russian, ucthesis ,14pt, oneside]{article}
\usepackage{mathtext}%Использование русского текста в формулах
\usepackage[T2A]{fontenc}
\usepackage[cp1251]{inputenc}
\usepackage[russian]{babel}
\usepackage{geometry}
\geometry{verbose,a4paper}
\pagestyle{plain}
\usepackage{emaxima} %Позволяет использование EMaxima
\usepackage{pdfcolmk} %Позволяет использование EMaxima для pdf

\usepackage{amsmath} %для набора мат. формул
\usepackage{mathrsfs} %дополнительные математические шрифты

\begin{document}
Hellow Word!
Проверка русского текста.
\end{document}


Компилируем документ выполнив C-c C-c. В случае, если потребуется повторная компиляция (из-за изменения соответствия содержания расположению секций) emacs сообщит об этом. Повторный вызов C-c C-c приведет к открытию скомпилированного example1.pdf в просмотрщике по умолчанию.

В дальнейшем предполагаем, что шапка документа имеет именно такой вид, если специально не оговорено иное.
Добавим ячейку emaxima. Находясь между строками

\begin{document}

\end{document}


наберем C-c C-o. Появится новая ячейка:

\begin{document}
\begin{maxima}[]

\end{maxima}
\end{document}


Попробуем выполнить одно из сложнейших вычислений: наберем 2+2;

\begin{document}
\begin{maxima}[]
2+2;
\end{maxima}
\end{document}

Затем, наберем C-c C-u C (т.е. Ctrl-c Ctrl-u Shift-c). Через несколько мгновений документ примет вид:

\begin{document}
\begin{maxima}[]
2+2;
\maximaoutput*
\m 4 \\
\end{maxima}
\end{document}


Ответ Maxima - 4. Что ж, не поспоришь. Но скомпилировать документ на этот раз не удастся C-c C-c:
! Font T2A/cmtt/m/n/10=latt1000 at 10.0pt not loadable: Metric (TFM) file not found.

По умолчанию EMaxima output имеет размер шрифта 10.0pt, а этот размер не поддерживается шрифтом по умолчанию.
Для нас 10.0pt все равно мелковато, зададим размер шрифта немного побольше:

\begin{document}
\fontsize{12pt}{12pt}
\selectfont

\begin{maxima}[]
2+2;
\maximaoutput*
\m 4 \\
\end{maxima}
\end{document}


Теперь выполнив C-c C-c дважды можно увидеть результат вычислений в более наглядном виде.
Другой путь решения проблемы - менять не размер шрифта, а сам шрифт, например, дописав в шапке документа:

\usepackage{times}

Хотя, мне такой шрифт не очень нравится. С интересом выслушаю альтернативные решения.

четверг, 21 мая 2009 г.

Настройка рабочего окружения EMaxima, или как подружить Emacs, Maxima, EMaxuma, AUCTeX, LaTeX, ecb с Пользователем.

- Я не умею, - признался я. - Не умею летать.
- А вы пробовали? - спросил человек, делая плавный поворот влево. Он, по всей видимости, наслаждался полетом.
- Нет, не пробовал. Но мне кажется, что я не умею.
Человек покачал головой, и все тело его при этом также покачивалось.
- Мне не хочется вас убеждать, - сказал он. - Маршрут у меня сегодня легкий. Могли бы попробовать. Вы не представляете, как это хорошо!
- Представляю, - сказал я. - Это, наверное, полезно?
- Нет ничего более бесполезного! - заявил человек...

Александр Житинский. Искушение.


Взявшись за всякое дело хорошо бы заручиться ответом на ряд вопросов.
  1. Зачем? Зачем все это нужно? Тут сложно подобрать правильный ответ. Пусть каждый его сам себе выберет. Я использовал эту связку при подготовки части материалов для статьи, впрочем одних средств LaTeX с избытком хватает для подготовки не только что целой статьи, но и диссертации.
  2. Для кого? Для любого, кому может потребоваться подготовка материалов математического характера, но по каким-либо причинам не устраивают используемые средства. Я просто буду считать, что эти заметки делаются не зря, если от них будет польза хоть для одного человека.
  3. А что в анонсе? Автоматизация символьных преобразований, представление результатов в наглядном виде, взаимодействие с Word, использование текстовых форматов, впрочем всего не пересказать. Тут скорее так: кто знает что это такое и зачем нужно - объяснять излишне, кто не знает - объяснять бесполезно.

Сразу оговорюсь, что не являюсь знатоком ни одной из перечисленных выше программ/систем/пакетов расширений/<вписать свое>. Однако, так как найти в сети такого комплексного обзора не получилось, попытаюсь привести то, что собрать все же удалось.

Все пассы по вызову дождя были выполнены в ОС Windows XP SP2. Впрочем, к моменту завершения выведения жизнеспособного плодовитого поколения горных хвостосвистящих раков, обязуюсь непременно описать как этого же достичь в одном из Linux-ов (впрочем, как раз у линуксоидов с этим проблем возникнуть не должно).

Итак, в путь!

Maxima


Система компьютерной алгебры Maxima. Официальный сайт:
http://maxima.sourceforge.net/
Вся необходимая документация и/или ссылки на нее присутствует там же:
http://maxima.sourceforge.net/ru/documentation.html
Скачиваем последнюю версию, устанавливаем.
Необходимо убедиться, что путь к файлу maxima.bat прописан в переменной PATH. Если не так - исправить (в моем случае это C:\Program Files\Maxima-5.18.1\bin\).

LaTeX


LaTeX, наиболее популярный набор макрорасширений TeX. Я использовал дистрибутив TeXLive. Официальный сайт:
http://www.tug.org/texlive/
Хорошая подборка ссылок на разнообразную документацию по LaTeX и не только приводится на:
http://forum.ru-board.com/topic.cgi?forum=5&topic=30211
Скачиваем iso-образ дистрибутива, прожигаем DVD, устанавливаем. Для Windows, как правило, припасен графический инсталлятор.
Необходимо убедиться, что путь к файлу pdflatex.exe прописан в переменной PATH. Если не так - исправить (в моем случае это C:\TeXLive2007\bin\win32\).

emacs


Развитый, самодокументированный, настраиваемый, расширяемый экранный редактор реального времени Emacs. Нет нужды комментировать последнюю строчку, таких комментариев уже было сделано предостаточно.
Официальный сайт:
http://www.gnu.org/software/emacs/
Подборка хорошей документации для Emacs - тема отдельного обсуждения. Пока приведу лишь следующую ссылку:
http://www.emacs.uniyar.ac.ru/
Для Emacs выбор используемой версии - задача не столь тривиальная, как в случае с обозначенными выше программными пакетами. Итак, существуют 3 основные сборки Emacs для Windows:
  1. официальная сборка emacs 22.3 для платформы win32 http://www.gnu.org/software/emacs/
  2. emacs 23, собранный из cvs (который, в свою очередь, подразделяется на пропатченный и непропатченный) http://ourcomments.org/Emacs/EmacsW32.html
  3. ntemacs находящийся по адресу http://ntemacs.sourceforge.net/

Первая представляет собой официальную и наиболее стабильную, в то же время, наименее требовательную к ресурсам и быстродействию сборку, применимую для разнопланового использования.
Вторая содержит в себе все последние доработки и исправления. Пропатченная версия, кроме того, имеет наименьшие глюки при скроллинге русского текста (подробнее об этом в дальнейщих заметках), а кроме того, там удобно реализованы server и client.
Третья является официальной версией, используемый для тестирования imaxima под Windows (подробнее об imaxima будет сказано ниже).

В конечном итоге, я остановился на официальной версии emacs 22.3, впрочем наставать на правильности этого решения не следует.
Процесс установки ограничен простой распаковкой архива и выполнением файла addpm.exe, расположенного в директории bin.

Конфигурация emacs - процесс перманентный, здесь я не буду приводить весь процесс настройки, все необходимые корректировки будем обговаривать по ходу добавления тех или иных пакетов расширений. Собственно файл конфигурации находится:
C:\Documents and Settings\{user name}\Application Data\.emacs
если его там нет, то необходимо такой фал добавить. Пакеты расширений в принципе могут находиться где угодно. Для определенности будем использовать:
C:\Documents and Settings\{user name}\Application Data\.emacs.d\

Моя версия конфигурации имеет в основе конфигурацию, взятую с http://www.emacs.uniyar.ac.ru/. Она доступна в googlecode, Mercural-репозитарии. Получить ее можно, выполнив команду
hg clone http://kostafey-emacs-config.googlecode.com/hg/ kostafey-emacs-config

AUCTeX


Всесторонняя, настраиваемая интегрированная среда для редактирования файлов TeX/LaTeX/ConTeXt/Texinfo используя Emacs или XEmacs.
Официальный сайт:
http://www.gnu.org/software/auctex/
Статья по работе с пакетом:
http://xtalk.msk.su/~ott/ru/writings/emacs-tex/AUCTeX.html
При установке я просто распаковал архив пекета auctex-11.85-e22.3-msw.zip в директорию, в которой установлен собственно emacs, благо структура директорий у них совпадает. Конфигурация emacs для AucTeX добросовестно скопирована с http://www.emacs.uniyar.ac.ru/
Данные строчки должны быть добавлены в .emacs:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;Настройки AucTeX
;;
(require 'tex-mik)
(add-hook 'LaTeX-mode-hook 'LaTeX-install-toolbar)
(setq TeX-parse-self t) ; Enable parse on load.
(setq TeX-auto-save t) ; Enable parse on save.
(setq-default TeX-master nil) ; Query for master file.
(setq TeX-PDF-mode t)
(setq TeX-interactive-mode t)
(setq TeX-source-specials-mode 1)
;;модифицируем меню
;;; some more menu entries in the command list:
;;; see tex-mik.el from package auctex: %v is defined in tex-mik.el
;;; other variables are defined in tex.el from auctex
;;; the meaning of some auctex-varibles:
;symbols defined in tex.el and tex-mik.el:
;%b name slave tex-file %t name master tex-file
;%d dvi-file %f ps-file
;%l "latex --src-specials"
;%n line number %p printcommand %q "lpq"
;%r (TeX-style-check TeX-print-style)
;%s master-file-name without extention
;%v yap command view line
(eval-after-load "tex"
'(progn
(add-to-list 'TeX-command-list
(list "->PS landscape for pdf"
"dvips %d -N0 -Ppdf -G0 -T 297mm,210mm -o %f "
'TeX-run-command nil t))
(add-to-list 'TeX-command-list
(list "All Texify run-viewer"
"texify --tex-opt=--src --run-viewer --clean %s.tex"
'TeX-run-command nil t))))
;;
;;Настройки PreviewLatex
(load "preview-latex.el" nil t t)
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

ecb


ecb - Emacs Code Browser. Пакет расширений для Emacs, используемый для повышения удобства навигации по редактируемым файлам.
Официальный сайт:
http://ecb.sourceforge.net/
Данный пакет имеет зависимость от другого - cedet.
cedet - Collection of Emacs Development Environment Tools
Официальный сайт:
http://cedet.sourceforge.net/
Скачиваем данные пакеты и распаковываем (в моем случае это cedet-1.0pre6 и ecb-2.40) в директорию
C:\Documents and Settings\{user name}\Application Data\.emacs.d\

Прописываем добавленные пакеты в .emacs. Конфигурация пакетов может иметь вид:
;;-----------------------------------------------------------------------------
;; Cedet
(setq semantic-load-turn-useful-things-on t)
(load-file "~/.emacs.d/cedet-1.0pre6/common/cedet.el")
(global-set-key [?\C- ] 'semantic-ia-complete-symbol)

(defun my-semantic-hook ()
(semantic-tag-folding-mode 1))
(add-hook 'semantic-init-hooks 'my-semantic-hook)
;;-----------------------------------------------------------------------------

;;-----------------------------------------------------------------------------
;; ECB
(add-to-list 'load-path "~/.emacs.d/ecb-2.40/")
(require 'ecb)
(global-set-key (kbd "\e\el") 'ecb-toggle-ecb-windows)
(global-set-key (kbd "C-x C-a") 'ecb-activate)
(global-set-key (kbd "C-x C-q") 'ecb-deactivate)
(global-set-key "\M-m" 'ecb-goto-window-methods)
;Перезагрузка окна методов после каждого сохранения
(setq imenu-auto-rescan 1)
;;-----------------------------------------------------------------------------

;Длинные строки всегда разбивать при отображении
(setq truncate-lines nil)
(setq truncate-partial-width-windows nil)


Кроме того, для удобства использования ecb в раздел custom-set-variables .emacs необходимо вписать:
(custom-set-variables
...
'(ecb-auto-activate t)
'(ecb-options-version "2.40")
'(ecb-primary-secondary-mouse-buttons (quote mouse-1--C-mouse-1))
'(ecb-source-path (quote ("c:")))
'(ecb-tar-setup (quote cons))
'(ecb-tip-of-the-day nil)
...
'(speedbar-tag-split-minimum-length 200)
...
)

Интерфейсы Maxima, предоставляемые Emacs


Более подробно об интерфейсах Maxima рассказано в статье Тихона Тарнавского http://maxima.sourceforge.net/ru/maxima-tarnavsky-2.html. Здесь пойдет речь лишь об интерфейсах Maxima, предоставляемых Emacs:
  1. maxima - интерактивный режим, аналогичен консольной версии Maxima или интерфейсу Xmaxima. Кроме того, через него осуществляется взаимодействие с процессом Maxima в интерфейсе maxima-mode.
  2. maxima-mode - пакетный режим, аналогично обработке файлов Maxima. Удобство режима залючается в том, что на выполнение можно отправлять как весь файл (или буфер) так и отдельную его часть или одну строку. При первом вызове порождается процесс Maxima, взаимодействие с которым осуществляется через описанный выше интерфейс.
  3. imaxima - интерактивный режим, аналогичен режиму maxima за исключением того, что вывод осуществляется не в текстовом, а в графическом виде, навроде интерфейса wxMaxima.
  4. emaxima - интерфейс, реализуемый внутри LaTeX - документа.


maxima и maxima-mode


Подключение первых двух интерфейсов осуществляется стандартным образом. Файлы расширений Emacs предоставляются самой системой Maxima, необходимо лишь правильно указать путь к ним. Кроме того, необходимо, чтобы режим maxima-mode включался автоматически при редактировании *.mxm - файлов. Добавляем в .emacs:
;; Подключаем Maxima
;; указываем где будут лежать файлы расширений
(add-to-list 'load-path "c:/Program Files/Maxima-5.18.1/share/maxima/5.18.1/emacs/")
(autoload 'maxima "maxima" "Maxima interaction" t)
(autoload 'maxima-mode "maxima" "Maxima mode" t)
(setq auto-mode-alist (cons '("\\.mxm" . maxima-mode) auto-mode-alist))

Команды maxima-mode:
C-c C-C - выполнить строку
C-c C-r - выполнить выделенный блок
C-c C-b - выполнить буфер (т.е. файл)

imaxima


Описание настройки интерфейса находится на сайте разработчика http://members3.jcom.home.ne.jp/imaxima/Site/Easy_Install_on_Windows_XP___Vista.html, новая версия сайта, по-видимому будет здесь http://sites.google.com/site/imaximaimath/download-and-install/easy-install-on-windows-xp

Ниже приведу фрагмент перевода этого описания плюс некоторые специфические особенности настройки imaxima для TeXLive в Windows.

LaTeX (MiKTeX или TeXLive)

Согласно инструкциям необходимо установить MiKTeX 2.7 в путь по умолчанию. Можно использовать и TeXLive дистрибутив LaTeX, но для этого необходимо выполнить еще несколько действий. Будем считать, что TeXLive уже успешно установлен (подробнее об этом - в начале заметки).

Теперь необходимо установить пакет mh. Его можно скачать с CTAN (файл mh.tar.lzma),
(http://tug.ctan.org/cgi-bin/ctanPackageInformation.py?id=mh)
затем распаковать архив (файлы *.sty) в соответствующие директории, в которых располагаюся эти файлы в вашей установленной верси TeXLive.
Затем, запускаем на выполнение команду texhash ~/texmf

Правильность ручной установки пакета mh может быть проверена командой
kpsewhich breqn.sty
которая вернет путь к файлу breqn.sty.
Она находится в директории
{TeXLive installation directory}\bin\win32\kpsewhich.exe

GPL Ghostscript


Прежде всего, необходимо удалить установленные более ранние версии GhostScript. Он может быть уже установлен и не отдельно, а в составе другого приложения, например PDFCreator.
Заходим на http://www.cs.wisc.edu/~ghost/ скачиваем последнюю версию Ghostscript (в моем случае это 8.63), собранную для Windows. Ссылка для скачивания http://prdownloads.sourceforge.net/ghostscript/. Устанавливаем gs863w32.exe, установка должна быть произведена в путь по умолчанию.

Maxima

Она у нас также уже установлена.

NTEmacs 23

Тут следовало бы написать "внимание" с 3 восклицательными знаками, т.к. именно версия, взятая из http://ntemacs.sourceforge.net/ используется для тестирования imaxima под Windows. Впрочем, с imaxima прекрасно работают и последние версии других сборок Emacs. Однако, в случае обнаружения ошибок, прежде чем клепать гневные баг-репорты разработчику imaxima, следует выполнить тестирование именно в NTEmacs.

Открываем файл setup-imaxima-imath.el. Строки
(defvar *imaxima-miktex-bin-dir*
(file-name-directory (car (file-expand-wildcards "c:/Program Files/MiKTeX*/miktex/bin/latex.exe")))
"MiKTeX bin directory, added to exec-path")

должны быть соответствующим образом откорректированы:
(defvar *imaxima-miktex-bin-dir*
(file-name-directory (car (file-expand-wildcards "c:/{TeXLive installation directory}/bin/win32/latex.exe")))
"MiKTeX bin directory, added to exec-path")

Создаем директорию
c:\Windows\tmp

Добавляем следуюшие строчки в файл .emacs:
(load "c:/Program Files/Maxima-5.17.0/share/maxima/5.17.0/emacs/setup-imaxima-imath.el")
(setq imaxima-tmp-dir "C:\\Windows\\tmp")

Запускаем emacs. M-x imaxima [Ret]. Набираем, например, что-то вроде:
(%i1) x^2; [Ret]

emaxima


Настройка emaxima теперь сводится лишь к указанию в файле .emacs:
(autoload 'emaxima-mode "emaxima" "EMaxima" t)
(add-hook 'emaxima-mode-hook 'emaxima-mark-file-as-emaxima)

Все!

Таким образом, настройка всех режимов может быть прописана в виде:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Настройка Maxima
;;
(load "c:/Program Files/Maxima-5.18.1/share/maxima/5.18.1/emacs/setup-imaxima-imath.el")
(setq imaxima-tmp-dir "C:\\Windows\\tmp")
;; Подключаем Maxima
;; указываем где будут лежать файлы расширений
(add-to-list 'load-path "c:/Program Files/Maxima-5.18.1/share/maxima/5.18.1/emacs/")
(autoload 'maxima "maxima" "Maxima interaction" t)
(autoload 'maxima-mode "maxima" "Maxima mode" t)
; C-c C-C - выполнить строку
; C-c C-r - выполнить выделенный блок
; C-c C-b - выполнить буфер (т.е. файл)
(setq auto-mode-alist (cons '("\\.mxm" . maxima-mode) auto-mode-alist))
;; M-X emaxima-mode
(autoload 'emaxima-mode "emaxima" "EMaxima" t)
(add-hook 'emaxima-mode-hook 'emaxima-mark-file-as-emaxima)
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Заметки о работе с ecb

Наличие окна с названиями секций и подсекций с возможностью перехода к выбранной - очень удобная возможность. Ключи по умолчанию довольно длинные. Можно использовать следующую привязку:

(global-set-key "\M-m" 'ecb-goto-window-methods)

Выбрав нужную секцию, переходим к ее редактированию нажатием [RET].

Построение того, что называется "окно методов" (window-methods), в нашем случае - содержание LaTeX - документа осуществляется внешними по отношению к ecb средствами, поэтому для корректировки содержания при каждом сохранении необходимо указать:

;Перезагрузка окна методов после каждого сохранения
(setq imenu-auto-rescan 1)


Кроме того, установка ecb отменяет установленные по умолчанию переносы строк, которые не помещаются в окне редактора, на новую строку. Т.к. EMaxima может генерировать довольно длинные TeX - формулы в строку это бывает довольно неудобно. Для того чтобы вернуть перенос строк, нужно теперь указать это явно:

;Длинные строки всегда разбивать
(setq truncate-lines nil)
(setq truncate-partial-width-windows nil)

суббота, 16 мая 2009 г.

Графики в EMaxima

Что же необходимо для того чтобы уметь удобный способ добавления графиков?

Если используется pdflatex, то лучше не применять формат eps. Необходимо использовать png (или подобный графический формат). В случае использования latex все с точностью до наоборот.

Примеры из документации к Maxima:

plot2d (sin(x), [x, 0, 2*%pi], [psfile, "sin.eps"])$
plot2d (sin(x), [x, 0, 2*%pi], [gnuplot_term, png], [gnuplot_out_file, "sin.png"])$


Неприятность заключается в том, что знак "$" - есть начало (или конец) формулы в tex. Соответственно, подсветкой синтаксиса AUCTeX он именно так и воспринимается, сбивая с толку. Достаточно замкнуть формулу еще одним значком "$". Но то что формула для tex, для Maxima - ввод, который должен быть непустым. Достаточно вставить значение последнего вывода, которое, очевидно, будет пустым "%".

Имя файла с рисунком желательно писать лишь однажды, чтобы в случае необходимости его изменения не приходилось вносить правки во всем файле. Для этого используем текстовую переменную.

Функция Maxima print() вставляет пробелы между выводимыми фрагментами строки, поэтому воспользуемся конкатенацией.

Кроме того, если промежуточные действия Maxima в результирующем файле не нужны, то достаточно в объявлении ячейки EMaxima вставить звездочки "*".

В результате ячейка может иметь вид:

\begin{maxima*}
OutFile : "img/graph.png"$%$
plot2d (sin(x), [x, 0, 2*%pi], [gnuplot_term, png], [gnuplot_out_file, OutFile])$%$
print(concat("\\includegraphics[width=15cm]{",OutFile,"}"))$%$
\end{maxima*}


После вычисления данной ячейки (C-c C-u c) в директорию img (данная директория к этому моменту должна существовать), находящийся в той же директории, что и редактируемый файл будет выведен график функции, а в редактируемый файл выведется инструкция для tex по добавлению рисунка, для использования которого достаточно вынести его из окружения ячейки EMaxima:

\includegraphics[width=15cm]{img/graph.png}