tag:blogger.com,1999:blog-61589993803226494052024-03-13T03:21:23.132-07:00Kostafey's BlogKostafeyhttp://www.blogger.com/profile/14975242423333810114noreply@blogger.comBlogger13125tag:blogger.com,1999:blog-6158999380322649405.post-58089051074316431702014-05-02T15:33:00.001-07:002014-05-03T04:02:35.109-07:00Fuzzy matching в popup-switcher с использованием flxНаконец добрался до fuzzy matching в <a href="https://github.com/kostafey/popup-switcher">popup-switcher</a>. Есть
несколько решений для осуществления нечеткого поиска в Emacs. Например:
<ul>
<li> <a href="https://github.com/lewang/flx">flx</a>
<li> <a href="https://github.com/auto-complete/fuzzy-el">fuzzy-el</a>
</ul>
<h2>Настройка</h2>
<p>В popup-switcher используется <a href="https://github.com/lewang/flx">flx</a>. ИМХО,
это просто прекрасный движек для нечеткого поиска, хотя автор и предупреждает о
том, что проект достаточно молодой и возможно еще остались ошибки.
<p>В flx-ido есть более высокоуровневые функции, поэтому фактически зависимость
именно от flx-ido.
<p>Как и в случае с CEDET и projectile, явно зависимость не указывается (чтобы не
превращать popup-switcher в монстра с большим количеством обязательных
зависимостей). Чтобы воспользоваться возможностью нечеткого поиска, необходимо
установить <a href="https://github.com/lewang/flx">flx</a> и <a
href="https://github.com/lewang/flx">flx-ido</a> любым удобным вам способом,
например через MELPA:
<div class="src">
<pre><span class="idle-highlight"> M-x</span> package-install [RET] flx-ido [RET]</pre>
</div>
Кроме этого, необходимо установить <span class="constant"><b>psw-use-flx</b></span> в значение t
<div class="src">
<pre>
(setq psw-use-flx t)</pre>
</div>
<h2>Пример использования</h2>
Например, неообходимо найти
функцию <span class="constant"><b>psw-get-item-by-name</b></span>.
Вызываем <span class="constant"><b>psw-switch-function</b></span> (любым
выбранным клавиатурным сочетанием), набираем первые буквы слов "get" и "item" -
"gi", flx сузит список поиска и отсортирует по релевантности:<br>
<img border="0" src="https://dl.dropboxusercontent.com/u/820526/popup-switcher-flx.png"/>
<div>Пример использования flx в popup-switcher.</div>
<h2>P.S.</h2> Happy hacking! :)
Kostafeyhttp://www.blogger.com/profile/14975242423333810114noreply@blogger.com0tag:blogger.com,1999:blog-6158999380322649405.post-45368589966526307022013-11-05T03:36:00.001-08:002013-11-05T06:06:19.606-08:00popup-switcher - переключение буферов и навигация по функциям, используя TUI-меню<h2>Эргономика промышленных решений</h2>
С некоторого времени для разработки на Java я использую IntelliJ
IDEA. Какова там навигация по файлам или по методам! Нажимаешь
C-S-n (или C-n для классов) и появляется окошко поиска со
списком. Вводишь буквы из названия файла и список сокращается -
самый удобный способ навигации по файлам проекта. Аналогично
C-F12 для навигации по методам открытого класса - интерактивно
изменяющееся меню на основе вводимых символов из имени
метода. Ничего эргономичнее до этого не видел.
<h2>Изящество и красота текстовых интерфейсов</h2>
В 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-интерфейс там, где создание отдельного окна избыточно.
<h2>TUI в emacs</h2>
Библиотеки <a href="https://github.com/auto-complete/popup-el">popup-el</a> (выпадающие меню) и
<a href="https://github.com/m2ym/direx-el">direx-el</a> (деревья) - примеры расширений, предоставляющих некоторую
функциональность TUI. К сожалению, предоставляется лишь некоторая часть
возможных виджетов, но тем не менее, имеющиеся весьма удобны.
<p>Так, например, первая из них позволила мне реализовать в TUI некоторые из идей,
используемых в IntelliJ
IDEA: <a href="https://github.com/kostafey/popup-switcher">popup-switcher</a>.
Вызов интерактивной функции
<ul>
<li><span class="constant"><b>psw-switch-buffer</b></span> - приведет к появлению
списка открытых буферов. Ввод символов имени буфера будет сокращать
список. Именно в качестве (еще одного) механизма переключения буферов и
задумывался изначально <a href="https://github.com/kostafey/popup-switcher">popup-switcher</a>, однако на самом деле, он может быть
использован для переключения чего угодно (отсюда и название).
<li><span class="constant"><b>psw-switch-projectile-files</b></span> - работает со всеми файлами проекта (файлы проекта рассматриваются в контексте расширения <a href="https://github.com/bbatsov/projectile">projectile</a>).
<li><span class="constant"><b>psw-switch-function</b></span> - работает с функциями/методами в текущем файле.
</ul>
<img border="0" src="https://dl.dropboxusercontent.com/u/820526/psw-switch-buffer.png"/>
<div>Пример навигации по буферам.</div>
<img border="0" src="https://dl.dropboxusercontent.com/u/820526/psw-switch-function.png"/>
<div>Пример навигации по функциям в файле с исходным кодом на Clojure.</div>
<h2>Установка</h2>
Установка расширения довольно проста. Добавьте MELPA в вашу переменную
<span class="constant"><b>package-archives</b></span> (если у вас он еще не был добавлен):
<div class="src">
<pre>
(<span class="keyword">require</span> '<span class="constant">package</span>)
(add-to-list 'package-archives
'(<span class="string">"melpa"</span> . <span class="string">"http://melpa.milkbox.net/packages/"</span>))
(package-initialize)</pre>
</div>
Далее <a href="https://github.com/kostafey/popup-switcher">popup-switcher</a> устанавливается командой:
<div class="src">
<pre>
<span class="idle-highlight"> M-x</span> package-install [RET] popup-switcher [RET]</pre>
</div>
Кроме того, в файле инициализации .emacs необходимо указать:
<div class="src">
<pre>
(<span class="keyword">require</span> '<span class="constant">popup-switcher</span>)</pre>
</div>
<h2>Настройка</h2>
После установки <span class="constant"><b>psw-in-window-center</b></span> в значение t всплывающее меню будет
появляться в середине окна. По умолчанию появляется в посередине меду левым
краем окна и значением <span class="constant"><b>fill-column</b></span>.
<div class="src">
<pre>
(setq psw-in-window-center t)</pre>
</div>
Вы можете установить интерактивные функции переключения буферов и навигации по
методам для определенных клавиатурных сочетаний на ваш вкус, например:
<div class="src">
<pre>
(global-set-key [f2] 'psw-switch-buffer)
(global-set-key (kbd "C-S-n") 'psw-switch-projectile-files)</pre>
</div>
Для активации возможности навигации по функциям/методам необходимо установить
последнюю версию <a href="http://cedet.sourceforge.net/bzr-repo.shtml">CEDET</a> и подключить библиотеку eassist. Это не является
обязательным, и вы можете использовать popup-switcher без CEDET (и, очевидно,
без данной функциональности). Пример настройки:
<div class="src">
<pre>
<span class="comment-delimiter"> ;; </span><span class="comment">Activate semantic
</span> (semantic-mode 1)
<span class="comment-delimiter"> ;; </span><span class="comment">Load contrib library
</span> (add-to-list 'load-path <span class="string">"~/.emacs.d/cedet/contrib/"</span>)
(<span class="keyword">require</span> '<span class="constant">eassist</span>)
(<span class="keyword">eval-after-load</span> <span class="string">"eassist"</span>
'(global-set-key [f3] 'psw-switch-function))</pre>
</div>
<h2>Добавление переключений</h2>
Добавлять новые применения механизма переключения очень просто, так функция
<span class="constant"><b>psw-switch-buffer</b></span> выглядит следующим образом:
<div class="src">
<pre>
(<span class="keyword">defun</span> <span class="function-name">psw-switch-buffer</span> ()
(interactive)
(psw-switcher
<span class="builtin">:items-list</span> (psw-get-buffer-list)
<span class="builtin">:item-name-getter</span> 'buffer-name
<span class="builtin">:switcher</span> 'switch-to-buffer))</pre>
</div>
где
<ul>
<li><span class="constant"><b>items-list</b></span> - список, в котором осуществляется выбор (<span class="constant"><b>psw-get-buffer-list</b></span> -
просто использует встроеную функцию <span class="constant"><b>buffer-list</b></span> с некоторыми дополнительными
фильтрами).
<li><span class="constant"><b>item-name-getter</b></span> - функция получения текстового обозначения каждого элемента
списка в меню выбора.
<li><span class="constant"><b>switcher</b></span> - функция, описывающая что делать с выбранным элементом.
</ul>
<h2>Заключение</h2>
Для emacs существуют хоть и не всеобъемлющие, но весьма удобные библиотеки
работы с
TUI. Например, <a href="https://github.com/auto-complete/popup-el">popup-el</a>
уже использующаяся в
проектах <a href="https://github.com/auto-complete/auto-complete">auto-complete</a> и
<a href="https://github.com/tkf/emacs-jedi">emacs-jedi</a>, а теперь и в <a href="https://github.com/kostafey/popup-switcher">popup-switcher</a>.
<p>Библиотека <a href="https://github.com/m2ym/direx-el">direx-el</a> используется, например, в
проекте <a href="https://github.com/tkf/emacs-jedi-direx">emacs-jedi-direx</a>. direx-el
потенциально может выступать в качестве основы для более простого и современного
аналога <a href="http://ecb.sourceforge.net/">ECB</a>. Конечно, в данном случае создание нового окна будет необходимо, но
мне кажется, что это как раз тот случай, когда это оправдано.
<p>Надеюсь, вас зантересовала идея более широкого применения TUI в emacs, а также написания
и развития расширений, как использующих эти возможности, так и предоставляющих
новые возможности для TUI - виджетов.
Kostafeyhttp://www.blogger.com/profile/14975242423333810114noreply@blogger.com3tag:blogger.com,1999:blog-6158999380322649405.post-25957777285736750632012-10-19T05:05:00.001-07:002012-10-19T06:35:20.665-07:00Функциональная и информативная mode-lineДавно хотелось сделать отображаемую в emacs mode-line информацию более
понятной. В то же время, слишком отходить от стандартного вида тоже не хотелось,
т.к. уже есть много всего удобного, например всплывающее меню для основного
режима.
Конечно, прежде всего хотелось поменять обозначение кодировки, признак read-only
и признак того, что буфер был изменен. По этому поводу
<a href="http://ergoemacs.org/emacs/modernization_mode_line.html">Xah Lee</a> верно
подметил, что начало mode-line выглядит загадочно :).
За основу я взял описание конфигурации в
<a href="http://emacs-fu.blogspot.com/2011/08/customizing-mode-line.html">emacs-fu</a>.
<p>
Несколько ключевых моментов:
<ul>
<li><div class="src">mode-line-mule-info</div> о сдной стороны не слишком
красива и информативна, зато позволяет переключать кодировки и символ завершения
строк мышкой (и да, я польуюсь мышкой в emacs :)).
<li><div class="src">buffer-file-coding-system</div> все что нужно для красивого
описания текущей кодировки.
<li><div class="src">mode-line-buffer-identification</div> имя буфера (как в
стандартой mode-line)
<li><div class="src">mode-line-modes</div> еще одна важная деталь из стандартной
mode-line, которая отображает список minor-mode, сужения и ассоциированный с
буфером процесс.
<li> Положение курсора в буфере, идентификация режима Insert/Overwrite взята
из <a href="http://emacs-fu.blogspot.com/2011/08/customizing-mode-line.html">emacs-fu</a>.
</ul>
<p>
В итоге получилось так:
<div class="separator" style="clear: both; text-align: center;">
<a href="https://lh3.googleusercontent.com/-GXXeHJsnkfQ/UIE4851q1bI/AAAAAAAAACw/JwsU030uJp0/s912/mode-line.PNG"
imageanchor="1" style="clear:left; float:left;margin-right:1em;
margin-bottom:1em">
<img border="0" src="https://lh3.googleusercontent.com/-GXXeHJsnkfQ/UIE4851q1bI/AAAAAAAAACw/JwsU030uJp0/s912/mode-line.PNG"
/></a></div>
Полный вариант данной конфигурации на
<a href="https://bitbucket.org/kostafey/kostafeys-emacs-confik/src/53d8277b435a4f95abae23c475ab8fc701fcdc13/.emacs.d/custom/mode-line-conf.el?at=default">
bitbucket</a>.
Kostafeyhttp://www.blogger.com/profile/14975242423333810114noreply@blogger.com0tag:blogger.com,1999:blog-6158999380322649405.post-85035892712765852312012-10-08T00:14:00.001-07:002012-10-08T00:17:07.555-07:00PageUp/PageDown в меню auto-completeПосле длительного сидения на 1.2, обновился до версии
1.4 <a href="http://cx4a.org/software/auto-complete/">auto-complete.el</a>
(через ELPA). Красота, да еще и со всплывающими подсказками.
Первое что захотелось сделать перевесить вызов как в популярных IDE:
<div class="src"><pre> (define-key ac-mode-map (kbd <span class="string">"C-SPC"</span>) 'auto-complete)</pre></div>
Уже на списке автодополнений захотелось нажать привычную для IDE
PageDown для прокрутки по списку. Ан нет, emacs выполняет прокрутку на
странице. Сделаем возможность PageDown/PageUp на меню автодополнений:
<div class="src"> <pre>
(<span class="keyword">defun</span> <span class="function-name">ac-page-next</span> ()
<span class="doc">"Select next completion candidate per `</span><span class="constant"><span class="doc">ac-menu-height</span></span><span class="doc">' range.
Pages down through completion menu."</span>
(interactive)
(<span class="keyword">let</span> ((counter 0))
(<span class="keyword">dotimes</span> (counter (1- ac-menu-height))
(ac-next))))
(<span class="keyword">defun</span> <span class="function-name">ac-page-previous</span> ()
<span class="doc">"Select previous completion candidate per `</span><span class="constant"><span class="doc">ac-menu-height</span></span><span class="doc">' range.
Pages up through completion menu."</span>
(interactive)
(<span class="keyword">let</span> ((counter 0))
(<span class="keyword">dotimes</span> (counter (1- ac-menu-height))
(ac-previous))))</pre></div>
<div class="src"><pre>(define-key ac-complete-mode-map [next] 'ac-page-next)
(define-key ac-complete-mode-map [prior] 'ac-page-previous)
</pre></div>
Поиск в меню давно хотелось перевесить, но все ни как руки не доходили.
isearch-forward у меня висит на C-f, соответственно меняем:
<div class="src"><pre>(define-key ac-complete-mode-map (kbd <span class="string">"C-f"</span>) 'ac-isearch)</pre></div>
Kostafeyhttp://www.blogger.com/profile/14975242423333810114noreply@blogger.com0tag:blogger.com,1999:blog-6158999380322649405.post-8828258873470175792009-10-07T00:13:00.000-07:002009-10-07T02:00:16.612-07:00Компоновка CLASSPATH с помощью emacs и muCommanderВообще, CLASSPATH имеет по сути отношение к настоящей заметке как французское полусладкое к физике жидкости, но идея возникла именно в тот момент когда я в очередной раз компоновал CLASSPATH. На самом же деле объединением строк случается пользоваться не только и столько для этого. CLASSPATH - штука капризная. Бывает не любит пробелы или русские буквы в путях. А бывает этот фокус работает "на ура". Конечно, традиционно стараешься этого избежать. Тем не менее, иногда необходимо сформировать строку, в которой должна быть записана "пачка", "jar-ников". Иногда, этот процесс приходится повторять... Иногда и не раз...<br /> Хочется этот процесс автоматизировать. Искать специализированные решения - несколько дико.<br /> В качестве файлового менеджера я использую <a href="http://www.mucommander.com/">muCommander</a>. Он реализует минимально необходимый набор функций файлового менеджера, не пытаясь стать системой по управлению ОС (аля TotalCommander), но и не столь аскетичен как dired (хотя, возможно, и менее гибок). Кроме того, cross-platform (java), распространяется под GPL. Настройка muCommander для того, чтобы emacs стал редактором по умолчанию, выглядит следующим образом:<br />В ~\.mucommander\preferences.xml указывается<br /><blockquote><div class="src"><pre><span class="nxml-tag-delimiter"><</span><span class="nxml-element-local-name">editor</span><span class="nxml-tag-delimiter">></span><br /> <span class="nxml-tag-delimiter"><</span><span class="nxml-element-local-name">use_custom</span><span class="nxml-tag-delimiter">></span><span class="nxml-text">true</span><span class="nxml-tag-delimiter"><</span><span class="nxml-tag-slash">/</span><span class="nxml-element-local-name">use_custom</span><span class="nxml-tag-delimiter">></span><br /> <span class="nxml-tag-delimiter"><</span><span class="nxml-element-local-name">custom_command</span><span class="nxml-tag-delimiter">></span><span class="nxml-text">emacsclientw.exe -n </span><span class="nxml-entity-ref-delimiter">&</span><span class="nxml-entity-ref-name">quot</span><span class="nxml-entity-ref-delimiter">;</span><span class="nxml-text">$f</span><span class="nxml-entity-ref-delimiter">&</span><span class="nxml-entity-ref-name">quot</span><span class="nxml-entity-ref-delimiter">;</span><span class="nxml-tag-delimiter"><</span><span class="nxml-tag-slash">/</span><span class="nxml-element-local-name">custom_command</span><span class="nxml-tag-delimiter">></span><br /><span class="nxml-tag-delimiter"><</span><span class="nxml-tag-slash">/</span><span class="nxml-element-local-name">editor</span><span class="nxml-tag-delimiter">></span></pre></div></blockquote><br /> Возвращаемся к CLASSPATH. Находясь в директории библиотеки, например C:\JavaLib\axis\ нажимаем (ключи я описал в стиле emacs, но все это, конечно, выполняется в muCommander):<br /> C-a<br /> M-S-c<br />Это приведет к тому, что пути к файлам будут скопированы в буфер обмена. Переходим в некоторый буфер emacs, например,temp. Вставляем содержимое буфера обмена (C-v или C-y в зависимости от настроек). Его содержимое принимает следующий вид, например:<br /><pre><span class="src">C:\JavaLib\axis\axis-ant.jar<br />C:\JavaLib\axis\axis.jar<br />C:\JavaLib\axis\commons-discovery-0.2.jar<br />C:\JavaLib\axis\commons-logging-1.0.4.jar<br />C:\JavaLib\axis\jaxrpc.jar<br />C:\JavaLib\axis\log4j-1.2.8.jar<br />C:\JavaLib\axis\saaj.jar<br />C:\JavaLib\axis\wsdl4j-1.5.1.jar</span></pre><br />Подобным образом дополняем список из библиотек других директорий.<br />Ниже предлагается ряд функций. Может, это и не очень существенная разработка :), но для меня частота их использования конкурирует разьве только что с к командами движения курсора.<br /><blockquote><div class="src"><pre><span class="comment-delimiter">;;</span><span class="comment">=============================================================================<br /></span><span class="comment-delimiter">;; </span><span class="comment">Join lines<br /></span><span class="comment-delimiter">;;</span><span class="comment">=============================================================================<br /></span>(<span class="keyword">defun</span> <span class="function-name">circle-processing</span> (arg function)<br /> <span class="doc">"Circle call 'function' 'arg' times, default - once"</span><br /> (interactive)<br /> (<span class="keyword">progn</span><br /> (<span class="keyword">if</span> arg<br /> (setq times arg)<br /> (setq times 1)) <br /> (<span class="keyword">let</span> (counter)<br /> (<span class="keyword">dotimes</span> (counter times)<br /> (apply function nil)))))<br /><br />(<span class="keyword">defun</span> <span class="function-name">join-next-line-space</span> ()<br /> <span class="doc">"Joins next line with current with a space between them"</span><br /> (interactive)<br /> (<span class="keyword">progn</span><br /> (end-of-line)<br /> (next-line)<br /> (join-line)))<br /><br />(<span class="keyword">defun</span> <span class="function-name">join-next-line</span> ()<br /> <span class="doc">"Joins next line with current without space between them"</span><br /> (interactive)<br /> (<span class="keyword">progn</span><br /> (join-next-line-space)<br /> (delete-char 1)))<br /><br />(<span class="keyword">defun</span> <span class="function-name">join-next-line-semicolon</span> ()<br /> <span class="doc">"Joins next line with current with semicolon between them"</span><br /> (interactive)<br /> (<span class="keyword">progn</span><br /> (join-next-line)<br /> (insert <span class="string">";"</span>)))<br /><br />(<span class="keyword">defun</span> <span class="function-name">join-next-line-space-n</span> (<span class="type">&optional</span> arg)<br /> <span class="doc">"Joins number of next lines with current with a space between them"</span><br /> (interactive <span class="string">"P"</span>)<br />(circle-processing arg 'join-next-line-space))<br />(global-set-key <span class="string">"\C-j"</span> 'join-next-line-space-n)<br /><br />(<span class="keyword">defun</span> <span class="function-name">join-next-line-n</span> (<span class="type">&optional</span> arg)<br /> <span class="doc">"Joins number of next lines with current without space between them"</span><br /> (interactive <span class="string">"P"</span>)<br />(circle-processing arg 'join-next-line))<br />(global-set-key <span class="string">"\C-cj"</span> 'join-next-line-n)<br /><br />(<span class="keyword">defun</span> <span class="function-name">join-next-line-semicolon-n</span> (<span class="type">&optional</span> arg)<br /> <span class="doc">"Joins number of next lines with current with semicolon between them"</span><br /> (interactive <span class="string">"P"</span>)<br />(circle-processing arg 'join-next-line-semicolon))<br />(global-set-key <span class="string">"\C-c\C-j"</span> 'join-next-line-semicolon-n)<br /></pre></div></blockquote><br />Так, точка в начале буфера. <br />M-<число строк> C-c C-j (join-next-line-semicolon-n). <br />CLASSPATH готов.<br />Обратная задача - преобразование из строки в список удобный для чтения. Вставив строку CLASSPATH в буфер набираем:<br />M-x replace-string ; <RET> ; C-q <RET> <RET><br />К сожалению, перевод строки и/или возврат каретки будет представлен в буфере символом ^M вместо собственно начала новой строки. Но скопировав этот фрагмент из emacs, текст представляется в том виде, в котором изначально и ожидалось.<br /><br />P.S. При поддержке emacs@conference.jabber.ru :)<br />P.P.S. Комментарии приветствуются, прежде всего, по стилю написания на elisp (можно ли что-то упростить, унифицировать, etc).Kostafeyhttp://www.blogger.com/profile/14975242423333810114noreply@blogger.com4tag:blogger.com,1999:blog-6158999380322649405.post-16096743310361991792009-09-26T10:31:00.000-07:002009-09-26T11:07:51.631-07:00Ограничения размера буфера для imenuСегодня обнаружил, что содержимое LaTeX-документа в окне методов ecb вдруг перестало автоматически перестраиваться по сохранению. Долго пытался понять что ж такого наизменял в .emacs, чтобы это перестало работать. На всякий пожарный попробовал старые конфиги, переустановил последовательно ecb, emacs, мир... :)<br /><br />Но долго сказка сказывается, да скоро проблема решается:<br /><blockquote><div class="src"><pre><span class="comment-delimiter">;</span><span class="comment">Imenu auto-rescan is disabled in buffers larger than this size (in bytes).<br /></span>(setq imenu-auto-rescan-maxout 600000)</pre></div></blockquote>Kostafeyhttp://www.blogger.com/profile/14975242423333810114noreply@blogger.com0tag:blogger.com,1999:blog-6158999380322649405.post-90841797817583125902009-07-28T05:39:00.000-07:002009-07-28T06:26:04.770-07:00Emacs, Aspell и одновременное использование словарей.Недавно задался вопросом как осуществлять проверку правописания для буфера, в котором есть как русские, так и английские слова.<br />На <a href="http://www.linux.org.ru/view-message.jsp?msgid=3892853">ЛОРе</a> подсказали <a href="http://pastebin.ca/679988">решение</a>, которое показалось мне вполне приемлемым. Привожу его в том виде, в котором оно осталось в моем .emacs (т.е. почти без изменений):<br /><blockquote><div class="src"><pre><span class="comment-delimiter">;;</span><span class="comment">=============================================================================<br /></span><span class="comment-delimiter">;;</span><span class="comment"><br /></span><span class="comment-delimiter">;;</span><span class="comment">Настройка проверки правописания Ispell<br /></span><span class="comment-delimiter">;;</span><span class="comment"><br /></span>(<span class="keyword">require</span> '<span class="constant">flyspell</span>)<br />(<span class="keyword">require</span> '<span class="constant">ispell</span>)<br /><br />(setq<br /><span class="comment-delimiter">; </span><span class="comment">i like aspel, and you?<br /></span> ispell-program-name <span class="string">"aspell"</span><br /><br /><span class="comment-delimiter">; </span><span class="comment">my dictionary-alist, using for redefinition russian dictionary<br /></span> ispell-dictionary-alist<br />'((<span class="string">"english"</span> <span class="comment-delimiter">; </span><span class="comment">English<br /></span> <span class="string">"[a-zA-Z]"</span><br /> <span class="string">"[</span><span class="string"><span class="negation-char">^</span></span><span class="string">a-zA-Z]"</span><br /> <span class="string">"[']"</span><br /> nil<br /> (<span class="string">"-d"</span> <span class="string">"en"</span>)<br /> nil iso-8859-1)<br />(<span class="string">"russian"</span> <span class="comment-delimiter">; </span><span class="comment">Russian<br /></span> <span class="string">"[АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдеёжзийклмнопрстуфхцчшщьыъэюя]"</span><br /> <span class="string">"[</span><span class="string"><span class="negation-char">^</span></span><span class="string">АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдеёжзийклмнопрстуфхцчшщьыъэюя]"</span><br /> <span class="string">"[-]"</span><br /> nil<br /> (<span class="string">"-C"</span> <span class="string">"-d"</span> <span class="string">"ru"</span>)<br /> nil utf-8)<br />(nil <span class="comment-delimiter">; </span><span class="comment">Default<br /></span> <span class="string">"[A-Za-z]"</span><br /> <span class="string">"[</span><span class="string"><span class="negation-char">^</span></span><span class="string">A-Za-z]"</span><br /> <span class="string">"[']"</span><br /> nil<br /> (<span class="string">"-C"</span>)<br /> nil iso-8859-1))<br /><br />ispell-russian-dictionary <span class="string">"russian"</span><br />ispell-english-dictionary <span class="string">"english"</span><br />flyspell-default-dictionary ispell-russian-dictionary<br />ispell-dictionary ispell-english-dictionary<br />ispell-local-dictionary ispell-russian-dictionary<br />ispell-extra-args '(<span class="string">"--sug-mode=ultra"</span>))<br /><br />(<span class="keyword">defun</span> <span class="function-name">flyspell-russian</span> ()<br />(interactive)<br />(flyspell-mode t)<br />(ispell-change-dictionary ispell-russian-dictionary)<br />(flyspell-buffer)<br />(message <span class="string">"Russian dictionary - Spell Checking completed."</span>))<br /><br /><span class="comment-delimiter">; </span><span class="comment">English<br /></span>(<span class="keyword">defun</span> <span class="function-name">flyspell-english</span> ()<br />(interactive)<br />(flyspell-mode t)<br />(ispell-change-dictionary ispell-english-dictionary)<br />(flyspell-buffer)<br />(message <span class="string">"English dictionary - Spell Checking completed."</span>))<br /><br />(setq ispell-highlight-face (quote flyspell-incorrect))<br />(setq ispell-have-new-look t)<br />(setq ispell-enable-tex-parser t)<br />(add-hook 'text-mode-hook 'flyspell-mode)<br />(setq flyspell-delay 1)<br />(setq flyspell-always-use-popup t)<br /><br />(global-set-key [f1] 'ispell-word)<br />(global-set-key [f7] 'ispell-buffer)<span class="comment-delimiter">; </span><span class="comment">проверить орфографию в текущем буфере<br /></span>(global-set-key [f8] 'ispell-region)<br />(global-set-key [f9] 'auto-fill-mode)<span class="comment-delimiter">; </span><span class="comment">вкл/выкл автозаполнения<br /></span>(global-set-key [f10] 'flyspell-english)<br />(global-set-key [f11] 'flyspell-russian)<br />(global-set-key [f12] 'flyspell-mode)<span class="comment-delimiter">; </span><span class="comment">вкл/выкл проверки орфографии "на ходу"<br /></span><span class="comment-delimiter">;;</span><span class="comment"><br /></span><span class="comment-delimiter">;;</span><span class="comment">============================================================================</span></pre></div></blockquote>P.S. упражняемся c htmlize.elKostafeyhttp://www.blogger.com/profile/14975242423333810114noreply@blogger.com4tag:blogger.com,1999:blog-6158999380322649405.post-24538454972646766402009-07-06T15:18:00.000-07:002009-07-08T14:42:50.610-07:00MIT/GNU Scheme и EmacsВот интересно, кому пришла в голову мысль что Linux сложнее Windows?<br /><br />На днях разгребал архивы закаченных файлов и среди прочего были обнаружены несколько статей<br /><strike>о пользе бега и вреде курения</strike> о пользе лиспа и вреде java.<br /><ol><li><a href="http://www.nestor.minsk.by/sr/2003/07/30710.html">http://www.nestor.minsk.by/sr/2003/07/30710.html</a><br /><li><a href="http://local.joelonsoftware.com/wiki/Опасности_обучения_на_Java">http://local.joelonsoftware.com/wiki/Опасности_обучения_на_Java</a><br /><li><a href="http://local.joelonsoftware.com/wiki/А_ваш_язык_программирования_так_может%3F">http://local.joelonsoftware.com/wiki/А_ваш_язык_программирования_так_может%3Fa</a></ol><br />Сложно не заинтересоваться.<br /><br />В то же время, неподалеку была обнаружена книжка Харольд Абельсон, Джеральд Джей Сассман Структура и интерпретация компьютерных программ. Английский вариант:<a href="http://mitpress.mit.edu/sicp/">http://mitpress.mit.edu/sicp/full-text/book/book.html</a>. Книжка, вообще говоря, и не совсем про лисп, но примеры на Scheme. Хороший способ совместить приятное с полезным.<br /><br />В чем же дело? Нам нужна реализация той самой Scheme, на которой написаны примеры в книжке. Вот она: <a href="http://mitpress.mit.edu/sicp/scheme/index.html">http://mitpress.mit.edu/sicp/scheme/index.html</a> Скачиваем, устанавливаем заботливо собранный и для пользователей Windows бинарник <a href="http://www.gnu.org/software/mit-scheme/">http://www.gnu.org/software/mit-scheme/</a>. Там же рядом PDF - версии документации. После установки, конечно, прописываем C:\Program Files\MIT-GNU Scheme\bin\ в PATH.<br /><br />Конечно, это все теперь нужно прикрутить к Emacs (а как же без этого?!). Тут все уже написано: <a href="http://xtalk.msk.su/~ott/ru/writings/emacs-devenv/EmacsScheme.html#xscheme.">http://xtalk.msk.su/~ott/ru/writings/emacs-devenv/EmacsScheme.html#xscheme.</a>. Итак, нам нужен Xscheme. Он входит в стандартный комплект Emacs, конечно, можно взять и версию <a href="http://www.gnu.org/software/mit-scheme/">http://www.gnu.org/software/mit-scheme/</a>, но она едва ли новее. Выглядит не сложно. Нужно лишь запустить процесс Scheme. В самом приложении (Scheme.exe) про существование Windows не очень в курсе, т.к. путь поиска по band-файла all.com по умолчанию \scheme\lib. Кхм, ладно смотрим документацию. Решение: использовать переменную окружения MITSCHEME_LIBRARY_PATH со значением, например C:\Program Files\MIT-GNU Scheme\lib.<br /><br />Наконец, M-x start-scheme успешно запущен. Но в созданном буфере scheme никакого процесса scheme нет, хотя некая консоль в соседнем окне запустилась. Возвращаемся на <a href="http://www.gnu.org/software/mit-scheme/">http://www.gnu.org/software/mit-scheme/</a> (прикидывая, оформить это как вопрос или уж сразу баг-репорт, в конце-концов, кому придет в голову тестировать все это в Windows?:)). А там, тем временем, относительно использования xscheme и emacs черным по белому написано: <strong>This doesn't work on Windows or OS/2</strong>.<br /><br />Ладно, все же в комплекте MIT/GNU Scheme идет emacs-подобный редактор Edwin. Но разве Windows проще Linux?Kostafeyhttp://www.blogger.com/profile/14975242423333810114noreply@blogger.com6tag:blogger.com,1999:blog-6158999380322649405.post-28522119950480136902009-07-02T07:31:00.001-07:002009-07-06T15:40:33.762-07:00Пример символьных преобразований в EMaximaПодробное описание использования интерфейсов интерактивной и пакетной работы с Maxima, а также интерфейса EMaxima приведено в документации Jay Belanger Maxima and Emacs. Найти ее можно в установленной версии Maxima, например,<br />C:\Program Files\Maxima-5.18.1\share\maxima\5.18.1\doc\EMaximaIntro.ps<br /><br />Приведу наиболее часто используемые ключи:<br />C-c C-o Создание стандартной ячейки.<br />C-c + Переход к следующей ячейке.<br />C-c - Переход к предыдущей ячейке.<br />C-c C-u c Обновить (выполнить) текущую ячейку. Результат - в текстовом формате.<br />C-c C-u C Обновить (выполнить) текущую ячейку. Результат - в формате TeX.<br />C-c C-d Очистить вывод, генерируемый Maxima для данной ячейки.<br /><br />Пришло время рассмотрения более серьезного примера использования EMaxima. Для его описания понадобится ввести еще несколько новых понятий, каждое из которых рассмотрим отдельно на простых примерах. Прежде всего, необходимо упомянуть ссылки на другие ячейки.<br /><br /><h2>Ссылки на другие ячейки</h2><br /><br />Помечаем одну из ячеек, например [filename:definef]. Другая ячейка должна быть также помечена тем же filename, но с уникальной меткой ячейки. Добавялем ссылку <filename:definef>. Ткаим образом, вместо ссылки будет выполнена ячейка с этой меткой. Результат ее работы - также будет отображен в вызывающей ячейке. Таким образом, при вычислении ячейки filename:optional сначала переменной x будет присвоено значение 3, затем выражение в вызывающей ячейке будет вычислено с учетом этого значения.<br /><br /><span style="font-family: courier new;">\begin{maxima}[filename:optional]<br /><filename:definef><br />x^2;<br />\maximaoutput*<br />\m 9 \\<br />\end{maxima}<br /><br />\begin{maxima}[filename:definef]<br />x:3$%$<br />\end{maxima}</span><br /><br />Использование $%$ - это предложенный в заметке <a href="http://kostafey.blogspot.com/2009/05/emaxima.html">Графики в EMaxima</a><br> способ подавления вывода Maxima в LaTeX-окружении.<br /><br /><h2>Использование произвольных символов при обозначении переменных</h2><br /><br />Такие символы как a, b, c, x, y, z... не всегда оказываются достаточными для обозначения переменных. Что если нам требуется использовать символы греческого алфавита с подстрочными и надстрочными символами индексами и т.д.? В LaTeX имеются все необходимые средства для работы с ними, но Maxima ничего такого не предоставляет, а корректировать вручную генерируемые формулы слишком непроизводительно, кроме того, велика вероятность случайной ошибки. Ответ на этот вопрос, как ни странно, находится в FAQ Maxima:<a href="http://maxima.sourceforge.net/ru/faq.html#TeXOutput0">http://maxima.sourceforge.net/ru/faq.html#TeXOutput0</a>.<br />Тогда для того чтобы возвести экспоненту в переменную лямбда с подстрочным символом гамма <img alt="e^{\lambda_{\gamma}}" src=http://www.texify.com/img/%5CLARGE%5C%21e%5E%7B%5Clambda_%7B%5Cgamma%7D%7D.gif align=center border=0> необходимо:<br /><br />Создать файл vars.lisp где-нибудь неподалеку от редактируемого tex-файла, и записать в нем:<br /><span style="font-family: courier new;">(defprop $lambda_gamma "\\lambda_{\\gamma}" texword)</span><br /><br />Тем самым мы ассоциируем обозначение lambda_gamma с его TeX-овым представлением \lambda_{\gamma}<br />Теперь записываем в ячейке:<br /><span style="font-family: courier new;">\begin{maxima}<br />load("vars.lisp")$%$<br />exp(lambda_gamma);<br />\end{maxima}</span><br />Вычисляем C-c C-u C. Результат <br />\m e^{\lambda_{\gamma}} \\<br />т.е. как раз <img alt="e^{\lambda_{\gamma}}" src=http://www.texify.com/img/%5CLARGE%5C%21e%5E%7B%5Clambda_%7B%5Cgamma%7D%7D.gif align=center border=0><br /><br /><h2>Скрытые элементы текста</h2><br /><br />Довольно часто бывает удобно иметь некую ячейку, в которой помимо загрузки обозначений переменных выполняются другие инициализирующие действия, которые актуальны для ряда других ячеек. Однако, в результирующем pdf-додкументе нам ее иметь совсем не обязательно. Такие ячейки следует обозначать звездочкой:<br /><span style="font-family: courier new;">\begin{maxima*}<br />\end{maxima*}</span><br /><br />Однако, эту ключевую ячейку также приходится довольно часто редактировать. Можно осуществлять навигацию по ячейкам, но когда их число велико это долго; можно использовать штатные средства Emacs, такие как закладки, но нельзя забывать, что мы используем такое мощное средство как ecb. Значит нам необходим элемент документа, который бы отображался в окне навигации по методам, но при этом отсутствовал в результирующем документе. Ответ был подсмотрен тут <a href="http://forum.ru-board.com/topic.cgi?forum=5&topic=30211">http://forum.ru-board.com/topic.cgi?forum=5&topic=30211</a><br /><br /><span style="font-family: courier new;">%Многострочный комментарий<br />\newcommand{\hidden}[1]{}<br />...<br />\begin{document}<br />...<br /><br />\hidden{<br />\section{Инициализация}}</span><br /><br /><h2>Комплексный пример</h2><br />Попросим Maxima решить для нас несложный интеграл и выдать результат в виде, пригодном для использования в результирующем документе.<br /><br /><span style="font-family: courier new;">%-*-EMaxima-*-<br />\documentclass[russian, ucthesis ,14pt, oneside]{article}<br />\usepackage{mathtext}%Использование русского текста в формулах<br />\usepackage[T2A]{fontenc}<br />\usepackage[cp1251]{inputenc}<br />\usepackage[russian]{babel} <br />\usepackage{geometry}<br />\geometry{verbose,a4paper}<br />\pagestyle{plain}<br />\usepackage{emaxima} %Позволяет использование EMaxima<br />\usepackage{pdfcolmk} %Позволяет использование EMaxima для pdf<br /><br />\usepackage{amsmath} %для набора мат. формул<br />\usepackage{mathrsfs} %дополнительные математические шрифты<br /><br />%Многосторочный комментарий<br />\newcommand{\hidden}[1]{}<br /><br />\begin{document}<br /><br />\fontsize{12pt}{12pt}<br />\selectfont<br /><br />\hidden{<br />\section{Инициализация}}<br />\begin{maxima*}[filename:definef]<br />load("vars.lisp")$%$<br />\end{maxima*}<br /><br />\begin{maxima*}[filename:optional]<br /><filename:definef><br />'integrate(exp(lambda_gamma*x), x, 0, t);<br />integrate(exp(lambda_gamma*x), x, 0, t);<br />\end{maxima*}<br /><br />\end{document}</span><br /><br />Результат вычислений ячейки с меткой filename:optional<br /><span style="font-family: courier new;">\m \int_{0}^{t}{e^{\lambda_{\gamma}\,x}\;dx}\big. \\<br />\m {{e^{\lambda_{\gamma}\,t}}\over{\lambda_{\gamma}}}-{{1}\over{\lambda_{\gamma}}} \\</span><br /><br />Осталось вынести его из окружения Maxima и внести минимальные корректировки:<br /><span style="font-family: courier new;">$$<br />\int_{0}^{t}{e^{\lambda_{\gamma}\,x}\;dx}\big. \\ =<br />{{e^{\lambda_{\gamma}\,t}}\over{\lambda_{\gamma}}}-{{1}\over{\lambda_{\gamma}}} \\<br />$$</span><br /><br />Результат:<br /><img alt="\int_{0}^{t}{e^{\lambda_{\gamma}\,x}\;dx} ={{e^{\lambda_{\gamma}\,t}}\over{\lambda_{\gamma}}}-{{1}\over{\lambda_{\gamma}}} \\" src=http://www.texify.com/img/%5CLARGE%5C%21%5Cint_%7B0%7D%5E%7Bt%7D%7Be%5E%7B%5Clambda_%7B%5Cgamma%7D%5C%2Cx%7D%5C%3Bdx%7D%20%3D%7B%7Be%5E%7B%5Clambda_%7B%5Cgamma%7D%5C%2Ct%7D%7D%5Cover%7B%5Clambda_%7B%5Cgamma%7D%7D%7D-%7B%7B1%7D%5Cover%7B%5Clambda_%7B%5Cgamma%7D%7D%7D%20%5C%5C.gif align=center border=0>Kostafeyhttp://www.blogger.com/profile/14975242423333810114noreply@blogger.com0tag:blogger.com,1999:blog-6158999380322649405.post-77085803951309949832009-07-02T05:27:00.000-07:002009-07-02T13:06:35.479-07:00Пример использования EMaximaСоздаем файл example1.tex, открываем его в emacs.<br />Содержимое простейшего emaxima - шаблона может иметь вид:<br /><br /><span style="font-family: courier new;">%-*-EMaxima-*-<br />\documentclass[russian, ucthesis ,14pt, oneside]{article}<br />\usepackage{mathtext}%Использование русского текста в формулах<br />\usepackage[T2A]{fontenc}<br />\usepackage[cp1251]{inputenc}<br />\usepackage[russian]{babel} <br />\usepackage{geometry}<br />\geometry{verbose,a4paper}<br />\pagestyle{plain}<br />\usepackage{emaxima} %Позволяет использование EMaxima<br />\usepackage{pdfcolmk} %Позволяет использование EMaxima для pdf<br /><br />\usepackage{amsmath} %для набора мат. формул<br />\usepackage{mathrsfs} %дополнительные математические шрифты<br /><br />\begin{document}<br />Hellow Word!<br />Проверка русского текста.<br />\end{document}</span><br /><br />Компилируем документ выполнив C-c C-c. В случае, если потребуется повторная компиляция (из-за изменения соответствия содержания расположению секций) emacs сообщит об этом. Повторный вызов C-c C-c приведет к открытию скомпилированного example1.pdf в просмотрщике по умолчанию.<br /><br />В дальнейшем предполагаем, что шапка документа имеет именно такой вид, если специально не оговорено иное.<br />Добавим ячейку emaxima. Находясь между строками<br /><br /><span style="font-family: courier new;">\begin{document}<br /><br />\end{document}</span><br /><br />наберем C-c C-o. Появится новая ячейка:<br /><br /><span style="font-family: courier new;">\begin{document}<br />\begin{maxima}[]<br /><br />\end{maxima}<br />\end{document}</span><br /><br />Попробуем выполнить одно из сложнейших вычислений: наберем 2+2;<br /><br /><span style="font-family: courier new;">\begin{document}<br />\begin{maxima}[]<br />2+2;<br />\end{maxima}<br />\end{document}</span><br />Затем, наберем C-c C-u C (т.е. Ctrl-c Ctrl-u Shift-c). Через несколько мгновений документ примет вид:<br /><br /><span style="font-family: courier new;">\begin{document}<br />\begin{maxima}[]<br />2+2;<br />\maximaoutput*<br />\m 4 \\<br />\end{maxima}<br />\end{document}</span><br /><br />Ответ Maxima - 4. Что ж, не поспоришь. Но скомпилировать документ на этот раз не удастся C-c C-c:<br /><span style="font-family: courier new;">! Font T2A/cmtt/m/n/10=latt1000 at 10.0pt not loadable: Metric (TFM) file not found.</span><br /><br />По умолчанию EMaxima output имеет размер шрифта 10.0pt, а этот размер не поддерживается шрифтом по умолчанию.<br />Для нас 10.0pt все равно мелковато, зададим размер шрифта немного побольше:<br /><br /><span style="font-family: courier new;">\begin{document}<br />\fontsize{12pt}{12pt}<br />\selectfont<br /><br />\begin{maxima}[]<br />2+2;<br />\maximaoutput*<br />\m 4 \\<br />\end{maxima}<br />\end{document}</span><br /><br />Теперь выполнив C-c C-c дважды можно увидеть результат вычислений в более наглядном виде.<br />Другой путь решения проблемы - менять не размер шрифта, а сам шрифт, например, дописав в шапке документа:<br /><br /><span style="font-family: courier new;">\usepackage{times}</span><br /><br />Хотя, мне такой шрифт не очень нравится. С интересом выслушаю альтернативные решения.Kostafeyhttp://www.blogger.com/profile/14975242423333810114noreply@blogger.com0tag:blogger.com,1999:blog-6158999380322649405.post-33488085246582977572009-05-21T17:32:00.000-07:002009-07-28T15:12:54.374-07:00Настройка рабочего окружения EMaxima, или как подружить Emacs, Maxima, EMaxuma, AUCTeX, LaTeX, ecb с Пользователем.<div style="text-indent: 10%;">- Я не умею, - признался я. - Не умею летать.</div><div style="text-indent: 10%;">- А вы пробовали? - спросил человек, делая плавный поворот влево. Он, по всей видимости, наслаждался полетом.</div><div style="text-indent: 10%;">- Нет, не пробовал. Но мне кажется, что я не умею.</div><div style="text-indent: 10%;">Человек покачал головой, и все тело его при этом также покачивалось.</div><div style="text-indent: 10%;">- Мне не хочется вас убеждать, - сказал он. - Маршрут у меня сегодня легкий. Могли бы попробовать. Вы не представляете, как это хорошо!</div><div style="text-indent: 10%;">- Представляю, - сказал я. - Это, наверное, полезно?</div><div style="text-indent: 10%;">- Нет ничего более бесполезного! - заявил человек...</div><br /><div align="right">Александр Житинский. Искушение.<br /></div><br /><br />Взявшись за всякое дело хорошо бы заручиться ответом на ряд вопросов. <br /><ol><li>Зачем? Зачем все это нужно? Тут сложно подобрать правильный ответ. Пусть каждый его сам себе выберет. Я использовал эту связку при подготовки части материалов для статьи, впрочем одних средств LaTeX с избытком хватает для подготовки не только что целой статьи, но и диссертации.<br /><li>Для кого? Для любого, кому может потребоваться подготовка материалов математического характера, но по каким-либо причинам не устраивают используемые средства. Я просто буду считать, что эти заметки делаются не зря, если от них будет польза хоть для одного человека.<br /><li>А что в анонсе? Автоматизация символьных преобразований, представление результатов в наглядном виде, взаимодействие с Word, использование текстовых форматов, впрочем всего не пересказать. Тут скорее так: кто знает что это такое и зачем нужно - объяснять излишне, кто не знает - объяснять бесполезно.</ol><br />Сразу оговорюсь, что не являюсь знатоком ни одной из перечисленных выше программ/систем/пакетов расширений/<вписать свое>. Однако, так как найти в сети такого комплексного обзора не получилось, попытаюсь привести то, что собрать все же удалось.<br /><br />Все пассы по вызову дождя были выполнены в ОС Windows XP SP2. Впрочем, к моменту завершения выведения жизнеспособного плодовитого поколения горных хвостосвистящих раков, обязуюсь непременно описать как этого же достичь в одном из Linux-ов (впрочем, как раз у линуксоидов с этим проблем возникнуть не должно).<br /><br />Итак, в путь!<br /><br /><h2>Maxima</h2><br />Система компьютерной алгебры Maxima. Официальный сайт:<br /><a href="http://maxima.sourceforge.net/">http://maxima.sourceforge.net/</a><br />Вся необходимая документация и/или ссылки на нее присутствует там же:<br /><a href="http://maxima.sourceforge.net/ru/documentation.html">http://maxima.sourceforge.net/ru/documentation.html</a><br />Скачиваем последнюю версию, устанавливаем.<br />Необходимо убедиться, что путь к файлу maxima.bat прописан в переменной PATH. Если не так - исправить (в моем случае это C:\Program Files\Maxima-5.18.1\bin\).<br /><br /><h2>LaTeX</h2><br />LaTeX, наиболее популярный набор макрорасширений TeX. Я использовал дистрибутив TeXLive. Официальный сайт:<br /><a href="http://www.tug.org/texlive/">http://www.tug.org/texlive/</a><br />Хорошая подборка ссылок на разнообразную документацию по LaTeX и не только приводится на:<br /><a href="http://forum.ru-board.com/topic.cgi?forum=5&topic=30211">http://forum.ru-board.com/topic.cgi?forum=5&topic=30211</a><br />Скачиваем iso-образ дистрибутива, прожигаем DVD, устанавливаем. Для Windows, как правило, припасен графический инсталлятор.<br />Необходимо убедиться, что путь к файлу pdflatex.exe прописан в переменной PATH. Если не так - исправить (в моем случае это C:\TeXLive2007\bin\win32\).<br /><br /><h2>emacs</h2><br />Развитый, самодокументированный, настраиваемый, расширяемый экранный редактор реального времени Emacs. Нет нужды комментировать последнюю строчку, таких комментариев уже было сделано предостаточно.<br />Официальный сайт:<br /><a href="http://www.gnu.org/software/emacs/">http://www.gnu.org/software/emacs/</a><br />Подборка хорошей документации для Emacs - тема отдельного обсуждения. Пока приведу лишь следующую ссылку:<br /><a href="http://www.emacs.uniyar.ac.ru/">http://www.emacs.uniyar.ac.ru/</a><br />Для Emacs выбор используемой версии - задача не столь тривиальная, как в случае с обозначенными выше программными пакетами. Итак, существуют 3 основные сборки Emacs для Windows:<br /><ol><li>официальная сборка emacs 22.3 для платформы win32 http://www.gnu.org/software/emacs/<br /><li>emacs 23, собранный из cvs (который, в свою очередь, подразделяется на пропатченный и непропатченный) http://ourcomments.org/Emacs/EmacsW32.html<br /><li>ntemacs находящийся по адресу http://ntemacs.sourceforge.net/</ol><br />Первая представляет собой официальную и наиболее стабильную, в то же время, наименее требовательную к ресурсам и быстродействию сборку, применимую для разнопланового использования.<br />Вторая содержит в себе все последние доработки и исправления. Пропатченная версия, кроме того, имеет наименьшие глюки при скроллинге русского текста (подробнее об этом в дальнейщих заметках), а кроме того, там удобно реализованы server и client.<br />Третья является официальной версией, используемый для тестирования imaxima под Windows (подробнее об imaxima будет сказано ниже).<br /><br />В конечном итоге, я остановился на официальной версии emacs 22.3, впрочем наставать на правильности этого решения не следует.<br />Процесс установки ограничен простой распаковкой архива и выполнением файла addpm.exe, расположенного в директории bin.<br /><br />Конфигурация emacs - процесс перманентный, здесь я не буду приводить весь процесс настройки, все необходимые корректировки будем обговаривать по ходу добавления тех или иных пакетов расширений. Собственно файл конфигурации находится:<br />C:\Documents and Settings\{user name}\Application Data\.emacs<br />если его там нет, то необходимо такой фал добавить. Пакеты расширений в принципе могут находиться где угодно. Для определенности будем использовать:<br />C:\Documents and Settings\{user name}\Application Data\.emacs.d\<br /><br />Моя версия конфигурации имеет в основе конфигурацию, взятую с <a href="http://www.emacs.uniyar.ac.ru/">http://www.emacs.uniyar.ac.ru/</a>. Она доступна в googlecode, Mercural-репозитарии. Получить ее можно, выполнив команду<br /><span style="font-family: courier new;">hg clone http://kostafey-emacs-config.googlecode.com/hg/ kostafey-emacs-config</span><br /><br /><h2>AUCTeX</h2><br />Всесторонняя, настраиваемая интегрированная среда для редактирования файлов TeX/LaTeX/ConTeXt/Texinfo используя Emacs или XEmacs. <br />Официальный сайт:<br /><a href="http://www.gnu.org/software/auctex/">http://www.gnu.org/software/auctex/</a><br />Статья по работе с пакетом:<br /><a href="http://xtalk.msk.su/~ott/ru/writings/emacs-tex/AUCTeX.html">http://xtalk.msk.su/~ott/ru/writings/emacs-tex/AUCTeX.html</a><br />При установке я просто распаковал архив пекета auctex-11.85-e22.3-msw.zip в директорию, в которой установлен собственно emacs, благо структура директорий у них совпадает. Конфигурация emacs для AucTeX добросовестно скопирована с <a href="http://www.emacs.uniyar.ac.ru/">http://www.emacs.uniyar.ac.ru/</a><br />Данные строчки должны быть добавлены в .emacs:<br /><blockquote><div class="src"><pre><span class="comment-delimiter">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</span><span class="comment"><br /></span><span class="comment-delimiter">;;</span><span class="comment"><br /></span><span class="comment-delimiter">;;</span><span class="comment">Настройки AucTeX<br /></span><span class="comment-delimiter">;;</span><span class="comment"><br /></span>(<span class="keyword">require</span> '<span class="constant">tex-mik</span>)<br />(add-hook 'LaTeX-mode-hook 'LaTeX-install-toolbar)<br />(setq TeX-parse-self t) <span class="comment-delimiter">; </span><span class="comment">Enable parse on load.<br /></span>(setq TeX-auto-save t) <span class="comment-delimiter">; </span><span class="comment">Enable parse on save.<br /></span>(setq-default TeX-master nil) <span class="comment-delimiter">; </span><span class="comment">Query for master file.<br /></span>(setq TeX-PDF-mode t)<br />(setq TeX-interactive-mode t)<br />(setq TeX-source-specials-mode 1)<br /><span class="comment-delimiter">;;</span><span class="comment">модифицируем меню<br /></span><span class="comment-delimiter">;;; </span><span class="comment">some more menu entries in the command list:<br /></span><span class="comment-delimiter">;;; </span><span class="comment">see tex-mik.el from package auctex: %v is defined in tex-mik.el<br /></span><span class="comment-delimiter">;;; </span><span class="comment">other variables are defined in tex.el from auctex<br /></span><span class="comment-delimiter">;;; </span><span class="comment">the meaning of some auctex-varibles:<br /></span> <span class="comment-delimiter">;</span><span class="comment">symbols defined in tex.el and tex-mik.el:<br /></span> <span class="comment-delimiter">;</span><span class="comment">%b name slave tex-file %t name master tex-file <br /></span> <span class="comment-delimiter">;</span><span class="comment">%d dvi-file %f ps-file <br /></span> <span class="comment-delimiter">;</span><span class="comment">%l "latex --src-specials"<br /></span> <span class="comment-delimiter">;</span><span class="comment">%n line number %p printcommand %q "lpq" <br /></span> <span class="comment-delimiter">;</span><span class="comment">%r (TeX-style-check TeX-print-style)<br /></span> <span class="comment-delimiter">;</span><span class="comment">%s master-file-name without extention<br /></span> <span class="comment-delimiter">;</span><span class="comment">%v yap command view line<br /></span>(<span class="keyword">eval-after-load</span> <span class="string">"tex"</span><br /> '(<span class="keyword">progn</span><br /> (add-to-list 'TeX-command-list<br /> (list <span class="string">"->PS landscape for pdf"</span><br /> <span class="string">"dvips %d -N0 -Ppdf -G0 -T 297mm,210mm -o %f "</span> <br /> 'TeX-run-command nil t))<br /> (add-to-list 'TeX-command-list<br /> (list <span class="string">"All Texify run-viewer"</span><br /> <span class="string">"texify --tex-opt=--src --run-viewer --clean %s.tex"</span><br /> 'TeX-run-command nil t))))<br /><span class="comment-delimiter">;;</span><span class="comment"><br /></span><span class="comment-delimiter">;;</span><span class="comment">Настройки PreviewLatex<br /></span>(load <span class="string">"preview-latex.el"</span> nil t t) <br /><span class="comment-delimiter">;;</span><span class="comment"><br /></span><span class="comment-delimiter">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</span><span class="comment"></span></pre></div></blockquote><br /><h2>ecb</h2><br />ecb - Emacs Code Browser. Пакет расширений для Emacs, используемый для повышения удобства навигации по редактируемым файлам.<br />Официальный сайт:<br /><a href="http://ecb.sourceforge.net/">http://ecb.sourceforge.net/</a><br />Данный пакет имеет зависимость от другого - cedet.<br />cedet - Collection of Emacs Development Environment Tools<br />Официальный сайт:<br /><a href="http://cedet.sourceforge.net/">http://cedet.sourceforge.net/</a><br />Скачиваем данные пакеты и распаковываем (в моем случае это cedet-1.0pre6 и ecb-2.40) в директорию <br />C:\Documents and Settings\{user name}\Application Data\.emacs.d\<br /><br />Прописываем добавленные пакеты в .emacs. Конфигурация пакетов может иметь вид:<br /><blockquote><div class="src"><pre><span class="comment-delimiter">;;</span><span class="comment">-----------------------------------------------------------------------------<br /></span><span class="comment-delimiter">;; </span><span class="comment">Cedet<br /></span>(setq semantic-load-turn-useful-things-on t)<br />(load-file <span class="string">"~/.emacs.d/cedet-1.0pre6/common/cedet.el"</span>)<br />(global-set-key [?\C- ] 'semantic-ia-complete-symbol)<br /><br />(<span class="keyword">defun</span> <span class="function-name">my-semantic-hook</span> ()<br /> (semantic-tag-folding-mode 1))<br />(add-hook 'semantic-init-hooks 'my-semantic-hook)<br /><span class="comment-delimiter">;;</span><span class="comment">-----------------------------------------------------------------------------<br /></span><br /><span class="comment-delimiter">;;</span><span class="comment">-----------------------------------------------------------------------------<br /></span><span class="comment-delimiter">;; </span><span class="comment">ECB<br /></span>(add-to-list 'load-path <span class="string">"~/.emacs.d/ecb-2.40/"</span>) <br />(<span class="keyword">require</span> '<span class="constant">ecb</span>)<br />(global-set-key (kbd <span class="string">"\e\el"</span>) 'ecb-toggle-ecb-windows)<br />(global-set-key (kbd <span class="string">"C-x C-a"</span>) 'ecb-activate)<br />(global-set-key (kbd <span class="string">"C-x C-q"</span>) 'ecb-deactivate)<br />(global-set-key <span class="string">"\M-m"</span> 'ecb-goto-window-methods)<br /><span class="comment-delimiter">;</span><span class="comment">Перезагрузка окна методов после каждого сохранения<br /></span>(setq imenu-auto-rescan 1)<br /><span class="comment-delimiter">;;</span><span class="comment">-----------------------------------------------------------------------------</span><br /><br /><span class="comment-delimiter">;</span><span class="comment">Длинные строки всегда разбивать при отображении<br /></span>(setq truncate-lines nil)<br />(setq truncate-partial-width-windows nil)</pre></div></blockquote><br /><br />Кроме того, для удобства использования ecb в раздел custom-set-variables .emacs необходимо вписать:<br /><blockquote><div class="src"><pre>(custom-set-variables<br /> ...<br /> '(ecb-auto-activate t)<br /> '(ecb-options-version <span class="string">"2.40"</span>)<br /> '(ecb-primary-secondary-mouse-buttons (quote mouse-1--C-mouse-1))<br /> '(ecb-source-path (quote (<span class="string">"c:"</span>)))<br /> '(ecb-tar-setup (quote cons))<br /> '(ecb-tip-of-the-day nil)<br /> ...<br /> '(speedbar-tag-split-minimum-length 200)<br /> ...<br />)</pre></div></blockquote><br /><h2>Интерфейсы Maxima, предоставляемые Emacs</h2><br />Более подробно об интерфейсах Maxima рассказано в статье Тихона Тарнавского <a href="http://maxima.sourceforge.net/ru/maxima-tarnavsky-2.html">http://maxima.sourceforge.net/ru/maxima-tarnavsky-2.html</a>. Здесь пойдет речь лишь об интерфейсах Maxima, предоставляемых Emacs:<br /><ol><li>maxima - интерактивный режим, аналогичен консольной версии Maxima или интерфейсу Xmaxima. Кроме того, через него осуществляется взаимодействие с процессом Maxima в интерфейсе maxima-mode.<br /><li>maxima-mode - пакетный режим, аналогично обработке файлов Maxima. Удобство режима залючается в том, что на выполнение можно отправлять как весь файл (или буфер) так и отдельную его часть или одну строку. При первом вызове порождается процесс Maxima, взаимодействие с которым осуществляется через описанный выше интерфейс.<br /><li>imaxima - интерактивный режим, аналогичен режиму maxima за исключением того, что вывод осуществляется не в текстовом, а в графическом виде, навроде интерфейса wxMaxima.<br /><li>emaxima - интерфейс, реализуемый внутри LaTeX - документа.</ol><br /><br /><h3>maxima и maxima-mode</h3><br />Подключение первых двух интерфейсов осуществляется стандартным образом. Файлы расширений Emacs предоставляются самой системой Maxima, необходимо лишь правильно указать путь к ним. Кроме того, необходимо, чтобы режим maxima-mode включался автоматически при редактировании *.mxm - файлов. Добавляем в .emacs:<br /><blockquote><div class="src"><pre><span class="comment-delimiter">;; </span><span class="comment">Подключаем Maxima<br /></span><span class="comment-delimiter">;; </span><span class="comment">указываем где будут лежать файлы расширений<br /></span>(add-to-list 'load-path <span class="string">"c:/Program Files/Maxima-5.18.1/share/maxima/5.18.1/emacs/"</span>)<br />(autoload 'maxima <span class="string">"maxima"</span> <span class="doc">"Maxima interaction"</span> t)<br />(autoload 'maxima-mode <span class="string">"maxima"</span> <span class="doc">"Maxima mode"</span> t)<br />(setq auto-mode-alist (cons '(<span class="string">"\\.mxm"</span> . maxima-mode) auto-mode-alist))</pre></div></blockquote><br />Команды maxima-mode:<br />C-c C-C - выполнить строку<br />C-c C-r - выполнить выделенный блок<br />C-c C-b - выполнить буфер (т.е. файл)<br /><br /><h3>imaxima</h3><br />Описание настройки интерфейса находится на сайте разработчика <a href="http://members3.jcom.home.ne.jp/imaxima/Site/Easy_Install_on_Windows_XP___Vista.html">http://members3.jcom.home.ne.jp/imaxima/Site/Easy_Install_on_Windows_XP___Vista.html</a>, новая версия сайта, по-видимому будет здесь <a href="http://sites.google.com/site/imaximaimath/download-and-install/easy-install-on-windows-xp">http://sites.google.com/site/imaximaimath/download-and-install/easy-install-on-windows-xp</a><br /><br />Ниже приведу фрагмент перевода этого описания плюс некоторые специфические особенности настройки imaxima для TeXLive в Windows.<br /><h4>LaTeX (MiKTeX или TeXLive)</h4> Согласно инструкциям необходимо установить MiKTeX 2.7 в путь по умолчанию. Можно использовать и TeXLive дистрибутив LaTeX, но для этого необходимо выполнить еще несколько действий. Будем считать, что TeXLive уже успешно установлен (подробнее об этом - в начале заметки).<br /><br />Теперь необходимо установить пакет mh. Его можно скачать с CTAN (файл mh.tar.lzma),<br />(<a href="http://tug.ctan.org/cgi-bin/ctanPackageInformation.py?id=mh">http://tug.ctan.org/cgi-bin/ctanPackageInformation.py?id=mh</a>)<br />затем распаковать архив (файлы *.sty) в соответствующие директории, в которых располагаюся эти файлы в вашей установленной верси TeXLive.<br />Затем, запускаем на выполнение команду texhash ~/texmf<br /><br />Правильность ручной установки пакета mh может быть проверена командой <br /> <span style="font-family: courier new;">kpsewhich breqn.sty</span><br />которая вернет путь к файлу breqn.sty.<br />Она находится в директории<br /> {TeXLive installation directory}\bin\win32\kpsewhich.exe<br /><br /><h4>GPL Ghostscript</h4><br />Прежде всего, необходимо удалить установленные более ранние версии GhostScript. Он может быть уже установлен и не отдельно, а в составе другого приложения, например PDFCreator.<br />Заходим на <a href="http://www.cs.wisc.edu/~ghost/">http://www.cs.wisc.edu/~ghost/</a> скачиваем последнюю версию Ghostscript (в моем случае это 8.63), собранную для Windows. Ссылка для скачивания <a href="http://prdownloads.sourceforge.net/ghostscript/">http://prdownloads.sourceforge.net/ghostscript/</a>. Устанавливаем gs863w32.exe, установка должна быть произведена в путь по умолчанию.<br /><br /><h4>Maxima</h4> Она у нас также уже установлена.<br /><br /><h4>NTEmacs 23</h4> Тут следовало бы написать "внимание" с 3 восклицательными знаками, т.к. именно версия, взятая из <a href="http://ntemacs.sourceforge.net/">http://ntemacs.sourceforge.net/</a> используется для тестирования imaxima под Windows. Впрочем, с imaxima прекрасно работают и последние версии других сборок Emacs. Однако, в случае обнаружения ошибок, прежде чем клепать гневные баг-репорты разработчику imaxima, следует выполнить тестирование именно в NTEmacs.<br /><br />Открываем файл setup-imaxima-imath.el. Строки<br /><blockquote><div class="src"><pre>(<span class="keyword">defvar</span> <span class="variable-name">*imaxima-miktex-bin-dir*</span><br /> (file-name-directory (car (file-expand-wildcards <span class="string">"c:/Program Files/MiKTeX*/miktex/bin/latex.exe"</span>)))<br /> <span class="doc">"MiKTeX bin directory, added to exec-path"</span>)</pre></div></blockquote><br />должны быть соответствующим образом откорректированы:<br /><blockquote><div class="src"><pre>(<span class="keyword">defvar</span> <span class="variable-name">*imaxima-miktex-bin-dir*</span><br /> (file-name-directory (car (file-expand-wildcards <span class="string">"c:/{TeXLive installation directory}/bin/win32/latex.exe"</span>)))<br /> <span class="doc">"MiKTeX bin directory, added to exec-path"</span>)</pre></div></blockquote><br />Создаем директорию<br />c:\Windows\tmp<br /><br />Добавляем следуюшие строчки в файл .emacs:<br /><blockquote><div class="src"><pre>(load <span class="string">"c:/Program Files/Maxima-5.17.0/share/maxima/5.17.0/emacs/setup-imaxima-imath.el"</span>)<br />(setq imaxima-tmp-dir <span class="string">"C:\\Windows\\tmp"</span>)</pre></div></blockquote><br />Запускаем emacs. M-x imaxima [Ret]. Набираем, например, что-то вроде:<br />(%i1) x^2; [Ret]<br /><br /><h3>emaxima</h3><br />Настройка emaxima теперь сводится лишь к указанию в файле .emacs:<br /><blockquote><div class="src"><pre>(autoload 'emaxima-mode <span class="string">"emaxima"</span> <span class="doc">"EMaxima"</span> t)<br />(add-hook 'emaxima-mode-hook 'emaxima-mark-file-as-emaxima)</pre></div></blockquote><br />Все!<br /><br />Таким образом, настройка всех режимов может быть прописана в виде:<br /><blockquote><div class="src"><pre><span class="comment-delimiter">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</span><span class="comment"><br /></span><span class="comment-delimiter">;; </span><span class="comment">Настройка Maxima<br /></span><span class="comment-delimiter">;; </span><span class="comment"><br /></span>(load <span class="string">"c:/Program Files/Maxima-5.18.1/share/maxima/5.18.1/emacs/setup-imaxima-imath.el"</span>)<br />(setq imaxima-tmp-dir <span class="string">"C:\\Windows\\tmp"</span>)<br /><span class="comment-delimiter">;; </span><span class="comment">Подключаем Maxima<br /></span><span class="comment-delimiter">;; </span><span class="comment">указываем где будут лежать файлы расширений<br /></span>(add-to-list 'load-path <span class="string">"c:/Program Files/Maxima-5.18.1/share/maxima/5.18.1/emacs/"</span>)<br />(autoload 'maxima <span class="string">"maxima"</span> <span class="doc">"Maxima interaction"</span> t)<br />(autoload 'maxima-mode <span class="string">"maxima"</span> <span class="doc">"Maxima mode"</span> t)<br /><span class="comment-delimiter">; </span><span class="comment">C-c C-C - выполнить строку<br /></span><span class="comment-delimiter">; </span><span class="comment">C-c C-r - выполнить выделенный блок<br /></span><span class="comment-delimiter">; </span><span class="comment">C-c C-b - выполнить буфер (т.е. файл)<br /></span>(setq auto-mode-alist (cons '(<span class="string">"\\.mxm"</span> . maxima-mode) auto-mode-alist))<br /><span class="comment-delimiter">;; </span><span class="comment">M-X emaxima-mode<br /></span>(autoload 'emaxima-mode <span class="string">"emaxima"</span> <span class="doc">"EMaxima"</span> t)<br />(add-hook 'emaxima-mode-hook 'emaxima-mark-file-as-emaxima)<br /><span class="comment-delimiter">;; </span><span class="comment"><br /></span><span class="comment-delimiter">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</span></pre></div></blockquote>Kostafeyhttp://www.blogger.com/profile/14975242423333810114noreply@blogger.com2tag:blogger.com,1999:blog-6158999380322649405.post-12671389883777881802009-05-21T03:29:00.000-07:002009-05-21T16:02:03.820-07:00Заметки о работе с ecbНаличие окна с названиями секций и подсекций с возможностью перехода к выбранной - очень удобная возможность. Ключи по умолчанию довольно длинные. Можно использовать следующую привязку:<br /><br /><span style="font-family: courier new;">(global-set-key "\M-m" 'ecb-goto-window-methods)</span><br /><br />Выбрав нужную секцию, переходим к ее редактированию нажатием [RET].<br /><br />Построение того, что называется "окно методов" (window-methods), в нашем случае - содержание LaTeX - документа осуществляется внешними по отношению к ecb средствами, поэтому для корректировки содержания при каждом сохранении необходимо указать:<br /><br /><span style="font-family: courier new;">;Перезагрузка окна методов после каждого сохранения<br />(setq imenu-auto-rescan 1)</span><br /><br />Кроме того, установка ecb отменяет установленные по умолчанию переносы строк, которые не помещаются в окне редактора, на новую строку. Т.к. EMaxima может генерировать довольно длинные TeX - формулы в строку это бывает довольно неудобно. Для того чтобы вернуть перенос строк, нужно теперь указать это явно:<br /><br /><span style="font-family: courier new;">;Длинные строки всегда разбивать<br />(setq truncate-lines nil)<br />(setq truncate-partial-width-windows nil)</span>Kostafeyhttp://www.blogger.com/profile/14975242423333810114noreply@blogger.com0tag:blogger.com,1999:blog-6158999380322649405.post-36408483991121389862009-05-16T16:10:00.000-07:002009-05-21T03:50:36.322-07:00Графики в EMaximaЧто же необходимо для того чтобы уметь удобный способ добавления графиков?<br /><br />Если используется <span style="font-family: courier new;">pdflatex</span>, то лучше не применять формат eps. Необходимо использовать png (или подобный графический формат). В случае использования <span style="font-family: courier new;">latex</span> все с точностью до наоборот.<br /><br />Примеры из документации к Maxima:<br /><span style="font-family: courier new;"><br />plot2d (sin(x), [x, 0, 2*%pi], [psfile, "sin.eps"])$<br />plot2d (sin(x), [x, 0, 2*%pi], [gnuplot_term, png], [gnuplot_out_file, "sin.png"])$<br /></span><br /><br />Неприятность заключается в том, что знак "$" - есть начало (или конец) формулы в tex. Соответственно, подсветкой синтаксиса AUCTeX он именно так и воспринимается, сбивая с толку. Достаточно замкнуть формулу еще одним значком "$". Но то что формула для tex, для Maxima - ввод, который должен быть непустым. Достаточно вставить значение последнего вывода, которое, очевидно, будет пустым "%".<br /><br />Имя файла с рисунком желательно писать лишь однажды, чтобы в случае необходимости его изменения не приходилось вносить правки во всем файле. Для этого используем текстовую переменную.<br /><br />Функция Maxima <span style="font-family: courier new;">print()</span> вставляет пробелы между выводимыми фрагментами строки, поэтому воспользуемся конкатенацией.<br /><br />Кроме того, если промежуточные действия Maxima в результирующем файле не нужны, то достаточно в объявлении ячейки EMaxima вставить звездочки "*".<br /><br />В результате ячейка может иметь вид:<br /><span style="font-family: courier new;"><br />\begin{maxima*}<br />OutFile : "img/graph.png"$%$<br />plot2d (sin(x), [x, 0, 2*%pi], [gnuplot_term, png], [gnuplot_out_file, OutFile])$%$<br />print(concat("\\includegraphics[width=15cm]{",OutFile,"}"))$%$<br />\end{maxima*}</span><br /><br />После вычисления данной ячейки (C-c C-u c) в директорию img (данная директория к этому моменту должна существовать), находящийся в той же директории, что и редактируемый файл будет выведен график функции, а в редактируемый файл выведется инструкция для tex по добавлению рисунка, для использования которого достаточно вынести его из окружения ячейки EMaxima:<br /><span style="font-family: courier new;"><br />\includegraphics[width=15cm]{img/graph.png} <br /></span>Kostafeyhttp://www.blogger.com/profile/14975242423333810114noreply@blogger.com0