среда, 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 г.

Взаимодействие с MS Word

Возможно, кто-то захочет спросить WTF MS Word? (что такое MS Word?) И в шутку и в серьез. Что тут можно ответить? Я и сам не знаю что такое MS Word, но при этом активно использую... пока еще приходится.
Собственно, решение давно найдено: http://dxdy.ru/topic183.html

Все что требуется это установить MathType (я использовал версию 6.0c). Далее в меню MathType Установки выбрать Установки Трансляторов. В открывшемся окне в меню "Tpaнcлятop:" выбрать один из TeX-трансляторов (например "TeX -- AMS-LateX")

Галочек напротив "Bключaть имя тpaнcлятopa в пepeвoд" и "Bключaть дaнныe MathType в пepeвoд" быть не должно. Все, теперь можно копировать LaTeX - формулу в окно редактора MathType, получая редактируемую формулу Word и наоборот, можно копировать формулу из MathType и получать LaTeX - формулу в текстовом виде.

Единственный недостаток - невозможность работы с русскими буквами в формулах. Их необходимо будет дописывать вручную.

Пример символьных преобразований в 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}

пятница, 15 мая 2009 г.

Открытие блога

Применив к организму i+1 порцию Позитивно Интенсифицирующего Водосодержащего Отупителя было принято решение об открытии блога.

Не всегда можно заставить Maxima представлять результат
в том виде, в котором ожидается.

Так, исходное выражение в Maxima:
(1 - exp(-((lambda_xi_1 + lambda_xi_2))*t))

Ожидаем:
\left(1-e^{-\left(\lambda_{\xi_2}+\lambda_{\xi_1}\right)\,t}\right)

\left(1-e^{-\left(\lambda_{\xi_2}+\lambda_{\xi_1}\right)\,t}\right)

Однако, на выходе имеем:
\left(1-e^{\left(-\lambda_{\xi_2}-\lambda_{\xi_1}\right)\,t}\right)

\left(1-e^{\left(-\lambda_{\xi_2}-\lambda_{\xi_1}\right)\,t}\right)

Попробовав привести к желаемому, например через
ratsimp(1 - exp(-((lambda_xi_1 + lambda_xi_2))*t))

Получим:
e^ {- \left(\lambda_{\xi_2}+\lambda_{\xi_1}\right)\,t }\,\left(e^{\left(\lambda_{\xi_2}+\lambda_{\xi_1}\right)\,t}-1\right)

e^ {- \left(\lambda_{\xi_2}+\lambda_{\xi_1}\right)\,t }\,\left(e^{\left(\lambda_{\xi_2}+\lambda_{\xi_1}\right)\,t}-1\right)

Другие функции не приведут к ожидаемому виду.
Использование знака " ' " который отменяет вычисления
также не помогает.

В этом случае, генерируемую формулу приходится
редактировать вручную...