вторник, 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}

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