tag:blogger.com,1999:blog-307441652024-03-14T03:00:00.521+11:00Записки дебианщикаВ этом блоге публикуются заметки и решения, найденные в процессе работы, освоения и жизни в дистрибутиве Debian GNU/Linux.virenshttp://www.blogger.com/profile/12420257446841864325noreply@blogger.comBlogger362110tag:blogger.com,1999:blog-30744165.post-45412010026613825222014-07-28T11:00:00.000+10:002014-08-02T01:11:38.106+10:00История создания алгоритма Быстрого Преобразования ФурьеСразу после публикации статьи Кули и Тьюки [1], в которой описывался алгоритм вычисления быстрого преобразования Фурье (БПФ, FFT, Fast Fourier Transform), к авторам начали приходить письма с различными отзывами. Одни писали, что их новый революционный алгоритм распахнул невиданные горизонты для обработки сигналов и изображений, и теперь любая задача по плечу. Другие говорили [2], что алгоритм давным-давно известен и используется, так что их статья - лишь повтор того, что есть. <br />
И те, и другие были по-своему правы.<br />
<br />
Следует заметить, что время публикации статьи Кули и Тьюки [1] совпало с бурным развитием вычислительной техники, когда всё больше и больше задач решались на ЭВМ. В 1965 году, тем не менее, все высокоскоростные компьютеры были забиты заданиями под завязку. Более того, в те годы начали активно разрабатываться АЦП, которые позволяли вводить информацию в ЭВМ со скоростью нескольких тысяч отсчётов в секунду. Это означало, что теперь можно обрабатывать сигнал цифровым способом вместо использования аналоговых устройств. В свою очередь, потребовались эффективные алгоритмы обработки сигналов и изображений, многие из которых используют преобразование Фурье. Поэтому появление нового алгоритма, сулившего ускорить вычисление дискретного преобразования Фурье в <span class="MATH"></span> <span style="color: #009900;">$N/\log_2(N)$ </span>, было очень кстати.<br />
<br />
<h2 style="color: #996633;">
Создание алгоритма </h2>
По рассказам одного из авторов алгоритма, Джеймса Кули [3], всё началось в конце 1963 года. Джеймс Кули был нанят в IBM Thomas J. Watson Research Center в Yorktown Heights, что в Нью-Йорке. Кули работал над своим собственным проектом, когда к нему обратился Ричард Гарвин (Richard Garwin) и показал некоторые заметки Джона Тьюки (John Tukey) об алгоритме, который теоретически способен вычислять быстрое преобразование Фурье со скоростью, пропорциональной <span style="color: #009900;">$N\log_2(N)$</span>, а не <span style="color: #009900;">$N^2$</span>. Гарвин, в отличие от Кули, хорошо понимал всю важность этого алгоритма и его огромную практическую значимость, и поэтому настаивал на разработке этого алгоритма.<br />
<br />
``- Позже, - вспоминает Кули [2]. - я выяснил, что Гарвин был значительно более заинтересован в улучшении дистанционного сейсмического мониторинга ядерных взрывов; русские едва ли согласились бы на проведение инспекций на их территории. Гарвин так же видел необходимость в разработке методов раннего акустического обнаружения подводных лодок. Как и многие другие, я не считал это важным, поэтому поставил задаче разработки алгоритма БПФ приоритет ниже, чем собственным исследованиям. Тем не менее, под напором авторитета Гарвина и его постоянных телефонных звонков, я написал алгоритм для вычисления трёхмерного БПФ.''<br />
<br />
<h2>
<a href="https://www.blogger.com/blogger.g?blogID=30744165" name="SECTION00012000000000000000"> <span style="color: #996633;">История БПФ</span></a> </h2>
Перед публикацией нужно было проверить, является ли идея алгоритма новой, и Кули решил посоветоваться с Джоном Тьюки. Тьюки посоветовал просмотерть несколько статей, в одной из которых [4] описывался очень похожий метод, скорость которого была несколько меньше. Было понятно, что идея их алгоритма в целом не нова, и это заставило Кули глубже изучить историю БПФ. Его непосредственный начальник, Гарвин, обратился к своему коллеге, профессору Томасу (Professor L.H. Thomas), который был в своё время научным руководителем Кули в институте. Томас дал свою опубликованную статью [5], в которой описывалось вычисление рядов Фурье, которые он проделал в 1948 году в IBM на табуляторе с перфокартами. По словам Томаса, он просто пошёл в библиотеку и взял справочник [6]. Методы, опубликованные в этом справочнике, позволяли вычислять ряды Фурье и уменьшать объёмы вычислений используя свойство симметрии тригонометрических функций.<br />
<br />
Вскоре после публикации [1] Кули получил письмо от Филипа Рудника из Института Океанографии в Санн-Диего, Калифорния. Рудник сказал, что сам реализовал подобный алгоритм, используя метод из [7]. Статья Рудника с улучшенным вариантом такого метода вышла [8] чуть позднее статьи Кули и Тьюки - он не решился публиковать её сразу. <br />
Оказалось, что приёмы, лежащие в основе БПФ, были опубликовы ещё раньше. В том же справочнике Стампффа [6] нашлась ссылка на более ранние работы Рунге и Кёнига [9]. В той работе так же использовался метод ``бабочки'' (Метод ``бабочки'', butterfly, заключается в использовании сделанных вычислений для получения соседних значений сложением или вычитанием уже полученных) для ускорения вычислений и контроля ошибок.<br />
<br />
Кули написал статью [10], в которой приводилась, как он полагал, полную историю предшествующих похожих алгоритмов вычисления БПФ вплоть до работ Рунге [9]. Однако пыль веков скрывала в себе много интересного, и вскоре Кули получил ссылку от коллеги [11] на ещё более ранюю работу по вычислению БПФ. Это была глава книги великого Карла Фридриха Гаусса [12]. В этой главе, написанной на неоклассической латыни, приводились основные соображения алгоритма БПФ. Гаусс применял разновидность интерполяции по Лагранжу, и это могло привести его к возможности сокращения количества операций при быстром преобразовании. Позже были опубликованы работы [13,11], в которых приведён краткий перевод работы Карла Гаусса, предвосхтившей БПФ, а так же упомянуты другие работы, посвящённые БПФ. <br />
<br />
<h2>
<span style="color: #996633;">Выводы</span> </h2>
Из всей этой истории читатель может извлечь ценные выводы:<br />
<br />
1. Очевидно, что понимание важности и быстрая публикация значительных достижений очень и очень важны. <br />
2. Аккуратное отношение к старой литературе может принести большую пользу. Награды за выдающиеся достижения должны предшествовать анализу старых публикаций и книг. <br />
3. Общение между математиками, инженерами и специалистами прикладных областей является крайне плодотворным. <br />
4. Не публикуйте статьи на нео-классической латыни.<br />
<br />
<h2>
<a href="https://www.blogger.com/blogger.g?blogID=30744165" name="SECTION00020000000000000000"> <span style="color: #996633;">Литература</span></a> </h2>
<dl compact="compact"><dd></dd>
<dt><a href="https://www.blogger.com/blogger.g?blogID=30744165" name="cooleytukey">1</a> </dt>
<dd>Cooley J.W. and Tukey J.W. An algorithm for the machine calculation of the complex fourier series. <i>Mathematics Computation</i>, 19:297-301, 1965. </dd>
<dt><a href="https://www.blogger.com/blogger.g?blogID=30744165" name="cooleyaboutFFTrediscover">2</a> </dt>
<dd>James W. Cooley. The re-discovery of the fast fourier transform algorithm. <i>Mikrochimica Acta</i>, III:33-45, 1987. </dd>
<dt><a href="https://www.blogger.com/blogger.g?blogID=30744165" name="cooleyFFTgainacceptance">3</a> </dt>
<dd>J.W. Cooley. How the FFT gained acceptance. <i>Proceedings of the Association for Computing Machinery Conference on the History of Scientific and Numeric Computation, Princeton, NJ</i>, pages 10-13, 1987. </dd>
<dt><a href="https://www.blogger.com/blogger.g?blogID=30744165" name="goodFFTearly">4</a> </dt>
<dd>J. Good I. J. <i>Royal Statist. Soc.,</i>, 20:361, 1958. </dd>
<dt><a href="https://www.blogger.com/blogger.g?blogID=30744165" name="lhthomasFFT">5</a> </dt>
<dd>L. H. Thomas. <i>Applications of Digital Computers</i>, chapter Using a Computer to Solve Problems in Physics. Boston: Ginn and Company, 1963. </dd>
<dt><a href="https://www.blogger.com/blogger.g?blogID=30744165" name="stumpffhandbook">6</a> </dt>
<dd>K. Stumpff. <i>Grundlagen und Methoden der Periodenforschung, Tafeln und Aufgaben zur Harmonischen Analyse und Periodogrammrechnung</i>. Springer, Berlin, 1939. </dd>
<dt><a href="https://www.blogger.com/blogger.g?blogID=30744165" name="danielsonFFT">7</a> </dt>
<dd>G. C. Danielson and C. Lanczos. Some improvements in practical fourier analysis and their application to x-ray scattering from liquids. <i>J. Franklin Inst. 233, Pergamon Journals, Ltd.</i>, pages 365-80, 1942. </dd>
<dt><a href="https://www.blogger.com/blogger.g?blogID=30744165" name="rudnikFFTvarian">8</a> </dt>
<dd>Philip Rudnick. Note on the calculation of fourier series. <i>Math. Comp.</i>, Vol. 20, No.3:429-430, July 1966. </dd>
<dt><a href="https://www.blogger.com/blogger.g?blogID=30744165" name="rungekenigFFTearly">9</a> </dt>
<dd>C. Runge and H. Konig. <i>Vorlesungen uber Numerisches Rechnen (Die Grundlehren der Mathematischen Wissenschaften, Band XI)</i>. Springer, Berlin, 1924. </dd>
<dt><a href="https://www.blogger.com/blogger.g?blogID=30744165" name="coolylewiswelshFFThist">10</a> </dt>
<dd>J.W. Cooley, P.A. Lewis, and P.D. Welch. An algorithm for the machine calculation of complex fourier series. <i>IEEE Trans. Audio Electroacoustics</i>, AU-15:76, 1967. </dd>
<dt><a href="https://www.blogger.com/blogger.g?blogID=30744165" name="goldstinehistorynumericalanalysis">11</a> </dt>
<dd>H.H. Goldstine. <i>A History of Numerical Analysis from the 16th Through the 19th Century</i>. Springer-Verlag, New York, Heidelberg, and Berlin, 1977. </dd>
<dt><a href="https://www.blogger.com/blogger.g?blogID=30744165" name="cfgaussFFT">12</a> </dt>
<dd>C.F. Gauss. Nachla: Theoria interpolationis methodo nova tractata. <i>(Carl Friedrich Gauss, Werke, Band 3), Konigliche Gesellschaft der Wissenschaften, Gottingen</i>, pages 265-303, 1866. </dd>
<dt><a href="https://www.blogger.com/blogger.g?blogID=30744165" name="heidemanguassFFThist">13</a> </dt>
<dd>M.T. Heideman, D.H. Johnson, and C.S. Burrus. Gauss and the history of the fast fourier transform. <i>The ASSP Magazine</i>, Vol. 1, No. 4:14-21, Oct. 1984. </dd></dl>
virenshttp://www.blogger.com/profile/12420257446841864325noreply@blogger.com9tag:blogger.com,1999:blog-30744165.post-62666516754173687562014-06-09T18:30:00.000+10:002014-06-10T23:31:53.203+10:00Свистульки, бубенчики и рюшечки в документах LaTeXКак все уже хорошо знают, в ЛаТеХ добиться хорошего качества документов по умолчанию очень просто: используя десяток стандартных команд, вы получите неизменно превосходный результат (ТМ) без лишних усилий. То есть документ будет хорош, но ведь иногда хочется украшательств, мигалок, свистулек и бубенчиков. На эту тему автор уже собрал небольшую коллекцию, которой и рад поделиться. Кроме того, автор открыл для себя удивительные книги <a href="http://en.wikipedia.org/wiki/Edward_Tufte">Edward Tufte</a>, который знает толк в визуальной подаче информации.<br />
<br />
<br />
<a name='more'></a><br />
<h2 id="">
<span style="color: #b45f06;">Украшательства в ЛаТеХ документах</span></h2>
Как правило, в научных документах такое не сильно поощряется, но если есть желание повыделываться, то в приличных местах этому, как правило, не противятся. Среди терпимых украшательств можно выделить буквицы (drop caps), оформление цветом всего и вся, нумерацию строк по главам.<br />
<h3 id="drop-capital">
<span style="color: #783f04;">Буквица (Drop Capital) в ЛаТеХ</span></h3>
Если открыть старинные книги, то первая буква главы там обычно была большой и вычурной. Хотя в научных публикациях такое, в целом, встречается редко, сделать буквицу в ЛаТеХ можно запросто. Для этого подключаем пакеты:<br />
<blockquote>
<pre><span style="color: maroon;">\usepackage</span><span style="color: black;">[usenames,dvipsnames,svgnames,table]{xcolor}</span></pre>
<pre><span style="color: maroon;">\usepackage</span><span style="color: black;">{lettrine} </span><span style="color: grey; font-style: italic;">%%% To make a Drop Cap</span>
<span style="color: maroon;">\usepackage</span><span style="color: black;">{yfonts} </span><span style="color: grey; font-style: italic;">%% to make a fancy Gothic drop caps.</span></pre>
</blockquote>
Первый пакет содержит <b>lettrine</b> для LaTeX, второй - вычурные шрифты. Если у вас Debian, то достаточно установить дополнительные пакеты:<br />
<blockquote>
texlive-fonts-extra - TeX Live: Extra fonts<br />
texlive-latex-extra - TeX Live: LaTeX supplementary packages</blockquote>
и теперь в документе можно использовать цветные буквицы:<br />
<blockquote>
<pre><span style="color: maroon;">\definecolor</span><span style="color: black;">{currentfancycolout}{RGB}{164,179,3}</span>
<span style="color: maroon;">\lettrine</span><span style="color: black;">[lines=3]{</span><span style="color: maroon;">\color</span><span style="color: black;">{currentfancycolout}</span>
<span style="color: maroon;">\textbf</span><span style="color: black;">{{</span><span style="color: maroon;">\small\initfamily</span><span style="color: black;"> F}}}{ ormulation} of </span><span style="color: maroon;">\lipsum</span><span style="color: black;">[1-2]</span></pre>
</blockquote>
Вот как это выглядит в жизни:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-bHMiDDuK_ic/U5SmAn-HbyI/AAAAAAAAEBw/PshFmMVjWh4/s1600/post_RopCap.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-bHMiDDuK_ic/U5SmAn-HbyI/AAAAAAAAEBw/PshFmMVjWh4/s1600/post_RopCap.jpg" height="96" width="400" /></a></div>
Мелочь, но тем не менее красивая. Кожаный переплёт опционален :-)<br />
<br />
<h3 id="_1">
<span style="color: #783f04;">Эпиграфы к главам</span></h3>
Пакет с простым названием <b>epigraph</b> делает то, что и подразумевается: вставляет эпиграфы в начале глав. Для этого подключаем пакет:<br />
<blockquote>
<pre><span style="color: maroon;">\usepackage</span><span style="color: black;">{epigraph} </span><span style="color: grey; font-style: italic;">%%% to make inspirational quotes.</span></pre>
</blockquote>
и начинаем цитировать умных дядь по поводу и без:<br />
<blockquote>
<pre><span style="color: maroon;">\epigraph</span><span style="color: black;">{</span><span style="color: maroon;">\textit</span><span style="color: black;">{The greatest difficulties lie where we are not looking for them.}}
{-- Johann Wolfgang von Goethe}</span></pre>
</blockquote>
Первый параметр - цитата, второй - автор цитаты. Вот как выглядит:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-1KNNONgfspo/U5SmJD0KzPI/AAAAAAAAEB4/XY-xVooFksM/s1600/post_Epigraph.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-1KNNONgfspo/U5SmJD0KzPI/AAAAAAAAEB4/XY-xVooFksM/s1600/post_Epigraph.jpg" height="248" width="400" /></a></div>
<br />
Взято из <a href="http://mysite.mvkonnik.info/ph-d-thesis-online-constrained-receding-horizon-control-for-astronomical-adaptive-optics">моей собственной Ph.D.</a> <br />
<br />
<br />
<h3 id="_2">
<span style="color: #783f04;">Номера страниц, включающие номер главы</span></h3>
В больших документах, типа книг или в пространных технических отчётах, имеет смысл нумеровать страницы как НОМЕРГЛАВЫ-Страница. То есть, скажем, номер страницы 7-11 означает Глава 7, страница 11. Так как всё уже <strike>украдено до нас</strike> сделано латехниками, нам осталось только воспользоваться пакетом<br />
<br />
<pre><span style="color: maroon;">\usepackage</span><span style="color: black;">[auto]{chappg} </span><span style="color: grey; font-style: italic;">%%% this is to set the page numbers as Chapter-Page.</span></pre>
<br />
который автоматически пересчитает все страницы в формат Глава-Страница вот так:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-U90Df7nqasE/U5SmruUOGoI/AAAAAAAAECA/GgtviVLo3pI/s1600/post_pagenum.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-U90Df7nqasE/U5SmruUOGoI/AAAAAAAAECA/GgtviVLo3pI/s1600/post_pagenum.jpg" height="66" width="400" /></a></div>
<br />
<h3>
<span style="color: #783f04;"><big><b>Работа с колонтитулами в LaTeX</b></big></span></h3>
Колонтитулы это, говоря простым языком, тот текст, который появляется вверху и внизу страницы - например, вверху обычно пишут название книги или имя главы отчёта, а внизу - номер страницы.<br />
<br />
Для переопределения содержимого колонтитулов следует подключить пакеты расширений<br />
<blockquote>
<span style="color: #990000;">\usepackage</span>{fancybox,fancyhdr} <span style="color: black;"></span><span style="color: grey; font-style: italic;">%this packages provides fancy up and bottom of page</span> </blockquote>
в преамбуле документа. Там же, в преамбуле, будет задаваться содержимое колонтитутов. Как и прежде, чтобы лучше понять команды, откройте на другом виртуальном экране просмотрщик dvi-файлов.<br />
<br />
После всех этих приготовлений вставляем в преамбуле следующий код:<br />
<blockquote>
<span style="color: maroon;">\fancyhead</span><span style="color: black;">[R]{Это простой пример верхнего колонтитула}</span><span style="color: maroon;"><br />
\fancyhead</span><span style="color: black;">[L]{}</span><span style="color: maroon;"><br />
\fancyhead</span>[C]{}<span style="color: maroon;"><br />
<br />
\fancyfoot</span><span style="color: black;">[R]{ </span><span style="color: maroon;">\copyright</span><span style="color: black;"> Конник М.В., перевод}</span><span style="color: maroon;"><br />
\fancyfoot</span><span style="color: black;">[L]{Страница </span><span style="color: maroon;">\thepage</span><span style="color: black;"> </span><span style="color: maroon;">\;</span><span style="color: black;"> из </span><span style="color: #f00000;">\pageref</span><span style="color: black;">{</span><span style="color: #0000d0;">LastPage</span><span style="color: black;">}}</span><span style="color: maroon;"><br />
\fancyfoot</span><span style="color: black;">[C]{}</span></blockquote>
Как легко догадается, <span style="color: maroon;">\fancyhead </span>управляет верхним колонтитулом, а <span style="color: maroon;">\fancyfoot</span><span style="color: black;"> </span>управляет нижним.<br />
<br />
Дальше в квадратных скобках следует уточнение, какая часть колонтитула имеется в виду - правая, левая или центральная. <span style="color: maroon;"></span>Если не указать часть колонтитула, <span style="color: maroon;">\fancyhead</span><span style="color: black;">{текст} будет одинаковым в левом, правом и центральном колонитуле.</span><br />
<br />
Этот пример интересен ещё и тем, что здесь показан один полезный трюк: левый нижний колонтитул будет выглядеть как "Страница N из M". Для этого следует подключить расширение<br />
<blockquote>
<span style="color: #990000;">\usepackage</span>{lastpage} </blockquote>
Текст колонтитулов можно задать и более хитро, например менять их в зависимости чётности страницы. Это потребует применения пакета ifthen.<br />
<br />
<blockquote>
<small>Дальше, что называется, для продвинутых. Например, надо на каждой чётной странице писать "чётная", а на нечётной, соответственно, "нечётная". Для этого в преамбуле подключаем <span style="color: maroon;"><br />
<br />
\usepackage</span><span style="color: black;">{ifthen}</span><br />
<br />
и правим:<br />
<br />
<span style="color: maroon;"> \fancyfoot</span><span style="color: black;">[C]{</span><span style="color: maroon;">\ifthenelse</span><span style="color: black;">{</span><span style="color: maroon;">\isodd</span><span style="color: black;">{</span><span style="color: maroon;">\thepage</span><span style="color: black;">}}{нечётная}{чётная} }</span><br />
Здесь правило такое: <span style="color: black;"></span><span style="color: maroon;">\ifthenelse</span><span style="color: black;">{</span><span style="color: maroon;"></span><span style="color: maroon;">условие проверки</span><span style="color: black;">}{если <b>НЕ истина</b>}{если <b>истина</b>}.</span></small></blockquote>
<h4>
<span style="color: #996633;"><b> <span style="color: #783f04;">Колонтитулы в работе</span></b></span></h4>
Теперь нужно включить использование "кучерявых и причудливых" колонтитулов:<br />
<blockquote>
<span style="color: #f00000;">\begin</span><span style="color: black;">{</span><span style="color: #0000d0;">document</span><span style="color: black;">}</span><span style="color: maroon;"><br />
\pagestyle</span><span style="color: black;">{fancy}</span> </blockquote>
После этого скомпилируйте документ и посмотрите как он выглядит.<br />
<br />
Если нужно на время отключить вообще все "навороты" на странице, это делается командой <span style="color: maroon;">\pagestyle</span><span style="color: black;">{empty}</span><br />
<br />
Чтобы убрать полосу вверху страницы, отчёркивающую колонтитул от содержания страницы, можно использовать в преамбуле такое переопределение:<br />
<span style="color: #990000;"></span><br />
<blockquote>
<span style="color: #990000;">\renewcommand</span>{\headrulewidth}{0pt}</blockquote>
Эти трюки часто требуются для отображения в документе дополнительной информации, например, номера ревизии в Subversion репозитории, как уже говорилось <a href="http://mydebianblog.blogspot.com/2009/05/latex-python.html" target="_blank">здесь</a>.<br />
<br />
<br />
<h3 id="header-and-footer">
<span style="color: #783f04;">Верхний и нижний колонтитул (Header and Footer) для чётных и нечётных страниц</span></h3>
Вариантов проделывания такого трюка по крайней мере два: используя пакет <b>hancyhdr</b> или пакет <b>titlesec</b>.<br />
<h4 id="titlesec">
<span style="color: #660000;">Вариант с пакетом <b>titlesec</b></span></h4>
В преамбуле документа пишем:<br />
<br />
<pre><span style="color: maroon;">\usepackage</span><span style="color: black;">{titlesec}</span>
<span style="color: black;"> </span><span style="color: maroon;">\newpagestyle</span><span style="color: black;">{kmvmain}[</span><span style="color: maroon;">\small</span><span style="color: black;">]{</span>
<span style="color: black;"> </span><span style="color: maroon;">\setheadrule</span><span style="color: black;">{.2pt}</span><span style="color: grey; font-style: italic;">%</span>
<span style="color: black;"> </span><span style="color: maroon;">\sethead</span><span style="color: black;">[</span><span style="color: maroon;">\colorbox</span><span style="color: black;">{currentfancycolout}{</span><span style="color: maroon;">\color</span><span style="color: black;">{white}{</span><span style="color: maroon;">\textbf</span><span style="color: black;">{</span><span style="color: maroon;">\large</span><span style="color: black;"> </span><span style="color: maroon;">\thepage</span><span style="color: black;">}}}]</span><span style="color: grey; font-style: italic;">% even-left</span>
<span style="color: black;"> [</span><span style="color: maroon;">\textsc</span><span style="color: black;">{Chapter~</span><span style="color: maroon;">\thechapter</span><span style="color: black;">: </span><span style="color: maroon;">\chaptertitle</span><span style="color: black;">}]</span><span style="color: grey; font-style: italic;">% even-center</span>
<span style="color: black;"> [</span><span style="color: maroon;">\colorbox</span><span style="color: black;">{lightgrey}{</span><span style="color: maroon;">\textbf</span><span style="color: black;">{</span><span style="color: maroon;">\thesection</span><span style="color: black;">}}]</span><span style="color: grey; font-style: italic;">% even-right</span>
<span style="color: black;"> {</span><span style="color: maroon;">\colorbox</span><span style="color: black;">{lightgrey}{</span><span style="color: maroon;">\textbf</span><span style="color: black;">{</span><span style="color: maroon;">\thesection</span><span style="color: black;">}}}</span><span style="color: grey; font-style: italic;">% odd-left</span>
<span style="color: black;"> {</span><span style="color: maroon;">\sectiontitle</span><span style="color: black;">}</span><span style="color: grey; font-style: italic;">% odd-center</span>
<span style="color: black;"> {</span><span style="color: maroon;">\colorbox</span><span style="color: black;">{currentfancycolout}{</span><span style="color: maroon;">\color</span><span style="color: black;">{white}{</span><span style="color: maroon;">\textbf</span><span style="color: black;">{</span><span style="color: maroon;">\large</span><span style="color: black;"> </span><span style="color: maroon;">\thepage</span><span style="color: black;">}}}}</span><span style="color: grey; font-style: italic;">% odd-right</span>
<span style="color: black;"> }</span></pre>
<br />
тем самым создав стиль <i>kmvmain</i>, который и будем потом использовать. <br />
Далее в тексте используем: <br />
<blockquote>
<pre><span style="color: maroon;">\pagestyle</span><span style="color: black;">{kmvmain}</span></pre>
</blockquote>
и после этого стиль колонтитулов изменится на вычурный.<br />
<h4 id="hancyhdr">
<span style="color: #660000;"> </span></h4>
<h4 id="hancyhdr">
<span style="color: #660000;">Вариант с пакетом <b>hancyhdr</b></span></h4>
В преамбуле документа пишем:<br />
<br />
<pre><span style="color: maroon;">\usepackage</span><span style="color: black;">{fancyhdr}</span>
<span style="color: maroon;">\fancyhead</span><span style="color: black;">[RO]{</span><span style="color: maroon;">\colorbox</span><span style="color: black;">{currentfancycolout}{</span><span style="color: maroon;">\color</span><span style="color: black;">{white}{</span><span style="color: maroon;">\textbf</span><span style="color: black;">{</span><span style="color: maroon;">\large</span><span style="color: black;"> </span><span style="color: maroon;">\thepage</span><span style="color: black;">}}}} </span><span style="color: grey; font-style: italic;">%% odd-right </span>
<span style="color: maroon;">\fancyhead</span><span style="color: black;">[LE]{</span><span style="color: maroon;">\colorbox</span><span style="color: black;">{currentfancycolout}{</span><span style="color: maroon;">\color</span><span style="color: black;">{white}{</span><span style="color: maroon;">\textbf</span><span style="color: black;">{</span><span style="color: maroon;">\large</span><span style="color: black;"> </span><span style="color: maroon;">\thepage</span><span style="color: black;">}}}} </span><span style="color: grey; font-style: italic;">%%% even-left</span>
<span style="color: maroon;">\fancyhead</span><span style="color: black;">[LO]{</span><span style="color: maroon;">\colorbox</span><span style="color: black;">{lightgrey}{</span><span style="color: maroon;">\textbf</span><span style="color: black;">{</span><span style="color: maroon;">\thesection</span><span style="color: black;">}}}</span><span style="color: grey; font-style: italic;">% odd-left</span>
<span style="color: maroon;">\fancyhead</span><span style="color: black;">[RE]{</span><span style="color: maroon;">\colorbox</span><span style="color: black;">{lightgrey}{</span><span style="color: maroon;">\textbf</span><span style="color: black;">{</span><span style="color: maroon;">\thesection</span><span style="color: black;">}}}</span><span style="color: grey; font-style: italic;">% even-right </span>
<span style="color: maroon;">\fancyhead</span><span style="color: black;">[CE]{</span><span style="color: maroon;">\rightmark</span><span style="color: black;">}</span><span style="color: grey; font-style: italic;">% odd-center, with the name of the Section</span>
<span style="color: maroon;">\fancyhead</span><span style="color: black;">[CO]{</span><span style="color: maroon;">\textsc</span><span style="color: black;">{Chapter~</span><span style="color: maroon;">\thechapter</span><span style="color: black;">: </span><span style="color: maroon;">\leftmark</span><span style="color: black;">}}</span><span style="color: grey; font-style: italic;">% Even-center, with the name of the Chapter.</span>
<span style="color: maroon;">\fancyfoot</span><span style="color: black;">[L,R,C]{}</span></pre>
<br />
Параметры у <a href="http://texblog.org/2007/11/07/headerfooter-in-latex-with-fancyhdr/">fancyhead и fancyfoot одинаковы</a> и означают вот что:<br />
<br />
<pre><code>E: Even page (чётная страница)
O: Odd page (нечётная страница)
L: Left field (левое поле)
C: Center field (цетральное поле)
R: Right field (правое поле)
H: Header (верхний колонтитул)
F: Footer (нижний колонтитул)
</code></pre>
<br />
Далее вставляем в требуемое место упоминание вычурного (fancy) стиля:<br />
<blockquote>
<pre><span style="color: maroon;">\pagestyle</span><span style="color: black;">{fancy}</span></pre>
</blockquote>
Автор черпал вдохновение <a href="http://tex.stackexchange.com/questions/51015/different-header-for-odd-and-even-pages-with-fancyhdr">в посте на stackexchange про fancyhdr</a> полной ложкой.<br />
<br />
<h2 id="_3">
<span style="color: #b45f06;">Эдвард Тафтэ и искусство отображения информации</span></h2>
<span style="color: #b45f06;"> </span><a href="http://2.bp.blogspot.com/--pYnG-Z8BL8/U5SoCYhPy1I/AAAAAAAAECM/vDEuNf17wG4/s1600/edward-tufte-envisioning-information-01.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="http://2.bp.blogspot.com/--pYnG-Z8BL8/U5SoCYhPy1I/AAAAAAAAECM/vDEuNf17wG4/s1600/edward-tufte-envisioning-information-01.jpg" height="274" width="320" /></a>Отображение данных, представление данных в виде таблиц и построение наглядных графиков - целое искусство. В этой области <a href="http://en.wikipedia.org/wiki/Edward_Tufte">Edward Tufte</a> - это Леонардо да Винчи отображения данных. Пожалуй, одна из его лучших книг - <a href="http://www.amazon.com/Envisioning-Information-Edward-R-Tufte/dp/0961392118">Envisioning Information</a>, в которой он устраивает Tour De Fource информационного дизайна. <br />
<br />
Не говоря о том, что книга сама по себе безупречна с точки зрения дизайна, она содержит огромное количество советов, рецептов и примеров как хорошего, так и плохого дизайна. Большое количество иллюстраций и ссылок отлично дополняют материал, раскрывающий принципы наглядного отображения данных. <br />
<br />
Например, в главе ESCAPING FLATLAND, Тафтэ рассказывает о принципе small multitude - одна и та же структура, повторяющаяся много раз, и как это использовать в графиках. Этот прицнип позволяет сильно сэкономить место, подавая данные в более концетрированном и удобном для чтения виде.<br />
<br />
В главе MICRO/MACRO READINGS много говорится об использовании цвета, особенно для компактного отображения статистических данных на графиках. Его фраза<br />
<blockquote>
Clutter and confusion are failures of design, not attributes of information.</blockquote>
отлично проиллюстрирована в главе LAYERING AND SEPARATION, где показан чертёж сложного устройства, но выполненный настолько грамотно, что читается невероятно легко. Мимоходом критикует графики типа candlesticks (пример, <a href="http://4.bp.blogspot.com/-qOsiwOfEkJs/UDcw1aeTDjI/AAAAAAAAC0c/J7IWFKepfkc/s400/candlesticks.5.png">такой</a>, что <a href="http://mydebianblog.blogspot.ru/2012/11/gnuplot-conditional-data-plotting-in.html">уже обсуждалось</a> в блоге). Вообще, о цвете Тафтэ говорит много и подробно, приводя многочисленные примеры и картографии и построения схем.<br />
<br />
Прошёлся он и по таблицам: глава NARRATIVES OF SPACEAND TIME одна из самых лучших в книге. Там он подробно разбирает абсолютно кошмарные таблицы, сделанные для расписаний поездов, и приводит примеры того, как это надо делать правильно.<br />
<br />
Желающим заценить визуальный катарсис можно посоветовать ЛаТеХ-класс <a href="http://www.ctan.org/pkg/tufte-latex" target="_blank">tufte-book</a>, который создан по всем канонам. Этот класс можно использовать и для ведения <a href="http://tex.stackexchange.com/questions/68525/using-latex-to-keep-a-diary" target="_blank">личного дневника</a>. Вот как выглядит образец книги, оформленной <a href="http://www.ctan.org/pkg/tufte-latex" target="_blank">tufte-book</a>:<br />
<br />
<iframe height="480" src="https://docs.google.com/file/d/0BzB6Cne-szGwZDN4bE5UVzVCalk/preview" width="640"></iframe><br />
<br />
<h2 id="_4">
<span style="color: #b45f06;">Эпилог</span></h2>
Оформление документов - дело тонкое, и то, что иногда кажется бесполезным украшательством, может сильно упростить чтение данных. Хотя цветные буквицы в документах - почти всегда выпендрёж, использование цвета и грамотный подход к построению таблиц позволят читателю быстрее вникнуть в суть.virenshttp://www.blogger.com/profile/12420257446841864325noreply@blogger.com13tag:blogger.com,1999:blog-30744165.post-2568069464155565312014-02-10T00:30:00.000+11:002014-02-14T17:22:14.573+11:00Как написать статью в LaTeXРезультатом любого приличного исследования являются публикации. Вы делаете что-то новое, и это по идее должно немного (или значительно) двинуть научное знание вперёд. А так как научные тексты удобнее писать в LaTeX, специально для этого созданным не абы кем, а <a href="http://en.wikipedia.org/wiki/Donald_Knuth" target="_blank">Дональдом Кнутом</a>, то возникает непраздный вопрос: как же написать статью в LaTeX?!<br />
<br />
Вернее, вопросов два: как написать научную статью и как это сделать в ЛаТеХе?<br />
<br />
<br />
<div style="color: #7f6000;">
<span style="font-size: large;"><b>Как написать научную статью</b></span></div>
В Сети есть много <a href="http://chimik.ucoz.ru/publ/kak_napisat_nauchnuju_statju/1-1-0-1" target="_blank">хороших</a> и <a href="http://www.mvkonnik.info/2011/06/notes-on-structure-of-scientific.html" target="_blank">правильных</a> постов о том, как следовало бы писать статьи. Там вам скажут, что сначала придумывается заглавие, потом аннотация (abstract), потом красивое введение, потом, собственно, результаты исследований и, как апофеоз экзистенциального катарсиса, заключение.<br />
<br />
В жизни всё несколько иначе. Обычно стоит большая задача, которую нужно решить. Мы сидим, чещем затылок и листаем журналы в поисках намёков на решение. Пробуем то и это, и чаще всего либо оно не работает вообще, либо работает, но не так, как надо. Потом иногда приходит какая-нибудь хорошая и свежая мысль, и внутренний голос говорит "О! Это интересно", а внешний - "Ахххаааа!".<br />
<br />
После прихода этого самого "Аха!" вместе с хорошей идеей автор начинает что-то быстро писать на бумаге, прикидывать, покрякивать и энергично потирать ручонки. Далее, в состоянии полного угара творчества что-то ваяется, вычисляется, математически выводится, разливается по колбам, экспериментируется, программируется и численно симулируется. Это самое счастливое время, когда забываешь обо всём на свете и делаешь что-то занятное - за это, собственно, научным сотрудникам и платят деньги.<br />
<br />
Через некоторое время угар творчества проходит и автор видит наброски, куски кода, булькающие колбы, вереницы данных, таблицы и графики. Работа принимает более организованный характер: нужно сравнить с имеющимися методами, провести дополнительные эксперименты или расчёты. Если это что-то, чего ещё никто не делал - самое время приступать к написанию статьи.<br />
<br />
<b style="color: #7f6000;">Основная часть</b> таким образом у автора в том или ином виде уже есть, так что статья начинается с середины, а именно - с полученных данных. Всё, что написано <a href="http://mydebianblog.blogspot.com.au/2008/11/latex.html" target="_blank">про оформление диплома или курсового проекта в LaTeX</a>, полностью справедливо и здесь.<br />
<br />
В основной части считается хорошим тоном привести математическую формулировку или модель, которая соответствует процессам. Сравнение численной модели с реальным экспериментом тоже добавляет веса и доверию статье. Также стоит упомянуть, на каком компьютере проводились симуляции (особенно если вы предлагаете новый алгоритм и сравниваете с предыдущими), какое оборудование использовали и что булькало в пробирках.<br />
<br />
<br />
<b style="color: #7f6000;">Заглавие</b> обычно выбирается из пары десятков нагенерированных коллегами и автором вариантов. Как правило, заглавие статьи должно содержать некие ключевые слова, которые описывают содержимое статьи. Это важно, так как позволяет быстрее и проще вашу статью потом найти другим людям в поисковых системах. <br />
<br />
<br />
После этого пишется обычно одна из самых занудных частей статьи - <b style="color: #7f6000;">Заключение</b>. Дело это непростое и обычно приходит с опытом и набитием шишек. Так как люди обычно читают аннотацию (abstract), введение и заключение к статье, то они должны быть отполированы до зеркального блеска.<br />
<br />
Обычно <b style="color: #7f6000;">заключение</b> отвечает на три вопроса:<br />
<ol>
<li>Что за проблема решалась в статье?</li>
<li>Какие результаты были получены в статье?</li>
<li>Ну и что!?</li>
</ol>
Для ответа на эти вопросы, в особенности на последний, хорошо поиграть в игру "Ну и что?!". То есть представьте, что вы беседуете с редактором журнала, и он вас спрашивает: "ну и что в статье интересного-то?" или "почему я должен обратить на это внимание?".<br />
<br />
<br />
<b style="color: #7f6000;">Введение</b> это вторая по трудности часть после заключения. Введение обычно даёт формулировку целей исследования и достаточный обзор существующей литературы. Но это легко сказать, а что писать-то? Ну, например, автор этих строк пользуется следующей болванкой:<br />
<ol>
<li>Почему это исследование вообще проводилось?</li>
<li>Какая литература уже существует по этому вопросу? Здесь можно провести обзор и показать ту брешь, которую вы хотите заткнуть своей статьёй.</li>
<li>Какова конкретная цель исследований? Это теоретическое обоснование чего-то, или экспериментальная работа, или численные симуляции.</li>
<li>В чём новизна работы? </li>
</ol>
После написания введения и заключения можно писать аннотацию (abstract).<br />
<br />
<br />
<b style="color: #7f6000;">Аннотация (abstract)</b> это короткое описание цели работы, результатов и что в работе сообщается. В целом, аннотация пишется обычно из надёрганных предложений из Введения и Заключения. Обычно аннотации короткие и должны быть не длиннее, скажем, 250 слов (у журналов и конференций по этому поводу свои правила).<br />
<br />
<br />
<span style="font-family: georgia; font-size: 100%;"><br />
</span><br />
<br />
<br />
<div style="color: #7f6000;">
<span style="font-size: large;"><b>Как написать научную статью <i>в LaTeX</i></b></span></div>
<div style="text-align: right;">
<span style="font-size: x-small;"><i><u>Эпиграф</u>:</i></span></div>
<div style="text-align: right;">
<span style="font-size: x-small;"><i>LaTeX is capable of most things </i></span></div>
<div style="text-align: right;">
<span style="font-size: x-small;"><i>but not always in the most obvious manner. </i></span></div>
<br />
Собственно, как уже говорилось выше, почти всё, что нужно для этого, есть в постах <a href="http://mydebianblog.blogspot.com.au/2008/11/latex.html" target="_blank">о написании диплома в LaTeX</a>:<br />
<ul>
<li><a href="http://mydebianblog.blogspot.com/2008/12/latex.html">Как оформить текст в LaTeX: вёрстка текста</a></li>
<li><a href="http://mydebianblog.blogspot.com/2008/12/latex_08.html">Как оформить текст в LaTeX: структура текста</a><span class="fullpost"><br />
</span></li>
<li><span style="font-size: 100%;"><a href="http://mydebianblog.blogspot.com/2009/01/latex-math-in-latex.html">Математические формулы в LaTeX: Math in LaTeX</a></span></li>
<li><a href="http://mydebianblog.blogspot.com/2008/12/latex_15.html">Иллюстрации и рисунки в LaTeX</a></li>
<li><a href="http://mydebianblog.blogspot.com/2009/01/tables-in-latex.html">Набор таблиц в ЛаТеХе: Tables in LaTeX</a></li>
<li><a href="http://mydebianblog.blogspot.com/2006/11/latex-jabref.html">Библиография в LaTeX, BiBTeX и JabRef</a></li>
<li><a href="http://mydebianblog.blogspot.com/2008/06/bibtex.html">Зачем нужен BiBTeX и как его использовать</a></li>
<li><a href="http://mydebianblog.blogspot.com/2006/11/latex-usepackage.html" target="_blank">Пакеты расширения в LaTeX</a> </li>
</ul>
Есть одно НО: у каждого журнала или конференции есть свой собственный, не имеющий аналогов в мире, стилевой файл LaTeX разной степени корявости и тухлости. Как правило, там содержится рабочий пример статьи, так что лучше попробовать сначала собрать пример.<br />
<br />
Но если вы думаете, что отправленную вами в журнал статью примут "с колёс" и без редакции, то вы либо крутой нобелевский лауреат, либо большой оптимист. И поэтому скорее всего вам предстоит общение с рецензентами и редактором журнала. Вот тут-то LaTeX нам и сослужит добрую службу....<br />
<br />
<br />
<b style="color: #7f6000;">Рецензии и правки научных статей в LaTeX</b> <br />
Ещё до того, как вы отправите статью, лучше всего использовать одноколоночный набор и включить нумерацию строк, чтобы рецензенты ссылались не просто на страницу, а сразу на конкретную строку. <br />
<br />
<br />
<b style="color: #7f6000;">Нумерация строк в LaTeX</b><br />
Нумерация строк включается пакетом <a href="http://www.ctan.org/tex-archive/macros/latex/contrib/lineno" target="_blank">lineno</a>, который можно скачать <a href="http://mirror.ctan.org/macros/latex/contrib/lineno.zip" target="_blank">здесь</a>. В преамбуле документа добавляем<br />
<blockquote class="tr_bq">
<span style="color: #990000;">\usepackage</span>[mathlines]{lineno}<span style="color: #999999;">% Enable numbering </span></blockquote>
Отлично, теперь вставляем команду:<br />
<blockquote class="tr_bq">
<span style="color: #990000;">\linenumbers\par</span> <span style="color: #cccccc;">%%% <---- turn on the numeration of lines</span></blockquote>
там, где мы хотим начать нумерацию линий. Если нужно оборвать нумерацию в конце статьи перед, скажем, списком литературы, команда выглядит так:<br />
<blockquote>
<span style="color: #990000;">\nolinenumbers</span> <span style="color: #999999;">%%% do not use line numbers any more.</span></blockquote>
Важно то, что пакет lineno позволяет не только автоматически проставлять номера строк, но ещё и ссылаться на них. Автор настоятельно рекомендует использовать эту возможность, чтобы не сойти с ума самому при правках и не злить рецензентов.<br />
<br />
Для этого в том месте, которое вы обещаете рецензенту поправить (и делаете это), ставим ссылку:<br />
<blockquote class="tr_bq">
<span style="color: #990000;">\linelabel</span>{<span style="color: #073763;">review:1R1</span>} </blockquote>
Как и везде в ЛаТеХе, ссылки стоит ставить разумные: например, здесь написано, что это ответ на замечание 1 от рецензента 1 (они обычно анонимные).<br />
<br />
Далее в тексте ответа на замечания рецензентов пишем что-то типа:<br />
<blockquote class="tr_bq">
We clarified this on page~<span style="color: #990000;">\pageref</span>{<span style="color: #073763;">review:1R1</span>} line~<span style="color: #990000;">\ref</span>{<span style="color: #073763;">review:1R1</span>}.</blockquote>
<br />
Наступает счастье: здесь мы приводим не только ссылку на строку (<span style="color: #990000;">\ref</span>{<span style="color: #073763;">review:1R1</span>}) но и сразу на страницу (<span style="color: #990000;">\pageref</span>{<span style="color: #073763;">review:1R1</span>}).<br />
<br />
Вместо конструкции $$ ..... $$ следует использовать \[ ... \] или \begin{displaymath} ....\end{displaymath}, тогда пакет lineno правильно проставит номера строк в тексте с математическими формулами.<br />
<br />
Больше о нумерации строк вам расскажет <a href="http://mirrors.ctan.org/macros/latex/contrib/lineno/lineno.pdf" target="_blank">весьма толковая документация к пакету lineno</a>. <br />
<br />
<br />
<b style="color: #7f6000;">Ссылка на сноски в LaTeX</b><br />
Допустим, вы сказали, что угоняете часть тектса в сноску. Об этом лучше написать рецензенту прямо, чтобы он не искал кусок пропавшего текста по всему документу.<br />
<br />
Для этого пишем в преамбуле документа:<br />
<blockquote class="tr_bq">
<span style="color: #990000;">\newcommand</span>{\footnoteremember}[2]{\footnote{#2} <span style="color: #990000;">\newcounter</span>{#1} \setcounter{#1}{\value{footnote}}} <span style="color: #990000;">\newcommand</span>{\footnoterecall}[1]{\footnotemark[\value{#1}]}</blockquote>
Теперь в тексте можно написать:<br />
<br />
<blockquote class="tr_bq">
The Finite Element Analysis was perfomed on a crappy computer<span style="color: #990000;">\footnoteremember</span>{footnotelatitude}{Simulations were run on the Dell Latitude E5400 notebook with Intel Celeron 2.2 GHz processor, 2GB DDR2 SDRAM, 120 GB SATA HDD 5400 rpm under Debian GNU/Linux v 5.0 with MATLAB v2007b for UNIX.}.</blockquote>
<br />
Так что у нас есть ссылка footnotelatitude которая ведёт на сноску. Теперь сослаться на неё можно так:<br />
<blockquote class="tr_bq">
(see footnote<span style="color: #990000;">\footnoterecall</span>{footnotelatitude})</blockquote>
И вы теперь сможете видеть номер сноски, на которую вы ссылаетесь. Трюк позаимствован <a href="http://anthony.liekens.net/index.php/LaTeX/MultipleFootnoteReferences" target="_blank">отсюда</a>.<br />
<br />
<br />
<b style="color: #7f6000;">Перевод PDF в простой текст</b><br />
Сгенерированные ЛаТеХом документы часто переводятся в PDF, но иногда требуется перевести всё в простой текст. Часто это следует делать с сохранением структуры, и тут нам поможет pdftotext:<br />
<blockquote class="tr_bq">
<b>pdftotext</b> -layout -nopgbrk reviewnotes_12-0238_MS.pdf</blockquote>
где ключи означают: <br />
<blockquote class="tr_bq">
-layout : maintain original physical layout<br />
-nopgbrk : don't insert page breaks between pages</blockquote>
Если нужно перевести в текст только со страницы 5 по страницу 10, даём команду:<br />
<blockquote class="tr_bq">
<b>pdftotext</b> <span style="color: magenta;">-f 5</span> <span style="color: red;">-l 10</span> reviewnotes_12-0238_MS.pdf</blockquote>
После этого текст можно вставлять в веб-форму для ответа рецензентам.<br />
<br />
<br />
<br />
<br />
<b style="color: #7f6000;">Ссылка название раздела или главы в LaTeX</b><br />
Тоже часто используется, особенно если вы при правках радикально меняете структуру статьи (скажем, рецензенты вам это настоятельно советуют). Делается ссылка на название раздела с помощью пакета <a href="http://ctan.org/pkg/nameref" target="_blank">nameref</a> и который входит в пакет hyperref - он входит в стандартный набор TexLive и потому уже должен быть установлен.<br />
<table class="pkg_info"><tbody>
<tr class="oddrow"><td><br /></td><td><a href="http://tug.org/texlive/pkginstall.html"></a></td></tr>
</tbody></table>
Включаем пакет в преамбуле:<br />
<blockquote class="tr_bq">
<span style="color: #990000;">\usepackage</span>{nameref}</blockquote>
<br />
Ставим метку для раздела (section):<br />
<br />
<blockquote class="tr_bq">
<span style="color: #990000;">\section</span>{Introduction}<span style="color: #990000;">\label</span>{<span style="color: #073763;">intro</span>}</blockquote>
И ссылемся в тексте:<br />
<blockquote class="tr_bq">
See more details in the <span style="color: #990000;">\nameref</span>{<span style="color: #073763;">intro</span>} section that has number <span style="color: #990000;">\ref</span>{<span style="color: #073763;">intro</span>}.</blockquote>
Вместо этого мы при компиляции увидим:<br />
<blockquote class="tr_bq">
See more details in the Introduction section that has number 1.</blockquote>
Этот <a href="http://stackoverflow.com/questions/2613506/ref-chapter-name-in-latex" target="_blank">удобный и простой трюк подсмотрен тут</a>.<br />
<br />
<br />
<div style="color: #7f6000;">
<b>Вместо заключения</b></div>
Собственно, этот пост - небольшая зарубка на память и собрание нескольких рецептов из моего уже порядком разросшегося черновика. Полностью приведённый пример можно посмотреть <a href="http://www.code.google.com/p/exampleofarticle/source/browse/" target="_blank">на моей странице в Google Code</a>.<br />
<br />virenshttp://www.blogger.com/profile/12420257446841864325noreply@blogger.com17tag:blogger.com,1999:blog-30744165.post-8480810796481241972014-01-06T00:30:00.000+11:002014-01-06T00:30:00.676+11:00Вырываем список книг для чтения из zotero с мясом, Tcl-ем и SQlite-омВ этом посте мы продолжим беспощадную борьбу с кошмарным интерфейсом недо-системы управления библиографией под названием zotero с целью получить список книг для чтения. Даже для такой простой вещи, как получения списка книг, находящихся в базе zotero, нужно брать в руки автоген, скальпель и кувалду. Линуксоидов этим, конечно, не напугать, но маководов от экранов просьба удалиться во избежание.<br />
<br />
В этом посте мы безтрепетной рукой вырвем с мясом из зотеры список книг, засунутых туда через графический, скажем так, интерфейс. В этом нам поможет язык Tcl (Тикль), Debian и SQLite3.<br />
<br />
<a name='more'></a><br />
Нам, тем не менее, <b>НЕ ПОМОЖЕТ</b> на редкость убогая документация <a href="http://www.zotero.org/support/dev/data_model">(пародия на неё)</a>, которая в целом рекомендует нам читать исходники и <a href="http://www.zotero.org/support/dev/client_coding/direct_sqlite_database_access">проваливать к такой-то матери</a>. Поэтому мы решим проблему с помощью Tcl и Sqlite3.<br />
<br />
<h2 id="installation-of-sqlite">
Установка SQLite</h2>
В нашем Debian Linux все очень просто:<br />
<blockquote>
# apt-get install sqlite3 libsqlite3-dev libsqlite3-tcl</blockquote>
именно так, поскольку <a href="http://www.linuxquestions.org/questions/programming-9/can%27t-find-package-sqlite3-using-tcl-on-ubuntu-813157/">установка только sqlite3 недостаточна</a>. Теперь у нас есть все средства для работы с SQLite, на котором построена зотера.<br />
<br />
<h2 id="a-taste-of-sqlite">
Вкушая SQlite...</h2>
SQLite есть движок для баз данных - простой, не требующий перечитывания томика квантовой механики и использования синхрофазотрон-конструкций. Десять минут листания отличных туториалов по SQLite дадут нам всё, чтобы взять <strike>от жизни</strike> от zotero всё:<br />
<ul>
<li><a href="http://www.thegeekstuff.com/2012/09/sqlite-command-examples/">15 SQLite3 SQL Commands Explained with Examples</a></li>
<li><a href="http://sqlite.org/quickstart.html">Tcl SQLite quickstart</a></li>
<li><a href="http://zetcode.com/db/sqlite/">Excellent tutorial from zetcode</a></li>
</ul>
Сначала можно потренироваться на базе данных через консоль SQLite3, давая команды и изучая внутреннюю структуру зотеровских кишок.<br />
Подключение к базе данных <code>zotero.sqlite</code> делается командой в консоли Linux:<br />
<br />
<pre><code>starscream@dot:~/READ$ sqlite3 ZoteroLibrary/zotero.sqlite
SQLite version 3.7.3
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>
</code></pre>
<br />
По умолчанию, вывод будет сжатым и не слишком дружественным к гуманоидам:<br />
<br />
<pre><code>sqlite> select * from itemTypes;
1|note||0
2|book||2
3|bookSection|2|2
4|journalArticle||2</code></pre>
<pre><code> </code></pre>
Дабы сделать нашу жуткую, как интерфейс Гнома3, жизнь немного слаще, включим немного <a href="http://zetcode.com/db/sqlite/tool/">свистелок и мигалок</a>:<br />
<blockquote>
sqlite> .mode column</blockquote>
и<br />
<blockquote>
sqlite> .headers on</blockquote>
что повернёт SQLite к нам лицом, а к лесу - задом, и заставит печатать заголовки таблиц:<br />
<br />
<pre><code>sqlite> select * from itemTypes;
itemTypeID typeName templateItemTypeID display
---------- ---------- ------------------ ----------
1 note 0
2 book 2
3 bookSectio 2 2
4 journalArt 2
</code></pre>
<br />
и это намного понятнее.<br />
<br />
<h2 id="figuring-out-the-structure-of-zotero-sqlite-database">
Ковыряемся в реляционно-базоданных кишках zotero</h2>
Наша цель - выдрать из базы данных зотеры список всех книг, которые нам бы хотелось прочитать, в виде простого текстового списка (точнее, в виде списка Markdown, который мы потом конвертируем в латех). Можно, конечно, экспортировать всё это в BiBTeX и потом вручную выковыривать оттуда книги с помощью JabRef, но мы выбираем Путь Самурая и делаем всё скриптами. Да, это ёпенсорс, детка... <br />
<br />
<h3 id="the-general-structure-of-zotero-database">
Структура SQLite базы данных zotero </h3>
Сначала мы пробуем выяснить, что содержится в базе данных и в каком порядке. Для этого мы посмотрим на таблицы, которые есть в базе с помощью команды <code>.tables</code> которая выдаст нам всю правду:<br />
<br />
<pre><code>sqlite> .tables
annotations itemNotes
baseFieldMappings itemSeeAlso
baseFieldMappingsCombined itemTags
charsets itemTypeCreatorTypes
collectionItems itemTypeFields
collections itemTypeFieldsCombined
creatorData itemTypes
creatorTypes itemTypesCombined
creators items
customBaseFieldMappings libraries
customFields proxies
customItemTypeFields proxyHosts
customItemTypes relations
deletedItems savedSearchConditions
fieldFormats savedSearches
fields settings
fieldsCombined storageDeleteLog
fileTypeMimeTypes syncDeleteLog
fileTypes syncObjectTypes
fulltextItemWords syncedSettings
fulltextItems tags
fulltextWords transactionLog
groupItems transactionSets
groups transactions
highlights translatorCache
itemAttachments users
itemCreators version
itemData zoteroDummyTable
itemDataValues </code></pre>
<pre><code> </code> </pre>
Да, всё именно настолько плохо. Но мы не унываем и попробуем поискать что-нибудь съедобное, перебирая таблицу за таблицей. Сначала выясним код, которым обозначаются в этом селе книжки:<br />
<br />
<pre><code> sqlite> select * from itemTypes;
itemTypeID typeName templateItemTypeID display
---------- ---------- ------------------ ----------
2 book 2
15 report 1
......
</code></pre>
<br />
Так, мы ищем все элементы с itemTypeID=2. Посмотрим, есть ли в нашей базе книги - они должны быть:<br />
<br />
<pre><code>sqlite> select * from items where itemTypeID=2;
itemID itemTypeID dateAdded dateModified clientDateModified libraryID key
---------- ---------- ------------------- ------------------- ------------------- ---------- ----------
1 2 2013-09-01 02:22:15 2013-09-01 02:22:43 2013-09-01 02:22:43 G8AH8ZTS
16 2 2013-09-16 04:56:38 2013-09-16 04:56:38 2013-09-16 04:56:38 APIRGRKB
18 2 2013-09-09 01:34:38 2013-09-10 10:42:17 2013-09-10 10:42:17 SEHQJ38X
42 2 2013-09-09 08:15:52 2013-09-15 07:30:03 2013-09-15 07:30:03 ZDFQ5W25
48 2 2013-09-09 08:19:28 2013-09-15 07:32:49 2013-09-15 07:32:49 DGIPD6QJ
</code></pre>
<br />
Дизайн базы данных, конечно, феерический, но кое-что удалось выдрать: теперь у нас в руках itemID каждой книги. Неплохой старт, но нам хотелось бы заголовки книг (Titles), которые очевидно хранятся где-то ещё.<br />
<br />
Немного поматюгавшись и перебрав ещё таблиц, мы натыкаемся на:<br />
<pre><code> </code></pre>
<pre><code>sqlite> select * from fields;
fieldID fieldName fieldFormatID
---------- ---------- -------------
1 url
2 rights
3 series
......
110 title
......
</code></pre>
<br />
Ага, теперь мы ищем fieldID=110 в которых зарыты все названия (Title) книжек и статей. Чуть раньше мы нашли книжку itemID=48 и теперь для примера мы хотим выудить её название (Title) зарытое в fieldID=110. Это можно сделать вот так:<br />
<br />
<pre><code>sqlite> select * from itemData where itemID=48;
itemID fieldID valueID
---------- ---------- ----------
48 7 89
48 8 90
48 11 91
48 14 92
48 62 24
48 87 25
48 110 93
</code></pre>
<br />
Это подводит нас совсем близко к нашей цели - ещё один окоп, ещё рывок и победа так близка! Заглавия элементов (в том числе книг) хранятся в valueID, так что нам нужно смотреть в поле itemDataValues в котором всё свалено в одну большую кучу:<br />
<br />
<pre><code>sqlite> select * from itemDataValues;
valueID value
---------- -------------------------------
1 Numerical computing with Matlab
2 Atmospheric_Turbulence_SPIE.pdf
3 TR2011-056-parallelQP-onGPU.ann
4 A Parallel Quadratic Programmin
</code></pre>
<br />
Ещё немного терпения, ещё один запрос к базе данных:<br />
<br />
<pre><code>sqlite> select * from itemDataValues where valueID=93;
valueID value
---------- -------------------
93 Matrix inequalities
</code></pre>
<br />
Ага! Вот оно! Мы у цели! Можно ещё посмотреть, есть ли у книги прикреплённый нами честно купленный PDF файл:<br />
<br />
<pre><code>sqlite> select * from itemAttachments where sourceitemID=48;
itemID sourceItemID linkMode mimeType charsetID path originalPath syncState storageModTime storageHash
---------- ------------ ---------- --------------- ---------- ----------------------------------------------------- ------------ ---------- -------------- -----------
252 48 0 application/pdf storage:Zhan_X_Matrix_inequalities__Springer_2002.pdf 0
</code></pre>
<br />
Есть, и это именно та книжка, которую мы собираемся читать. Отлично, закрываем базу данных:<br />
<blockquote>
sqlite> .quit</blockquote>
и идём писать на коленке скрипт на Tcl для генерации списка книг.<br />
<br />
<h2 id="connecting-tcl-to-sqlite">
Подключаем TCL к базе данных SQLite</h2>
За что мы любим Tcl, так это за философию <b>batteries included</b> - все батарейки уже в комплекте, и ещё немного туториалов:<br />
<ul>
<li><a href="http://www.tcl.tk/community/tcl2004/Papers/D.RichardHipp/drh.html">SQLite and Tcl</a></li>
<li><a href="http://www.sqlite.org/tclsqlite.html">The Tcl interface to the SQLite library</a></li>
</ul>
дают нам всё необходимое для общения с зотеровской базой данных, от которой мы теперь уж точно возьмём всё. Команды очень просты, и к примеру вот этот код на Tcl:<br />
<pre><code>sqlite3 db1 ./testdb
db1 eval {CREATE TABLE t1(a int, b text)}
</code></pre>
создаст нам таблицу с названием t1 и двумя колонками a и b. Но нам нужно просто вытаскивать данные из таблицы, так что задача ещё проще.<br />
<h3 id="tcl-to-the-rescue">
Tcl спешит на помощь!</h3>
Немного усилий, и мы имеет следующий скрипт:<br />
<div style="background: #ffffff; border-width: .1em .1em .1em .8em; border: solid gray; overflow: auto; padding: .2em .6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #aaaaaa; font-style: italic;">#!/usr/bin/tclsh</span>
<span style="color: #aaaaaa; font-style: italic;">### This script connects to the SQLite database and extracts all the necessary data from it.</span>
<span style="color: #00aaaa;">package</span> require sqlite3
<span style="color: #aaaaaa; font-style: italic;">### First, select the type of the document to output</span>
<span style="color: #aaaaaa; font-style: italic;">### sqlite> select * from itemTypes;</span>
<span style="color: #aaaaaa; font-style: italic;"># itemTypeID typeName templateItemTypeID display</span>
<span style="color: #aaaaaa; font-style: italic;">#---------- ---------- ------------------ ----------</span>
<span style="color: #aaaaaa; font-style: italic;">#2 book 2</span>
<span style="color: #aaaaaa; font-style: italic;">#15 report 1</span>
<span style="color: #0000aa;">set</span> doc_type_select <span style="color: #009999;">2</span> <span style="color: #0000aa;">;</span><span style="color: #aaaaaa; font-style: italic;">#this is code for the zotero SQLite base</span>
<span style="color: #0000aa;">set</span> field_of_interest <span style="color: #009999;">110</span> <span style="color: #0000aa;">;</span><span style="color: #aaaaaa; font-style: italic;"># 110 is a Title of the book</span>
<span style="color: #aaaaaa; font-style: italic;">############## This is output files in LaTeX and Markdown</span>
<span style="color: #0000aa;">set</span> mdown_prefix <span style="color: #aa5500;">"- "</span>
<span style="color: #0000aa;">set</span> reading_list_filename <span style="color: #aa5500;">"./Projects/actionsProject-BooksToRead"</span>
<span style="color: #0000aa;">set</span> tex_reading_list_filename <span style="color: #aa5500;">""</span>
<span style="color: #00aaaa;">append</span> tex_reading_list_filename <span style="color: #aa0000;">$reading_list_filename</span> <span style="color: #aa5500;">".tex"</span>
<span style="color: #0000aa;">set</span> mdown_reading_list_filename <span style="color: #aa5500;">""</span>
<span style="color: #00aaaa;">append</span> mdown_reading_list_filename <span style="color: #aa0000;">$reading_list_filename</span> <span style="color: #aa5500;">"_mdown.tex"</span>
<span style="color: #0000aa;">set</span> write_fp <span style="color: #0000aa;">[</span><span style="color: #00aaaa;">open</span> <span style="color: #aa0000;">$mdown_reading_list_filename</span> w <span style="color: #0000aa;">]</span>
<span style="color: #aaaaaa; font-style: italic;">############## This is output files in LaTeX and Markdown</span>
<span style="color: #0000aa;">set</span> user_name <span style="color: #0000aa;">[</span><span style="color: #00aaaa;">lindex</span> <span style="color: #0000aa;">[</span><span style="color: #00aaaa;">split</span> <span style="color: #0000aa;">[</span><span style="color: #00aaaa;">pwd</span><span style="color: #0000aa;">]</span> <span style="color: #aa5500;">"/"</span><span style="color: #0000aa;">]</span> <span style="color: #009999;">2</span><span style="color: #0000aa;">]</span> <span style="color: #0000aa;">;</span><span style="color: #aaaaaa; font-style: italic;"># from the working directory, split the name and get only the second one.</span>
<span style="color: #aa0000;">sqlite3</span> db <span style="color: #aa5500;">"/home/$user_name/READ/ZoteroLibrary/zotero.sqlite"</span> <span style="color: #0000aa;">;</span><span style="color: #aaaaaa; font-style: italic;"># associate the SQLite database with the object __db__</span>
<span style="color: #aaaaaa; font-style: italic;">### Now find all the items of the type selected in $doc_type_select</span>
<span style="color: #aaaaaa; font-style: italic;"># sqlite> select * from items where itemTypeID=15;</span>
<span style="color: #aaaaaa; font-style: italic;">#itemID itemTypeID dateAdded dateModified clientDateModified libraryID key</span>
<span style="color: #aaaaaa; font-style: italic;">#---------- ---------- ------------------- ------------------- ------------------- ---------- ----------</span>
<span style="color: #aaaaaa; font-style: italic;">#46 15 2013-09-09 08:19:06 2013-09-15 07:33:26 2013-09-15 07:33:26 ZJ4SKMQP</span>
<span style="color: #aaaaaa; font-style: italic;">#68 15 2013-09-10 00:25:09 2013-09-10 00:26:30 2013-09-10 00:26:30 AQ2A3NWW</span>
<span style="color: #aaaaaa; font-style: italic;">#set get_itemIDs_for_the_doc_type [db eval {select * from items where itemTypeID=15} ]</span>
<span style="color: #0000aa;">set</span> cmd <span style="color: #aa5500;">"set substituteMe_SQLiteCommand {select * from items where itemTypeID=$doc_type_select}"</span> <span style="color: #0000aa;">;</span><span style="color: #aaaaaa; font-style: italic;"># here we glue the stings together to make a dynamically regenerable command</span>
<span style="color: #0000aa;">eval</span> <span style="color: #aa0000;">$cmd</span> <span style="color: #0000aa;">;</span><span style="color: #aaaaaa; font-style: italic;"># evaluating the string above as a command, and thus setting regexp</span>
<span style="color: #0000aa;">set</span> get_itemIDs_for_the_doc_type <span style="color: #0000aa;">[</span><span style="color: #aa0000;">db</span> eval <span style="color: #aa0000;">$substituteMe_SQLiteCommand</span> <span style="color: #0000aa;">]</span>
<span style="color: #0000aa;">set</span> counter <span style="color: #009999;">1</span>
<span style="color: #aaaaaa; font-style: italic;"># tmp_itemID tmp_itemTypeID tmp_dateAdded tmp_dateModified tmp_clientDateModified tmp_libraryID tmp_key</span>
<span style="color: #0000aa;">foreach</span> <span style="color: #0000aa;">{</span><span style="color: #aa0000;">tmp_itemID</span> tmp_itemTypeID tmp_dateAdded tmp_dateModified tmp_clientDateModified tmp_libraryID tmp_key<span style="color: #0000aa;">}</span> <span style="color: #aa0000;">$get_itemIDs_for_the_doc_type</span> <span style="color: #0000aa;">{</span>
<span style="color: #aaaaaa; font-style: italic;"># puts $tmp_itemID</span>
<span style="color: #0000aa;">set</span> booksarray<span style="color: #0000aa;">(</span><span style="color: #aa0000;">$counter</span><span style="color: #0000aa;">)</span> <span style="color: #aa0000;">$tmp_itemID</span>
<span style="color: #00aaaa;">incr</span> counter
<span style="color: #0000aa;">}</span>
<span style="color: #aaaaaa; font-style: italic;">############ The title is stored in the fieldID=110.</span>
<span style="color: #aaaaaa; font-style: italic;">############ Now figure out the valueID for each of the items</span>
<span style="color: #0000aa;">foreach</span> <span style="color: #0000aa;">{</span> <span style="color: #aa0000;">num</span> itemID <span style="color: #0000aa;">}</span> <span style="color: #0000aa;">[array</span> get booksarray<span style="color: #0000aa;">]</span> <span style="color: #0000aa;">{</span>
<span style="color: #0000aa;">set</span> cmd <span style="color: #aa5500;">"set substituteMe_SQLiteCommand {select * from itemData where itemID=$itemID}"</span>
<span style="color: #0000aa;">eval</span> <span style="color: #aa0000;">$cmd</span>
<span style="color: #0000aa;">set</span> get_valueIDs_for_the_doc_type <span style="color: #0000aa;">[</span><span style="color: #aa0000;">db</span> eval <span style="color: #aa0000;">$substituteMe_SQLiteCommand</span> <span style="color: #0000aa;">]</span>
<span style="color: #aaaaaa; font-style: italic;">#itemID fieldID valueID</span>
<span style="color: #aaaaaa; font-style: italic;">#---------- ---------- ----------</span>
<span style="color: #0000aa;">foreach</span> <span style="color: #0000aa;">{</span> <span style="color: #aa0000;">tmp_itemID</span> tmp_fieldID tmp_valueID <span style="color: #0000aa;">}</span> <span style="color: #aa0000;">$get_valueIDs_for_the_doc_type</span> <span style="color: #0000aa;">{</span>
<span style="color: #0000aa;">set</span> is_rightField <span style="color: #0000aa;">[</span><span style="color: #00aaaa;">string</span> compare -nocase <span style="color: #aa0000;">$tmp_fieldID</span> <span style="color: #aa0000;">$field_of_interest</span><span style="color: #0000aa;">]</span>
<span style="color: #0000aa;">if</span> <span style="color: #0000aa;">{</span> <span style="color: #aa0000;">$is_rightField</span> == <span style="color: #aa0000;">0</span> <span style="color: #0000aa;">}</span> <span style="color: #0000aa;">{</span>
<span style="color: #0000aa;">set</span> cmd <span style="color: #aa5500;">"set substituteMe_SQLiteCommand {select * from itemDataValues where valueID=$tmp_valueID}"</span>
<span style="color: #0000aa;">eval</span> <span style="color: #aa0000;">$cmd</span>
<span style="color: #0000aa;">set</span> get_Title <span style="color: #0000aa;">[</span><span style="color: #aa0000;">db</span> eval <span style="color: #aa0000;">$substituteMe_SQLiteCommand</span> <span style="color: #0000aa;">]</span>
<span style="color: #aaaaaa; font-style: italic;">####### Finally, we have the book titles!</span>
<span style="color: #0000aa;">foreach</span> <span style="color: #0000aa;">{</span> <span style="color: #aa0000;">numm</span> book_title <span style="color: #0000aa;">}</span> <span style="color: #aa0000;">$get_Title</span> <span style="color: #0000aa;">{</span>
<span style="color: #00aaaa;">regsub</span> -all <span style="color: #aa5500;">"_"</span> <span style="color: #aa0000;">$book_title</span> <span style="color: #aa5500;">" "</span> book_title
<span style="color: #00aaaa;">regsub</span> -all <span style="color: #0000aa;">{</span><span style="background-color: #ffaaaa; color: red;">\</span><span style="color: #aa0000;">x5B</span><span style="color: #0000aa;">}</span> <span style="color: #aa0000;">$book_title</span> <span style="color: #aa5500;">""</span> book_title <span style="color: #0000aa;">;</span><span style="color: #aaaaaa; font-style: italic;"># replacing underbrace and square brackets</span>
<span style="color: #00aaaa;">regsub</span> -all <span style="color: #0000aa;">{</span><span style="background-color: #ffaaaa; color: red;">\</span><span style="color: #aa0000;">x5D</span><span style="color: #0000aa;">}</span> <span style="color: #aa0000;">$book_title</span> <span style="color: #aa5500;">", "</span> book_title <span style="color: #0000aa;">;</span><span style="color: #aaaaaa; font-style: italic;"># replacing underbrace and square brackets</span>
<span style="color: #00aaaa;">puts</span> <span style="color: #aa0000;">$write_fp</span> <span style="color: #aa5500;">"$mdown_prefix $book_title"</span>
<span style="color: #0000aa;">}</span> <span style="color: #0000aa;">;</span><span style="color: #aaaaaa; font-style: italic;">####### Finally, we have the book titles!</span>
<span style="color: #0000aa;">}</span> <span style="color: #0000aa;">;</span><span style="color: #aaaaaa; font-style: italic;"># if { $is_rightField == 0 }</span>
<span style="color: #0000aa;">}</span> <span style="color: #0000aa;">;</span><span style="color: #aaaaaa; font-style: italic;"># foreach { tmp_itemID tmp_fieldID tmp_valueID } $get_valueIDs_for_the_doc_type</span>
<span style="color: #0000aa;">}</span>
<span style="color: #00aaaa;">close</span> <span style="color: #aa0000;">$write_fp</span>
<span style="color: #aa0000;">db</span> close <span style="color: #0000aa;">;</span><span style="color: #aaaaaa; font-style: italic;"># close the SQLite database</span>
<span style="color: #00aaaa;">exec</span> pandoc -f markdown -t latex <span style="color: #aa0000;">$mdown_reading_list_filename</span> -o <span style="color: #aa0000;">$tex_reading_list_filename</span>
</pre>
</div>
<br />
Тиклеристы-пуритане, конечно, могут сказать, что код мог бы быть и поизящнее, но нам ехать, а не шашечки, тем более что это вообще-то должна быть функция зотеры. Но так как зотероиды предпочитают длинные философские дебаты о том, "как правильно", и функций в зотере нифига от этого не прибавляется, мы пойдём другим путём.<br />
<br />
Немного о трюках в коде скрипта. Самый простой - сделать скрипт независимым от машины, на которой он исполняется. То есть мы берём имя пользователя скриптом и выдираем его командой <code>pwd</code> :<br />
<br />
<div style="background: #ffffff; border-width: .1em .1em .1em .8em; border: solid gray; overflow: auto; padding: .2em .6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #0000aa;">set</span> user_name <span style="color: #0000aa;">[</span><span style="color: #00aaaa;">lindex</span> <span style="color: #0000aa;">[</span><span style="color: #00aaaa;">split</span> <span style="color: #0000aa;">[</span><span style="color: #00aaaa;">pwd</span><span style="color: #0000aa;">]</span> <span style="color: #aa5500;">"/"</span><span style="color: #0000aa;">]</span> <span style="color: #009999;">2</span><span style="color: #0000aa;">]</span> <span style="color: #0000aa;">;</span><span style="color: #aaaaaa; font-style: italic;"># from the working directory, split the name and get only the second one.</span>
<span style="color: #aa0000;">sqlite3</span> db <span style="color: #aa5500;">"/home/$user_name/READ/ZoteroLibrary/zotero.sqlite"</span> <span style="color: #0000aa;">;</span><span style="color: #aaaaaa; font-style: italic;"># associate the SQLite database with the object __db__</span>
</pre>
</div>
<br />
Ещё трюк:<br />
<br />
<div style="background: #ffffff; border-width: .1em .1em .1em .8em; border: solid gray; overflow: auto; padding: .2em .6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #aaaaaa; font-style: italic;">#set get_itemIDs_for_the_doc_type [db eval {select * from items where itemTypeID=15} ]</span>
<span style="color: #0000aa;">set</span> cmd <span style="color: #aa5500;">"set substituteMe_SQLiteCommand {select * from items where itemTypeID=$doc_type_select}"</span> <span style="color: #0000aa;">;</span><span style="color: #aaaaaa; font-style: italic;"># here we glue the stings together to make a dynamically regenerable command</span>
<span style="color: #0000aa;">eval</span> <span style="color: #aa0000;">$cmd</span> <span style="color: #0000aa;">;</span><span style="color: #aaaaaa; font-style: italic;"># evaluating the string above as a command, and thus setting regexp</span>
</pre>
</div>
<br />
здесь иллюстрируются могучие способности Tcl в плане обработки строк: мы формируем команду как строку, а потом исполняем её, как команду. То есть мы подставляем <code>itemTypeID</code> динамически, и потом выполняем с помощью <code>eval</code>.<br />
<br />
Немного регекспов для удаления скобок из названий книг:<br />
<br />
<pre style="line-height: 125%; margin: 0;"><span style="color: #00aaaa;">regsub</span> -all <span style="color: #0000aa;">{</span><span style="background-color: #ffaaaa; color: red;">\</span><span style="color: #aa0000;">x5B</span><span style="color: #0000aa;">}</span> <span style="color: #aa0000;">$book_title</span> <span style="color: #aa5500;">""</span> book_title <span style="color: #0000aa;">;</span></pre>
<br />
люлистрирует возможности регекспов в Tcl по замене через ASCII-коды (ибо <span style="background-color: #ffaaaa; color: red;">\</span><span style="color: #aa0000;">x5B </span>есть символ ] ).<br />
<br />
Последний кусочек - конвертирование списка из Markdown в LaTeX:<br />
<div style="background: #ffffff; border-width: .1em .1em .1em .8em; border: solid gray; overflow: auto; padding: .2em .6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #00aaaa;">exec</span> pandoc -f markdown -t latex <span style="color: #aa0000;">$mdown_reading_list_filename</span> -o <span style="color: #aa0000;">$tex_reading_list_filename</span>
</pre>
</div>
<br />
полностью автоматизирует нашу задачу<br />
<br />
<h2 id="thats-all">
Всё.</h2>
Пост иллюстрирует убедительную и беспощадную победу Tcl над Zotero и показывает немного трюков по работе с простой базой данных SQLite. <br />
Код раскрашен с помощью <a href="http://hilite.me/">hilite.me</a>virenshttp://www.blogger.com/profile/12420257446841864325noreply@blogger.com3tag:blogger.com,1999:blog-30744165.post-80269534606461444022013-12-16T11:06:00.000+11:002013-12-21T21:28:56.051+11:00Как сделать календарь в LaTeX на год и месяц автоматически?Это краткая заметка в стиле "как отстрелить себе ногу с помощью
LaTeX". Автору этих строк потребовалось сделать себе календарик, в
котором отображались бы оповещения о событиях, и чтобы это дело
регенерировалось автоматически при смене месяца.<br />
<h2 id="">
Предисловие</h2>
Автор этих строк - человек очень ленивый, но любопытный и обожающий
ковырять свой Дебиан на предмет того, как бы сбросить побольше рутины на
компьютер. Так появилась <a href="http://mydebianblog.blogspot.com.au/2011/04/getting-things-done-linux-latex.html">LaTeX-реализация</a> организационной системы <a href="http://mydebianblog.blogspot.com.au/2011/06/gtd.html">Getting Things Done</a>, которая выполнена полностью на латехе, вместе с адресной книгой и календарём.<br />
<br />
Календарь на LaTeX реализован с помощью пакета расширений calendar [<a href="http://mirror.ctan.org/macros/latex/contrib/calendar.zip">скачать ZIP-файл</a>].
Проблема в том, что месяцы в календаре нужно обновлять самому, а вот
это как раз и забывается чаще всего. Поэтому хочется, чтобы дни, месяцы и
годы в календарике LaTeX обновлялись автомагически латехом и без
вмешательства ленивого и забывчивого автора этих строк. <br />
<blockquote>
Нужно сказать, что LaTeX является Turing complete language, то есть на нем можно писать <i>любые</i> программы. Например, можно написать
<a href="http://tug.org/TUGboat/tb11-3/tb29greene.pdf">интерпретатор Бейсика</a>, <a href="http://en.literateprograms.org/Turing_machine_simulator_%28LaTeX%29">симулятор машины Тьюринга</a>, <a href="http://www.thole.org/manfred/apfel/">Mandelbrot with LaTeX</a> и <a href="http://stackoverflow.com/questions/2968411/ive-heard-that-latex-is-turing-complete-are-there-any-programs-written-in-late">другие программы</a>. То есть <a href="http://blog.scribtex.com/latex-is-turing-complete-51805">на латехе можно писать что угодно</a>. Не всегда это просто (особенно в случае с календарём), но можно.</blockquote>
Пост поделён на две части: сначала немного о возможностях пакета
Calendar, а потом про то, как обновление названий месяцев сделать
автоматически из LaTeX.<br />
<br />
<h2 id="calendar-latex">
Возможности пакета Calendar в LaTeX</h2>
О возможностях пакета Calendar <a href="http://mydebianblog.blogspot.com/2011/04/getting-things-done-linux-latex.html">уже говорилось</a>, но тем не менее. Последнюю версию пакета расширений <b>calendar</b>, который <a href="http://mirror.ctan.org/macros/latex/contrib/calendar.zip">можно загрузить отсюда</a>. Файлы примеров этого поста доступны <a href="http://dl.dropbox.com/u/8038890/mydebianblog/example_calendar_latex.tar.gz">здесь</a>, батарейки в комплекте (пакет calendar там уже есть).<br />
<br />
После распаковки всех файлов в преамбуле документа подключаем пакеты:<br />
<blockquote>
<span style="color: grey; font-style: italic;">%%% Turning on the Monthly calendar and Event list</span><br />
<span style="color: maroon;">\usepackage</span><span style="color: black;">{monthly,evntlist,lscape} </span><span style="color: maroon;">\parindent</span><span style="color: black;">=0pt </span></blockquote>
для календаря на месяц и списка событий, и:<br />
<blockquote>
<span style="color: grey; font-style: italic;">%%% Turning on the Yearly calendar</span><br />
<span style="color: maroon;">\usepackage</span><span style="color: black;">{yearly} </span></blockquote>
для календаря на год соответсвенно.<br />
<h3 id="_1">
Создание событий для календаря</h3>
Пакет <b>calendar</b> не просто создаёт календарь, но и позволяет отображать в нём события. Все события хранятся в одном текстовом файле <span style="color: #cc33cc;">myEvents.cld</span> из которого они дёргаются календарём. Файл событий выглядит так:<br />
<blockquote>
<span style="color: #999999;">%%%%%%% My Personal Calendar</span><br />
<span style="color: #ffcc00;">range</span> <span style="color: #ff9966;">Essentials/Calendar/year2010</span> <span style="color: #999999;">%% What year do we want?</span><br />
<span style="color: #999999;">%% ONE-TIME EVENTS</span><br />
january 28 2010 {Описать GTD} [Описать GTD для блога]<br />
<span style="color: silver;">%%%%% RECURRING EVENTS</span> <br />
<span style="color: #ffcc00;">every</span> Sunday {Еженед. обзор} [Еженед. обзор]</blockquote>
Сначала указываем год в отдельном файле <span style="color: #ff9966;">Essentials/Calenda/year2010</span>.cld в котором пишем:<br />
<blockquote>
%% Span the whole year here<br />
January 1 2010 to December 31 2010 {The year 2010}</blockquote>
Повторяющиеся события будут определены только в интервале из этого
файла. <br />
<h3 id="_2">
Список событий из календаря</h3>
Часто нужно просто видеть события, приуроченные к календарным датам
(особенно если их не так много). Для этого мы пользуемся окружением <b>eventlist</b>, которое предоставляет пакет calendar. Настройки того, как выглядит список событий, хранятся в файле <b>evntlist.sty</b> который можно приукрасить разными значками и иконками.<br />
<br />
Чтобы распечатать события между нужными датами, вы просто ставите две
даты, между которыми хотите показывать события (хранятся в файле <b>events.cld</b>):<br />
<blockquote>
<span style="color: #cc0000;">\begin</span>{<span style="color: #3366ff;"><span style="color: #3333ff;">eventlist</span>}</span> {} {<span style="color: #cc33cc;">Essentials/Calendar/myEvents</span>}<br />
<span style="color: #009900;">january 24 2010 to january 30 2010</span><br />
<span style="color: #cc0000;">\end</span>{<span style="color: #3333ff;">eventlist</span>}</blockquote>
и собираете LaTeXом документ, получая список календарных событий на это время:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinrBS1saFc3sEWMcPsIUBmbmfbCHUAsWj2vfx4YVXHAZoo-YCmGcQbpR81xL5a01cekELC_5k8hFoLmE1HxRKiu27rNStNLdBjo5rvo5KwUccIzNgq7T5iNcXwKi_iJ-AD6hNc/s1600/mygtd-02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinrBS1saFc3sEWMcPsIUBmbmfbCHUAsWj2vfx4YVXHAZoo-YCmGcQbpR81xL5a01cekELC_5k8hFoLmE1HxRKiu27rNStNLdBjo5rvo5KwUccIzNgq7T5iNcXwKi_iJ-AD6hNc/s400/mygtd-02.png" width="400" /></a></div>
<br />
<br />
Иконки сделаны пакетами шрифтов <b>marvosym</b> и <b>wasysym</b>. <br />
<h3 id="_3">
Календарь на месяц с отображением событий</h3>
Пакет <b>calendar</b> может больше - можно создать календарь на месяц и показывать там события. Код такой:<br />
<blockquote>
<span style="color: #cc0000;">\begin</span>{<span style="color: #000099;">monthly</span>}<br />
{<span style="color: #ffcc00;">firstday=1</span>} <span style="color: #999999;">%% begins with Monday</span><br />
{<span style="color: #cc33cc;">Essentials/Calendar/myEvents</span>}<br />
<span style="color: #009900;">jan 2010</span><br />
<span style="color: #cc0000;">\end</span>{<span style="color: #000099;">monthly</span>}</blockquote>
Все события в календаре на указанный месяц (январь 2010 в данном случае) берутся из того же файла <b>events.cld</b>, который мы использовали для генерации списка календарных дней на неделю.<br />
Компилируем документ и вот он, календарь на месяц, обновлённый и со вставленными событиями:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh0hKXS4_GxTXlCFuLr7NNY2LFhzShxtnUZEWARrgCZDyscX6zrza5g9vo0JGPUKzzH2TjmZOvT1yeWmaPfA2Wj3M2kA7wSjuYh4GEnNGvcjwQ6nKpoOddkDjuSYtMX5RZ9Adf/s1600/mygtd-03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="245" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh0hKXS4_GxTXlCFuLr7NNY2LFhzShxtnUZEWARrgCZDyscX6zrza5g9vo0JGPUKzzH2TjmZOvT1yeWmaPfA2Wj3M2kA7wSjuYh4GEnNGvcjwQ6nKpoOddkDjuSYtMX5RZ9Adf/s400/mygtd-03.png" width="400" /></a></div>
<br />
Календарь работает с кириллицей, во всяком случае кодировка KOI8-R у него возражений не вызывает.<br />
<h3 id="_4">
Календарь на год</h3>
Места для отображения событий в календаре на год особенно не много, но возможность сгенерировать годовой календарь, не <strike>отходя от кассы</strike> выходя из латеха весьма кстати. Код для этого:<br />
<blockquote>
<span style="color: #f00000;">\begin</span><span style="color: black;">{</span><span style="color: #0000d0;">yearly</span><span style="color: black;">}</span><br />
<span style="color: black;"> {title= </span><span style="color: #f00000;">\begin</span><span style="color: black;">{</span><span style="color: #0000d0;">center</span><span style="color: black;">} </span><span style="color: maroon;">\textbf</span><span style="color: black;">{</span><span style="color: maroon;">\Large</span><span style="color: black;"> The Year 2013}</span><span style="color: #f00000;">\end</span><span style="color: black;">{</span><span style="color: #0000d0;">center</span><span style="color: black;">} </span><span style="color: maroon;">\normalsize</span><span style="color: black;">,firstday=1}</span><br />
<span style="color: black;"> {} </span><br />
<span style="color: black;">2013</span><br />
<span style="color: #f00000;">\end</span><span style="color: black;">{</span><span style="color: #0000d0;">yearly</span><span style="color: black;">}</span></blockquote>
После сборки документа годовой календарик будет выглядеть так:<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-t4S-jhkPWbY/USBWB6V-OFI/AAAAAAAADaA/NH3ZwZWSLjk/s1600/calendar_year.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="http://2.bp.blogspot.com/-t4S-jhkPWbY/USBWB6V-OFI/AAAAAAAADaA/NH3ZwZWSLjk/s640/calendar_year.png" width="409" /></a></div>
<br />
Можно посылать в печать.<br />
<h2 id="latex_1">
Вызов скриптов из LaTeX</h2>
С календарём всё сравнительно понятно, и теперь настало время его
автоматизировать: хочется, чтобы названия месяцев и дней подставлялись
автоматически. Это не такая простая задача, как может показаться. Дело в
том, что стандартные команды типа <b>\the\year</b> с пакетом calendar работать не будут, как не получится и подставлять значения из файлов через команду <b>\input</b>.<br />
<br />
Поэтому мы пойдём другим путём, как завещал нам Ильич, и напишем
скрипт на питоне, генерирующий полный текст латеховского файла с
использованием <a href="http://www.cyberciti.biz/tips/linux-unix-get-yesterdays-tomorrows-date.html">безграничных</a> возможностей команды <a href="http://mydebianblog.blogspot.com/2010/02/date-linux.html">date</a>.
Собственно, идея в том, чтобы написать простенький скрипт на Питоне и
вызывать его каждый раз латехом для обновления файлов календаря.<br />
<h3 id="_5">
Скрипт на Питоне для генерации файлов календаря</h3>
Скрипт просто склеивает строки для латеха, дёргая команду <b>date</b> и вставляя даты куда нужно. В примере ниже показана часть генерации файла календаря на месяц.<br />
<br />
Весь латеховский файл представляет собой склеенные строки в переменной <b>out</b>. Вставка символа <b>r</b> в строках <code>out +=r'\begin{landscape}'+'\n'</code> <a href="http://stackoverflow.com/questions/4202538/python-escape-special-characters">указывает Питону</a> не интерпретировать <b>\b</b> а <a href="http://stackoverflow.com/questions/3380484/using-backslash-in-python-not-to-escape">печатать как есть</a>. Вызов команды <b>date</b> делается через <code>os.popen(cmd)</code>, хотя <a href="http://www.daniweb.com/software-development/python/threads/30129/python-and-shell-scripting">теперь так уже не модно</a> (но тем не менее работает), а <a href="http://stackoverflow.com/questions/4760215/running-shell-command-from-python-and-capturing-the-output">модно</a> <a href="http://stackoverflow.com/questions/4760215/running-shell-command-from-python-and-capturing-the-output">через</a> <code>subprocess.check_output</code> (но у меня <a href="http://stackoverflow.com/questions/4760215/running-shell-command-from-python-and-capturing-the-output">так не получилось</a>).<br />
<br />
От полученной строки из команды <b>date</b> отдельно <a href="http://stackoverflow.com/questions/275018/how-can-i-remove-chomp-a-newline-in-python">откусывается символ новой строки</a> через <code>.rstrip('\n')</code> и далее сшивается с другими стоками. Результат записывается в файл <b>tmpCalendarMonth.tex</b>, который в свою очередь вставляется в ЛаТеХ через <b>\input{Calendar/tmpCalendarMonth}</b> и обрабатывается при сборке. Скрипт на питоне ниже: <br />
<div style="background: #ffffff; background: white; border-width: .1em .1em .1em .8em; border: solid gray; color: black; overflow: auto; padding: .2em .6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #aaaaaa; font-style: italic;">#! /usr/bin/python</span>
<span style="color: #0000aa;">import</span> <span style="color: #00aaaa; text-decoration: underline;">string</span>, <span style="color: #00aaaa; text-decoration: underline;">os</span>
<span style="color: #0000aa;">import</span> <span style="color: #00aaaa; text-decoration: underline;">commands</span>
kmvStartDir = <span style="color: #aa5500;">'.'</span>
kmvDestDir = kmvStartDir+<span style="color: #aa5500;">'/Calendar/'</span> <span style="color: #aaaaaa; font-style: italic;">#destination directory for graphs</span>
<span style="color: #aaaaaa; font-style: italic;">###### Getting dates and months as text using DATE command in Linux ####</span>
cmd=<span style="color: #aa5500;">'date --date="today" +%Y'</span>
stdout_handle = os.popen(cmd)
kmv_year = stdout_handle.read()
kmv_year = kmv_year.rstrip(<span style="color: #aa5500;">'\n'</span>)
stdout_handle.close()
cmd=<span style="color: #aa5500;">'date --date="today" +%B'</span>
stdout_handle = os.popen(cmd)
kmv_month = stdout_handle.read()
kmv_month = kmv_month.rstrip(<span style="color: #aa5500;">'\n'</span>)
stdout_handle.close()
cmd=<span style="color: #aa5500;">'date --date="today" +%e'</span>
stdout_handle = os.popen(cmd)
kmv_day = stdout_handle.read()
kmv_day = kmv_day.rstrip(<span style="color: #aa5500;">'\n'</span>)
stdout_handle.close()
<span style="color: #aaaaaa; font-style: italic;">####################################</span>
<span style="color: #aaaaaa; font-style: italic;">#### Month Calendar regeneration ###</span>
<span style="color: #aaaaaa; font-style: italic;">####################################</span>
kmvCalName = kmvDestDir+<span style="color: #aa5500;">'tmpCalendarMonth'</span>
out = <span style="color: #aa5500;">''</span>
out +=<span style="color: #aa5500;">r'\begin{landscape}'</span>+<span style="color: #aa5500;">'\n'</span>
out +=<span style="color: #aa5500;">r'\begin{monthly}'</span>
out +=<span style="color: #aa5500;">'\n {firstday=1} \n'</span>
out +=<span style="color: #aa5500;">'{Calendar/myEvents} \n'</span>
out +=kmv_month+<span style="color: #aa5500;">' '</span>+kmv_year+<span style="color: #aa5500;">'\n'</span>
out +=<span style="color: #aa5500;">'\end{monthly}\n'</span>
out +=<span style="color: #aa5500;">'\end{landscape}\n'</span>
<span style="color: #aaaaaa; font-style: italic;">### Output to the Calendar's file ######</span>
kmvCalName+=<span style="color: #aa5500;">'.tex'</span>
fout=<span style="color: #00aaaa;">open</span>(kmvCalName,<span style="color: #aa5500;">'w'</span>)
fout.write(out)
fout.close()
<span style="color: #aaaaaa; font-style: italic;">####################################</span>
</pre>
</div>
Скрипт <code>calendar_regenerate.py</code> и все остальные файлы можно взять <a href="http://dl.dropbox.com/u/8038890/mydebianblog/example_calendar_latex.tar.gz">отсюда</a>. Скрипт написан для того, чтобы быть максимально понятным, а не красивым или эффективным.<br />
<h3 id="latex_2">
Вызов скрипта на Питоне из LaTeX</h3>
Вызывать скрипты из латеха можно несколькими способами:<br />
<ul>
<li><a href="http://tex.stackexchange.com/a/70859">создать Makefile</a>;</li>
<li>использовать <a href="http://stackoverflow.com/questions/3252957/how-to-execute-shell-script-from-latex">возможности ввода-вывода LaTeX через \write18</a></li>
</ul>
Здесь я приведу <a href="http://stackoverflow.com/questions/3252957/how-to-execute-shell-script-from-latex">второй вариант</a>, как наиболее простой. Для этого мы помещаем питоний скрипт <code>calendar_regenerate.py</code> в тот же каталог, где лежит файл 4myGTD.tex, из которого скрипт будет вызываться. В преамбуле документа пишем:<br />
<br />
<pre><span style="color: grey; font-style: italic;">%%% Python script for calendar regeneration</span>
<span style="color: maroon;">\immediate\write</span><span style="color: black;">18{./calendar_regenerate.py}</span>
</pre>
<br />
Чтобы всё это заработало, нужно вызывать LaTeX с параметром <code>-shell-escape</code> который позволяет выполнение внешних скриптов.<br />
<h4 id="write18">
Кто такой \write18 и почему так называется?!</h4>
Команда \write это низкоуровневая инструкция TeX, которая
используется для того, чтобы производить запись в файловые "потоки". ТеХ
ссылается на каждый открытый файл не по имени, а по номеру. <a href="http://www.texdev.net/2009/10/06/what-does-write18-mean/">Поток 18 является особым</a> и зарезервирован для того, чтобы попросить операционную систему что-то выполнить - например, внешний скрипт. <br />
<blockquote>
<b>Внимание!</b> Как совершенно справедливо отмечается многими, подобный трюк в сочетании с параметром <code>–shell-escape</code>
небезопасен и представляет собой потенциальную дыру в безопасности. Так
можно написать вредоносный документ с командой типа \write18{rm -rf ~} в
Unix. По этому поводу есть статья <a href="http://cseweb.ucsd.edu/%7Ehovav/dist/texhack.pdf">(PDF)</a> об этой и других опасных командах в LaTeX.</blockquote>
Команда <b>\immediate</b> приказывает <a href="http://tex.stackexchange.com/a/70858">ЛаТеХ выполнить скрипт немедленно</a>,
не дожидаясь окончания генерации всего документа. В данном случае это
оправдано, так как мы хотим, чтобы в документ вставился уже обновлённый
календарь.<br />
<h2 id="_6">
Заключение</h2>
Заметка имеет своей целью показать возможности автоматизации в латехе
с использованием сторонних скриптов на примере автоматизированной
генерации календарей. Пакет calendar довольно навороченный, потому его
описание заняло добрую половину поста. Пример в посте доступен <a href="http://dl.dropbox.com/u/8038890/mydebianblog/example_calendar_latex.tar.gz">здесь</a>.virenshttp://www.blogger.com/profile/12420257446841864325noreply@blogger.com7tag:blogger.com,1999:blog-30744165.post-24313346798138700482013-11-18T08:02:00.000+11:002013-11-20T21:18:03.081+11:00Как объединить и разбить PDF в Linux подручными средствамиВ этой безблагодатной и беспросветной жизни, когда тебе в линукс
присылают документы в DocX и формы в последнем Adobe Acrobat, приходится
несладко. Часто заполненные с воем и рыданиями PDF-файлы приходится
склеивать или, наоборот, разрезать на несколько. К счастью,деятели опенсорса иногда отвлекаются от Wayland, Mir и прочих systemd и делают годные костыли для простых страждущих.<br />
<h2 id="pdf-pdfsam">
Объединение файлов pdf в один с помощью PDFSaM</h2>
Для тех, кто не хочет перечитывать томик квантовой физики от авторов
pdftk, есть вариант с рюшечками и бубенчиками под названием
PDF Split and Merge (pdfsam). <br />
<blockquote>
Как это всегда бывает, когда что-то кажется слишком прекрасным, чтобы
быть правдой, обязательно найдётся заподлянка. И pdfsam не исключение -
написан он на Java, а это значит кучи exceptions по поводу и без, лютые
тормоза и интерфейс из фильма ужасов. </blockquote>
<h3 id="pdfsam-linux">
Установка и использование PDFsam в Linux</h3>
Скачать самую свежую версию можно <a href="http://www.pdfsam.org/">здесь</a>. Запуск этого поделия командой <br />
<blockquote>
$ java -jar pdfsam</blockquote>
даёт что-то вроде:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYqT82UyMuryH-20U6qC04HrhZuNEvfXHJhKP302yy1ssshzem_TKFyaAJCp_GjFeqP5FefVVImVDlkyKS0Lr8JJyUA8r5aTE0Jtbt8ZJm_fcDXUWG-3a2Xri9rBQ6ypP_bBtz/s1600/pdfsam-01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="262" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYqT82UyMuryH-20U6qC04HrhZuNEvfXHJhKP302yy1ssshzem_TKFyaAJCp_GjFeqP5FefVVImVDlkyKS0Lr8JJyUA8r5aTE0Jtbt8ZJm_fcDXUWG-3a2Xri9rBQ6ypP_bBtz/s400/pdfsam-01.png" width="400" /></a></div>
<br />
Собственно, дальше всё довольно просто: pdfsam умеет объединять
(merge), разрезать (split), поворачивать (rotate) документы PDF. Кроме
того, имеет место быть режим burst, при котором из одного PDF-файла
будет сделана куча одностраничных.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEqrU3CqMdnMcXvjcg1A53gTMpSnBMbdhaYbKXvklPK8s5yVJzRTTHR-J5m-YwecC4HTaa6mWcDe8WXbV_CiJ_EfFmbbK3tQlhRH1RmdRy-NOi6KJ94hfS4njK_7fOPWp6Dya5/s1600/pdfsam-02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="245" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEqrU3CqMdnMcXvjcg1A53gTMpSnBMbdhaYbKXvklPK8s5yVJzRTTHR-J5m-YwecC4HTaa6mWcDe8WXbV_CiJ_EfFmbbK3tQlhRH1RmdRy-NOi6KJ94hfS4njK_7fOPWp6Dya5/s400/pdfsam-02.png" width="400" /></a></div>
<br />
Например, для объединения PDF-файлов в один, просто добавляем файлы в
порядке следования, выбираем новое имя файла и жмём RUN.<br />
<br />
Из преимуществ можно отметить разве что графический, скажем так,
интерфейс. Всё остальное - это типичное джава приложение: глючное,
медленное и корявое (например, при split нужно указывать номер страницы,
на единицу меньший той, с которой разрезание начнётся, и т.д.).<br />
<h3 id="pdf">
Сжатие и компрессия PDF файлов</h3>
Побочным продуктом работы pdfsam может быть раздувание PDF-файла до непричиных размеров. <a href="http://stackoverflow.com/questions/5296667/pdftk-compression-option">Этому горю можно помочь</a> с помощью утилиты <b>gs</b> вот так:<br />
<blockquote>
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf</blockquote>
Это может сжать PDF, по крайней мере в большинстве случаев.<br />
<h2 id="pdf-pdftk">
Мастерам консоли: резка и склейка PDF файлов в pdftk</h2>
PDFtk расшифровывается как pdf tool kit, и, как и подобает настоящему
набору инструментов, требует некоторого изучения. Зато работает быстро,
умеет много и клацать мышью не надо.<br />
Установка pdftk проста - он уже есть в Debian:<br />
<blockquote>
$ sudo apt-get install pdftk</blockquote>
Синтаксис pdftk можно описать примерно так:<br />
<blockquote>
pdftk исходный_файл.pdf ДЕЙСТВИЕ страницы output получаемый_файл.pdf</blockquote>
Итак, поехали....<br />
<h3 id="pdf_1">
Как разбить PDF файл на несколько</h3>
Для того, чтобы <a href="http://magic.aladdin.cs.cmu.edu/2005/07/02/splitting-and-joining-pdfs-by-pdftk/">разрезать PDF-файл на несколько</a>, нужно воспользоваться ДЕЙСТВИЕМ cat, например вот так:<br />
<blockquote>
$ pdftk document.pdf cat 140-142 output zz1.pdf</blockquote>
Эта команда выдаст файл zz1.pdf, в котором будут три страницы, а
именно 140, 141 и 142. Если же нужно разбить файл с какой-то страницы до
конца, делаем так:<br />
<blockquote>
$ pdftk foo.pdf cat 30-end output biography.pdf</blockquote>
<h3 id="pdf-pdftk_1">
Объединение нескольких файлов PDF в один с помощью PDFtk</h3>
Та же самая команда cat может склеивать PDF-файлы в один:<br />
<blockquote>
$ pdftk zz* cat output Issue26.pdf</blockquote>
служит для объединения всех файлов, содержащих zz в имени, в один Issue26.pdf<br />
Если файлы называются по-разному, <a href="http://superuser.com/questions/366490/how-to-merge-multiple-pdf-files-onto-one-page-with-pdftk">можно использовать следующую</a> команду для объединения файлов в один:<br />
<blockquote>
$ pdftk 1.pdf 2.pdf ... cat output merged.pdf</blockquote>
будет объединён в один файл merged.pdf.<br />
<h3 id="pdf-">
Изменение полей PDF-документа</h3>
Речь идёт о полях в PDF файле вроде автора, заголовка или времени создания:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbpThsMlNg9jmD7nBh5IUW7SZNafUAqSMfFg2h5vjSBj54Q0-Q9oswUkuaQd9_AVUNJg5UdiVN2a3pn-FqaLL3BN__EbJY3EFs4h-z3aEp4Po4oAZTSoqDGRw0-k4jNQbt28Dh/s1600/pdf_properties.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="152" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbpThsMlNg9jmD7nBh5IUW7SZNafUAqSMfFg2h5vjSBj54Q0-Q9oswUkuaQd9_AVUNJg5UdiVN2a3pn-FqaLL3BN__EbJY3EFs4h-z3aEp4Po4oAZTSoqDGRw0-k4jNQbt28Dh/s400/pdf_properties.png" width="400" /></a></div>
<br />
Не раз и не два товарищи, работающие с документами повышенной
важности, оставляли в этих полях значения, подставленные услужливым MS
Word - и имели на этом немало проблем. Это можно поправить с помощью
pdftk <a href="http://www.onurguzel.com/changing-pdf-metadata-under-linux/">сравнительно</a> <a href="http://jkwiens.com/2010/01/04/changing-pdf-metadata-on-ubuntu/">легко</a>.<br />
Сначала достаём исходные данные (metadata):<br />
<blockquote>
pdftk book.pdf dump_data output report.txt</blockquote>
В этом файле мы увидим нечто вроде:<br />
<blockquote>
InfoKey: Title<br />
InfoValue: Coders At Work<br />
InfoKey: Author<br />
InfoValue: Peter Seivel<br />
InfoKey: Subject<br />
InfoValue: Programming</blockquote>
Эти значения можно отредактировать в полученном текстовом файле (report.txt в этом примере) и загрузить обратно:<br />
<blockquote>
pdftk book.pdf update_info report.txt output bookcopy.pdf</blockquote>
У pdf-документов могут быть <a href="http://etutorials.org/Linux+systems/pdf+hacks/Chapter+5.+Manipulating+PDF+Files/Hack+64+Get+and+Set+PDF+Metadata/">и другие поля</a>, которые тоже можно поправить при желании.<br />
<br />
<h3 id="">
И это ещё не всё!</h3>
Возможности pdftk <a href="http://www.maketecheasier.com/combine-multiple-pdf-files-with-pdftk/2010/02/22">весьма велики</a>, и желающие могут припасть к официальной документации.<br />
<br />
<br />
<h2 id="pdf-latex-pdfpage">
Склейка страниц PDF файла в буклет с помощью LaTeX pdfpage</h2>
Отличная иллюстрация мощи пакета <a href="http://ctan.org/pkg/pdfpages">pdfpages</a> была найдена на <a href="http://tex.stackexchange.com/questions/26628/printing-a6-on-a4-paper">tex.stackexchange.com</a>.
Идея сводится к тому, что сначала мы создаём исходный документ, а потом
ещё один, в который вставляются PDF-страницы в нужном порядке. <br />
<br />
Например, у нас есть документ под формат А6, созданный в ЛаТеХе (назовём его mya6doc.pdf:<br />
<br />
<pre><code>\documentclass{book}
\usepackage[english]{babel}%
\usepackage[a6paper]{geometry}% http://ctan.org/pkg/geometry
\usepackage{lipsum}% http://ctan.org/pkg/lipsum
\begin{document}
\chapter{First chapter} \lipsum[1-10]
\chapter{Second chapter} \lipsum[11-20]
\chapter{Third chapter} \lipsum[21-30]
\chapter{Final chapter} \lipsum[31-40]
\end{document}
</code></pre>
<br />
Теперь создаём ещё один документ (назовём его mya4doc):<br />
<br />
<pre><code>\documentclass{article}
\usepackage[english]{babel}%
\usepackage[a4paper]{geometry}% http://ctan.org/pkg/geometry
\usepackage{pdfpages}% http://ctan.org/pkg/pdfpages
\begin{document}
\includepdf[pages=-,nup=2x2,frame,noautoscale]{mya6doc}%
\end{document}
</code></pre>
<br />
Скомпилировать его нужно с помощью pdflatex. Это позволит получить все страницы (<code>pages=-</code>) в <i>2x2</i> страницы на одной (<code>nup=2x2</code>) с прорисованной границей вокруг каждой страницы (<code>frame</code>). <br />
<br />
Это означает, что pdfpages воспринимает вставляемые страницы как
изображения, так что можно дополнительно задать поля для обрезки:<br />
<br />
<pre><code>\includepdf[pages=1,landscape,clip,trim=1cm 2cm 3cm 4cm,frame,noautoscale,fitpaper=false]{AllTheMyGTDinOneScheme}
</code></pre>
<br />
то есть страница будет обрезана на 1, 2, 3, 4 сантиметра слева, снизу, справа и сверху. Опция clip=true обрежет страницу.<br />
<h2 id="pdf-gs">
Путь джедая: склеивание PDF документов с помощью gs</h2>
Как многие джедаи уже в курсе, gs это GhostScript, свободный как
Столлман интерпретатор postscript и, соответственно, PDF. Командой gs
можно не только орехи колоть, но и <a href="http://www.linux.com/news/software/applications/8229-putting-together-pdf-files">соединять документы</a>. Соединять документы с помощью Ghostscript можно вот так:<br />
<blockquote>
$ gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=finished.pdf file1.pdf file2.pdf</blockquote>
Теперь что это всё значит:<br />
<br />
<pre><code>-dBATCH -- после окончания пакетной обработки, GS прекращает работу (без этой опции он будет продолжать имитировать бурную деятельность)
-dNOPAUSE -- обрабатывать каждую страницу без пауз между ними
-q -- тихий режим, без выдачи сообщений
-sDEVICE=pdfwrite -- использовать встроенный обработчик PDF
-sOutputFile=finished.pdf -- записать выхлоп в файл finished.pdf</code></pre>
<pre><code> </code></pre>
Преимущество такого джедайства в том, что Ghostscript входит во все
дистрибутивы Linux и часто уже установлен в системе. И не нужно тащить
килотонны джавы.<br />
<br />
<h3 id="eps-pdf">
Сохранение размеров EPS файлов при конвертировании в PDF</h3>
Не совсем в тему, но тем не менее про PDF. Дело в том, что при конвертировании файлов EPS в PDF разными поделками вроде ps2pdf <a href="http://www.linux.com/learn/tutorials/442405-creating-pdf-files-with-ps2pdf">вы получаете PDF в виде пустой страницы A4 с картинкой EPS где-то в углу</a>. То есть поделка ps2pdf просто игнорирует выставленный BoundingBox при использовании по умолчанию:<br />
<pre><code> </code></pre>
<pre><code>$ ps2pdf letterhead.eps
</code></pre>
<blockquote style="color: #666666;">
<span style="font-size: x-small;">Я не буду говорить о вменяемости авторов ps2pdf, но всякий
разработчик с IQ выше комнатной температуры должен понимать, что
подобные WTF-моменты в пользовательском опыте в конечном итоге приводят к
тому, год линупсов на десктопе уезжает в голубую даль. И это происходит
именно из-за таких вот казусов, коих в ёпенсорце год от года становится
только больше из-за набегающих леннартов поттерингов и прочих ковбоев,
склонных к тяжёлому велосипедостроению там, где этого абсолютно не
требуется.</span></blockquote>
Так как ps2pdf принимает те же аргументы, что и Ghostscript, имеющий
900 газиллионов опций, среди которых должна быть возможность сохранять
BoundingBox. И таки да, чудо случилось:<br />
<br />
<pre><code>$ ps2pdf -dEPSCrop letterhead.eps
</code></pre>
<br />
который даёт тот самый PDF, который от него, собственно, и ждёшь.<br />
<h2 id="_1">
Заключение</h2>
Перечисленные возможности - не предел мечтаний, и всегда можно найти
свежесобранный опенсорцовый велосипед со спойлером, антикрыльями и
колёсами в форме листа Мёбиуса. Обнаружившим нечто интересное в деле
работы с PDF документами просьба не стесняться в комментариях.virenshttp://www.blogger.com/profile/12420257446841864325noreply@blogger.com16tag:blogger.com,1999:blog-30744165.post-64745432882368902832013-10-28T10:00:00.000+11:002013-11-15T11:56:26.886+11:00Как экстрагировать подсвеченный (highlight) текст из PDF файлов в Linux: Zotero и ZotFileКогда читаешь текст статей и книг в PDF-файлах, есть желание подсветить (highlight) интересные участки и вернуться к ним ещё разок - прямо как на бумаге. Более того, хочется текст из этих самых подсвеченных участков выдрать из PDF и экспортировать куда-нибудь ещё. И желательно это сделать в Linux и без необходимости загружать виртуальную машину с десктопным софтом для Windows. Казалось бы, в опенсорце так любят изобетать велосипеды, и должен же какой-нибудь велосипедостроитель до этого дотумкать.<br />
<br />
И таки нашёлся один герой, который это сделал! Но, как и полагается в опенсорце, для этого нужно установить другую софтину, взять автоген, бензопилу и начать процедуру ректального удаления гланд. Чем автор сейчас и займётся. Леденящие душу подробности, кишки, море крови и вагон изуродованных трупов прилагаются к посту ниже.<br />
<br />
<a name='more'></a><h2 id="zotero-zotfile-extracted-highlights-from-pdf">
Работа с PDF-файлами в человеческом декстопе</h2>
На всякий случай для тех, кто ест суп отвёрткой: люди читают PDF-файлы в Android и Windows и делают в них пометки\аннотации. <a href="http://eric-blue.com/2010/12/17/learning-faster-automatically-extract-highlighted-text-from-pdf-documents/">Это удобно</a> и помогает быстро набросать выжимку из читаемого.<br />
<br />
Любителей линукса ждёт жестокое разочарование: никаких <i>вменяемых</i> средств для пометок в PDF и уж тем более выдирания текста оттуда в Linux <b>нетЪ</b>. Да, в 2013 году мы имеем только xournal, который может тупо рисовать поверх текста, и <a href="http://okular.kde.org/faq.php#HowcanIannotateadocumentandsendittoafriendcollegueetc">Okular</a>, который <a href="http://okular.kde.org/faq.php#addedannotationsinpdf">не умеет сохранять выделения</a> и аннотации внутри PDF-файла.<br />
<br />
Даже в Андроиде софта для работы с PDF больше: тот же ezPDF отлично справляется с аннотациями и выделениями (можно настраивать даже цвет и прозрачность). Вот так:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-VgSAtYwctqM/UjrnMj7e8LI/AAAAAAAAD0M/8bBcWdw125k/s1600/2013-09-19+21.53.07.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"></a><a href="http://4.bp.blogspot.com/-hbelNqHliz8/UjrnMWwLJWI/AAAAAAAAD0I/Dur2GrmOKUg/s1600/2013-09-19+21.53.18.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="320" src="http://4.bp.blogspot.com/-hbelNqHliz8/UjrnMWwLJWI/AAAAAAAAD0I/Dur2GrmOKUg/s320/2013-09-19+21.53.18.png" width="180" /></a><img border="0" height="320" src="http://1.bp.blogspot.com/-VgSAtYwctqM/UjrnMj7e8LI/AAAAAAAAD0M/8bBcWdw125k/s320/2013-09-19+21.53.07.png" width="180" /></div>
<br />
Для Windows есть <i><a href="http://www.tracker-software.com/product/pdf-xchange-viewer">PDFXchange-viewer</a></i> который отлично работает в WINE (и <a href="http://download.cnet.com/PDF-XChange-Viewer/3000-10743_4-10598377.html">бесплатен для загрузки!</a>). В работе он ещё проще ezPDF, так как имеет специальный инструмент для подсвечивания, чтобы не пришлось подтверждать каждый раз:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-CLPQeUIpYoA/UjroZuGLlLI/AAAAAAAAD0Y/NKZqyr4aVJE/s1600/epensorce_PDFEXchange_highlight.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="250" src="http://4.bp.blogspot.com/-CLPQeUIpYoA/UjroZuGLlLI/AAAAAAAAD0Y/NKZqyr4aVJE/s400/epensorce_PDFEXchange_highlight.jpg" width="400" /></a></div>
<br />
Как мы с неудовольствием наблюдаем, что в Windows и Android таких программ - завались, в то время как разработнички
ёпенсорца заняты куда более важными вещами вроде systemd, Mir и
Wayland. Но мы не об этом - обещанные кишки и море крови впереди.<br />
<br />
<h2 id="zotero-zotfile-extracted-highlights-from-pdf">
Zotero + ZotFile = экстрагируем выделенный текст (Highlights) из PDF в Linux без наркоза!</h2>
Есть такой сорт программ, которые пытаются управлять коллекциями материалов для чтения. Одна из таких попыток называется Zotero и представляет собой урезанный Firefox (оно называется Standalone, то бишь отдельностоячая версия) или плагин к Firefox.<br />
<br />
Так вот, сам по себе интерфейс Zotero ужасен настолько, насколько может быть убог интерфейс, созданный опенсорцными деятелями. Но у зотеры есть один волшебный плагин, который называется ZotFile - и вот он-то умеет вытаскивать подсвеченные куски текста из PDF-файлов.<br />
<br />
Казалось бы, что ж автор-то злопыхает? Вот оно, решение-то. Ан нет: чтобы получить искомое, придётся взять автоген и безнозпилу.<br />
<br />
<h3 id="installing-zotero">
Установка сопутствующих инструментов: zotero</h3>
По <a href="http://www.zotero.org/download/">этой ссылке</a> можно скачать либо Firefox extension либо зотеру Standalone в виде отдельного приложения. После установки zotero нам потребуется плагин ZotFile, который позволяет получить искомую возможность экспорта выделений из PDF-файлов. <br />
<h3 id="installing-zotfile">
Установка ZotFile</h3>
Идём на <a href="http://www.columbia.edu/%7Ejpl2136/zotfile.html">ZotFile official website</a> или <a href="https://addons.mozilla.org/en-us/firefox/addon/zotfile/">mozilla page</a> и скачиваем расширение ZotFile. Далее в zotero идём в меню Tools -> Addons и устанавливаем ZotFile:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-LkgVhsiyRtc/UjrbE3sCRdI/AAAAAAAADzI/CEEqfBCJALo/s1600/zoteroAddons.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="210" src="http://4.bp.blogspot.com/-LkgVhsiyRtc/UjrbE3sCRdI/AAAAAAAADzI/CEEqfBCJALo/s400/zoteroAddons.png" width="400" /></a></div>
<br />
Всё, теперь начинается битва с зотерой - добавление PDF-файлов и работа с ними.<br />
<br />
Да, массовый импорт PDF-файлов из меню Import невозможен и сочтён разработчиками zotero <a href="https://forums.zotero.org/discussion/15859/">ненужной и мало полезной функцией</a>. Если вы подумали, что импортировать файлы можно через File -> Import... то вас ждёт сюрприз: так сделать не получится. <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-8QTa29rC9F4/UjrbCplQTEI/AAAAAAAADyw/dxmZL3GyoHI/s1600/import_PDFs_zotero.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="282" src="http://2.bp.blogspot.com/-8QTa29rC9F4/UjrbCplQTEI/AAAAAAAADyw/dxmZL3GyoHI/s400/import_PDFs_zotero.png" width="400" /></a></div>
<br />
Оказывается, что для добавления PDF-файлов пользователь должен на
зелёный ПЛЮС "New Item" -> "Story copy of file" и, зажав шифт <strike>и подпрыгивая на левой ноге,</strike> выделить несолько файлов PDF сразу. <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-XyTPJpECZhY/UjrbDDaTl9I/AAAAAAAADy4/U9_O1BGcpMM/s1600/import_PDFs_zotero2.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="221" src="http://1.bp.blogspot.com/-XyTPJpECZhY/UjrbDDaTl9I/AAAAAAAADy4/U9_O1BGcpMM/s400/import_PDFs_zotero2.png" width="400" /></a></div>
<br />
Эти файлы будут сохранены в виде приложения (attachments) в каталогах <code>./Library/storage</code> с затейливыми подкаталогами. Но так как мы не собираемся использовать эту поделку ни для чего серьёзного, это нам не важно.<br />
<blockquote class="tr_bq">
<span style="color: #cccccc; font-size: x-small;">Я уже хочу попросить местного Санта Клауса подарить мне вертолёт с миниганом для полётов над местами скопления девелоперсов зотеры. К ним я хочу прилететь даже больше, чем к поттерингу и девелоперсам Гнома3: в отличие от зотерщиков, эти отморозки ничего толкового не делают. Зотрещики же откровенно издеваются над пользователями, городя наименее вменяемые интерфейсы для в целом годной и хорошей программы.</span></blockquote>
<br />
<h3 id="send-the-reading-materials-from-zotero-to-gtd">
Посылаем чтиво из Zotero</h3>
Для того, чтобы послать PDF файлы на планшет \ таблетку \ директорию для чтения (это может быть каталог Dropbox, который синхронизируется с декстопом и планештом), выбираем файлы, зажав Shift, кликаем правой кнопкой мыши по ним и выбираем "Manage Attachments" <code>-></code> "Send to Subfolder on Tablet". Это функция ZotFile - зотера из коробки этого не умеет.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-ddHnKRTB86U/UjrbFrZNupI/AAAAAAAADzo/eEUvh-JdDp0/s1600/zotero_send_to_tablet.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="193" src="http://3.bp.blogspot.com/-ddHnKRTB86U/UjrbFrZNupI/AAAAAAAADzo/eEUvh-JdDp0/s400/zotero_send_to_tablet.png" width="400" /></a></div>
<br />
Расположение каталога можно настроить в опциях ZotFile. Для этого идём в "Tools" <code>-></code> Add-ons <code>-></code> ZotFile <code>-></code> "Tablet Settings" и меняем по вкусу. <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-xLEg7oqDAwM/UjrbF2x54HI/AAAAAAAADzk/xQVGyHYn2tk/s1600/zotero_send_to_tablet_Config.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="173" src="http://4.bp.blogspot.com/-xLEg7oqDAwM/UjrbF2x54HI/AAAAAAAADzk/xQVGyHYn2tk/s400/zotero_send_to_tablet_Config.png" width="400" /></a></div>
<br />
<br />
<h2 id="read-and-make-highlights-in-pdfs">
Читаем и делаем пометки (highlights) в PDF</h2>
Так как на линуксовом "десктопе" ничего удобоваримого нет, идём на поклон к проприетарщине:<br />
<ul>
<li>
<b>Tablet</b>. Здесь есть много программ, способных делать нормальные пометки и аннотации, например ezPDF. Загружаем файлы через AirDroid или синхронизацией через Dropbox и наслаждаемся.<br />
</li>
<li>
<b>Desktop</b>. Здесь есть альтернатива в виде PDFXchange из-под Wine. Работает отлично и позволяет сохранять пометки внутри файлов.<br />
</li>
</ul>
Начитавшись разумного, доброго и светлого, тягаем помеченные файлы обратно. В зотере есть специальный каталог под названием
<b>Tablet Files</b>. Там хранятся записи о том, какие файлы посланы на планшет \ каталог для чтения. Идём в <b>Tablet Files</b>, выбираем файлы, кликаем правой кнопкой мыши и выбираем "Get from Tablet".<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-bzYB7aMma90/Ujrb-bXZpoI/AAAAAAAADz8/uxNpxi5n68A/s1600/retrieve_PDF_fromtablet-03.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="250" src="http://4.bp.blogspot.com/-bzYB7aMma90/Ujrb-bXZpoI/AAAAAAAADz8/uxNpxi5n68A/s400/retrieve_PDF_fromtablet-03.png" width="400" /></a></div>
<br />
<br />
<br />
<h3 id="highlights-extraction-using-zotfile">
Выдираем подсвеченный текст из PDF используя ZotFile</h3>
Выделяем прочитанный PDFник с подсвеченным текстом, жмём правую кнопку мыши и выбираем
<b>Manage Attachments</b> <code>-></code> <b>Extract Highlights</b>. И вот они, наши бесценные пометки, в красиво оформленном виде - ZotFile вставит даже номер страницы, откуда пометки взяты.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-wKyP_K_vttk/UjrbD456REI/AAAAAAAADzM/g_LSC0kuLDQ/s1600/highlights_from_pdf.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="241" src="http://4.bp.blogspot.com/-wKyP_K_vttk/UjrbD456REI/AAAAAAAADzM/g_LSC0kuLDQ/s400/highlights_from_pdf.png" width="400" /></a></div>
<br />
Пометки выдираются без проблем как в случае использования ezPDF, так и PDFExchange. Всё, пометки можно скопировать как в виде простого текста, так и в HTML:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-4UZT1kw4dZ8/Ujuqu8KpBFI/AAAAAAAAD0o/vQzHO-OqSYE/s1600/highlights_from_pdf_01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="178" src="http://2.bp.blogspot.com/-4UZT1kw4dZ8/Ujuqu8KpBFI/AAAAAAAAD0o/vQzHO-OqSYE/s400/highlights_from_pdf_01.png" width="400" /></a></div>
<br />
У ZotFile есть много скрытых параметров (<a href="http://www.columbia.edu/%7Ejpl2136/zotfile.html#hidden">hidden options</a>)
и ручек, за которые можно подёргать для более тонкой настройки. Как и в Firefox, это делается через 'about:config' или, в случае с Zotero Standalone, в меню 'Actions -> Preferences -> Advanced -> Open about:config'.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-DFgcBcHDfmY/Ujuvv4PO4hI/AAAAAAAAD04/YPQzF2Fo6PY/s1600/highlights_from_pdf_02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="143" src="http://2.bp.blogspot.com/-DFgcBcHDfmY/Ujuvv4PO4hI/AAAAAAAAD04/YPQzF2Fo6PY/s400/highlights_from_pdf_02.png" width="400" /></a></div>
<br />
<br />
Здесь мы видим обычное конфигурационное месиво от Мозиллы. Ищем строки вида 'extensions.zotfile' для скрытых опций zotfile. На примере выше я убрал кавычки для цитат, извлечённых из highlights в PDF изменив .pdfExtraction.ClosingQuotation. Теперь текст выделений не содержит кавычек.<br />
<h4>
<b><br /></b></h4>
<h4>
<b>Итоги забега: zotero - квадратно-колёсный велокактус</b></h4>
zotero, как система управления коллекцией статей и книг в PDF, хуже,
чем просто бесполезна: она отнимает больше времени на борьбу с
идиотизмом разработчиков, чем экономит. Примеры шедевральных решений:<br />
<ul>
<li>нельзя импортировать кучу PDF-файлов со структурой в виде каталогов и подкаталогов.</li>
<li>импорт вообще сделан через задницу: несколько PDF файлов можно
экспортировать только если они лежат в одном каталоге. О том, насколько
это медленно, я просто не говорю.</li>
<li>нельзя экспортировать отсортированную библиотеку из зотеры 1:1
дублируя коллекции в виде каталогов (но можно выпендриться, экспортируя
через ZotFile).</li>
<li>статьи и книги внутри зотеры нельзя перемещать, но можно
копировать+удалять. Это может привести к плачевным последствиям: могут
появиться дубликаты там, где их никогда не было.</li>
<li>система объединения дубликатов невменяема: не пользуйтесь ей <b>НИКОГДА</b>! При объединении элементов с вложениями PDF оно сваливает все PDF в одну кучу. Зачем тогда вообще эта функция?!</li>
<li>нет возможности получить список файлов в коллекции - только внешими
скриптами через прямые запросы в базу SQLite (юзер-френдли, да).</li>
<li>экспорт в BiBTeX <a href="https://forums.zotero.org/discussion/28663/bibtex-export-in-zotero-40-please-help/">ущербен</a> на всю голову: генерация cite keys сделана полными идиотами - оно генерирует ключи в виде @BOOK{<i>clif</i>????,
title = {Clif Flynt Tcl Tk Second Edition A Developers}. Но они работают над этим.<br />
</li>
</ul>
И это только наиболее критичные проблемы. Медленную работу,
ущербный ненастраиваемый интрефейс, малое количество опций - это мелочи.<br />
<br />
<br />
<h3>
<b>Вебдвальноль спешит на помощь: </b>SumNotes<br />
</h3>
Замечательный, простой и работящий вебсервис <a href="http://www.sumnotes.net/">http://www.sumnotes.net</a> позволяет даром извлекать выделенные слова и аннотации из PDF-файлов. Просто загружаем наш PDF файл:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-TVzTCZZH-Wc/UmzjgtEH6yI/AAAAAAAAD5I/HwIltcmCp-A/s1600/SumNotes_03.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="303" src="http://1.bp.blogspot.com/-TVzTCZZH-Wc/UmzjgtEH6yI/AAAAAAAAD5I/HwIltcmCp-A/s400/SumNotes_03.jpg" width="400" /></a></div>
<br />
который может быть до 300 Мб, и через некоторое время получаем наши бесценные выделенные фразы:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-l7ycmoOCnoY/Umzjg1x77AI/AAAAAAAAD5M/iSUBTYR_9p0/s1600/SumNotes_01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="226" src="http://2.bp.blogspot.com/-l7ycmoOCnoY/Umzjg1x77AI/AAAAAAAAD5M/iSUBTYR_9p0/s400/SumNotes_01.jpg" width="400" /></a></div>
<br />
которые можно сохранить в формате TXT или DOC, и просто скопировать в буфер обмена:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-xuNfFKYao0U/UmzKxafkW1I/AAAAAAAAD4o/p8UK3GpV7jQ/s1600/SumNotes_02.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="238" src="http://4.bp.blogspot.com/-xuNfFKYao0U/UmzKxafkW1I/AAAAAAAAD4o/p8UK3GpV7jQ/s400/SumNotes_02.jpg" width="400" /></a></div>
<br />
Одно но: не вставляет номер страницы, на которой это выделение было сделано. Но тем не менее с задачей справляется на отлично.<br />
<br />
<br />
<h2 id="conclusion">
Заключение</h2>
Из плюсов у zotero есть только ZotFile: это единственная причина, по которой зотеру вообще можно терпеть в этом мире - возможность получения выделенного текста из PDF файлов. И этот небольшой плагин ZotFile - всё, что в линуксах способно вынимать текст из PDF Highlights на линуксовом десктопе, год которого, конечно же, обязательно и непременно наступит.<br />
<br />
<h4>
Альтернативы и аналоги: </h4>
<ul>
<li>Стоит так же пристально посмотреть на вебдванольный сервис <a href="http://www.sumnotes.net/">http://www.sumnotes.net</a> который прост, вебдванолен и не страдает детскими опенсорцными болезнями.</li>
<li><a href="http://www.docear.org/">http://www.docear.org/</a> - и швец, и жнец, и на дуге игрец: и майндмаппинг, и организация данных, и выдирание пометок из документов. Недостаток: оно на Java. </li>
<li><a href="http://www.sciplore.org/software/sciplore_mindmapping/">http://www.sciplore.org/software/sciplore_mindmapping/</a> - тоже на джаве (что огорчает скоростью), но умеет вытаскивать закладки и пометки из PDF, плюс майндмаппинг.</li>
<li><a href="http://www.mendeley.com/">Mendeley</a> - аналог Zotero, поддерживает вытаскивание highlights и notes, экспортирует аннотированные pdf, но не умеет экспортировать отсортированные документы с сохранением структуры. </li>
<li><a href="http://calibre-ebook.com/">Calibre</a> с плагином <a href="http://www.mobileread.com/forums/showthread.php?p=2413824">Annotations</a> - экстрагирует пометки из PDF с отправкой на почту.</li>
</ul>
В общем, не зотерой единой... virenshttp://www.blogger.com/profile/12420257446841864325noreply@blogger.com30tag:blogger.com,1999:blog-30744165.post-41340355511611862242013-10-14T00:30:00.001+11:002013-10-20T09:14:44.017+11:00Репозиторий deb-пакетов своими руками: сборка пакетов в Debian из исходников и бинарников на скорую рукуЧасто бывает нужно по-быстрому собрать deb-пакет в Debian, особенно когда уже имеется бинарный файл. Так как мы не слакварщики и не хотим засорять систему make & make install, мы пойдём другим путём и сделаем собственный пакет. А чтобы они не валялись по всему диску, закатаем наши пакеты в собственный же репозиторий.<br />
<br />
<h2 id="">
Распаковка существующих пакетов</h2>
Сначала посмотрим, <a href="http://www.g-loaded.eu/2008/01/28/how-to-extract-rpm-or-deb-packages/">что внутри пакета deb или rpm</a>. <br />
<h3 id="deb-">
Распаковка deb-пакета</h3>
Распаковать пакет Debian нужно в два этапа - сначала извлекаем из него файлы, а потом добираемся до собственно бинарников. Вскрываем пакетик:<br />
<blockquote>
# ar vx mypackage.deb</blockquote>
Файл пакета <b>mypackage.deb</b> содержит три вложенных файла:<br />
<ul>
<li>debian-binary - это текстовый файл, который содержит информацию о версии пакета (например: 2.0)</li>
<li>control.tar.gz - этот архив содержит всю мета-информацию: имя и версию пакета, зависимости и прочее.</li>
<li>data.tar.gz - собственно, бинарники программы, необходимые для работы. Именно эти файлы будут разархивированы в каталог /usr для дальнейшего использования.</li>
</ul>
Теперь, если нам охота поживиться бинарниками пакета (содержимое data.tar.gz), даём команду:<br />
<blockquote>
$ tar -xzvf data.tar.gz</blockquote>
В текущем каталоге появится ./usr <i>текущего каталога</i>. Желанный бинарник лежит в ./usr/bin подкаталоге.<br />
<br />
Если же вам нужно просто извлечь файлы из пакета, можно всё сделать одной командой<br />
<blockquote>
$ ar p mypackage.deb data.tar.gz | tar zx</blockquote>
это распакует пакет deb в текущий каталог. Другой вариант - использовать dpkg-deb в виде:<br />
<blockquote class="tr_bq">
$ dpkg-deb -x что.deb куда/</blockquote>
<br />
<br />
<h3 id="rpm-">
Распаковка rpm-пакета</h3>
На всякий случай о том, как распаковать пакеты <strike>вероятного противника</strike> RPM-based систем. Для этого нам потребуются программы <b>rpm2cpio</b> и <b>cpio</b>. Распаковка содержимого RPM пакета делается в один шаг:<br />
<blockquote>
$ rpm2cpio mypackage.rpm | cpio -vid</blockquote>
Если же нужно просмотреть содержимое пакета, не распаковывая его, даём команду: <br />
<blockquote>
$ rpm2cpio mypackage.rpm | cpio -vt</blockquote>
Для того, чтобы (попытаться) конвертировать RPM-пакет в Debian, можно воспользоваться командой:<br />
<blockquote>
# alien mypack.i386.rpm</blockquote>
Надо сказать, что пакеты RPM и DEB сильно отличаются друг и друга, и такое простое конвертирование не всегда проходит.<br />
<br />
<h2 id="deb-_1">
Deb-пакет из бинарного файла</h2>
Теперь, когда мы знаем, что ничего волшебного внутри deb-пакетов нет, можно попробовать сварганить свой собственный дебиановский пакетик.<br />
<blockquote class="tr_bq">
Часто хочется сделать побыстрее, чтоб "завелось и поехало" - и вместо пакетов пользователи устанавливают программы в виде ./configure, make & make install (вместо make install можно использовать checkinstall). <a href="http://mydebianblog.blogspot.com/2011/07/linux.html">Как уже говорилось не раз</a>, не стоит поддаваться искушению и ставить программы в Linux в обход менеджера пакетов - пакетный менеджер ничего о них знать не будет, и при обновлении системы вы рискуете получить больше проблем на свою голову, чем представляете.</blockquote>
Иногда бывает так, что исходников к пакету нет - скажем, поступила к нам проприетарщина, а упаковать её в пакет хочется. Или мы наваяли скрипт, и хочется, чтобы он был на многих машинах. Нет проблем: завернём это в deb-пакет и скормим apt-у.<br />
Для этого нам понадобится утилита <br />
<blockquote>
# apt-get install dpkg-dev </blockquote>
Подопытным кроликом будет служить бинарный файл системы контроля версий fossil, <a href="http://mydebianblog.blogspot.com.au/2012/07/fossil.html">о котором уже говорилось ранее</a>. <br />
Идея в том, чтобы в локальном каталоге (назовём его ~./tempprog) отдублировать структуру каталогов для программы так, как она лежала бы в системе в установленном виде. Большинство бинарников находится в системном каталоге /usr/bin, поэтому создаём такую же структуру в локальном:<br />
<blockquote>
$ mkdir -p ./tempprog/usr/bin/</blockquote>
Так мы создадим все подкаталоги за один проход. Зайдём внутрь:<br />
<blockquote>
$ cd tempprog/</blockquote>
и увидим созданные подкаталоги:<br />
<blockquote>
$ tree </blockquote>
Вот они:<br />
<br />
<pre>.
└── usr
└── bin
2 directories, 0 files
</pre>
<br />
Отлично, теперь в локальном каталоге ./tempprog создаём подкаталог ./DEBIAN:<br />
<blockquote>
$ mkdir ./DEBIAN </blockquote>
<br />
Внутри подкаталога ./DEBIAN создаём текстовый файл <b>control</b> с таким содержимым:<br />
<pre>Package: имя-пакета
Version: версия пакета, скажем 1.0 или 2.7.9.
Architecture: архитектура(i386, amd64, all...)
Maintainer: сопровождающий_пакета
Installed-Size: размер программы в килобайтах
Depends: зависимости (пакет (>= версия))
Recommends: рекомендации (пакет (>= версия))
Suggests: предложения (пакет)
Section: секция (multimedia, games, system, или другое)
Priority: приоритет (optional)
Homepage: http://www.домашняя_страница
Description: описание программы
</pre>
<br />
Таким образом, в нашем локальном каталоге ./tempprog будет лежать вот что:<br />
<br />
<pre>.
├── DEBIAN
│.. └── control
└── usr
└── bin
└── fossil
3 directories, 2 files</pre>
<br />
Теперь из каталога ./tempprog даём команду на сборку этого простенького пакета:<br />
<blockquote>
$ dpkg-deb -b ./ ./ </blockquote>
В результате появится пакет (в нашем примере с fossil) вида:<br />
<blockquote>
fossil_1.21_i386.deb</blockquote>
который можно сразу же установить в систему:<br />
<br />
<pre>$ sudo dpkg -i fossil_1.21_i386.deb
[sudo] password for starscream:
Selecting previously deselected package fossil.
(Reading database ... 247627 files and directories currently installed.)
Unpacking fossil (from fossil_1.21_i386.deb) ...
Setting up fossil (1.21) ...
</pre>
<br />
И всё, наступает счастье.<br />
<br />
<blockquote>
Небольшое примечание: если кто хочет установить программу в директорию <br />
/opt/ нужно сделать следующее:<br />
<br />
- В локальном каталоге ./tempprog создаём каталог /opt/ и размещаем там<br />
программу так, как она и будет установлена в /opt<br />
- Там же, в ./tempprog создаём подкаталоги /tempprog/usr/bin/<br />
в котором размещаем небольшой скрипт, например zotero<br />
- В нём пишем:<br />
<br />
<pre>#! /bin/sh
PATH=$PATH:/opt/zotero/
/opt/zotero/zotero
</pre>
<br />
Это говорит системе, что теперь можно запускать файлы и из /opt/zotero</blockquote>
<br />
<br />
<h2 id="deb-_2">
Deb-пакет из исходников на скорую руку</h2>
Здесь приводится простой вариант упаковки исходников, если все зависимости уже на месте и нам ничего не нужно делать. В общем случае это не так, и сборка пакетов с прописыванием зависимостей представляет собой довольно нетривиальный процесс.<br />
<br />
Если нам повезло и все зависимости уже в системе, можно скомпилировать исходные тексты программы и <b>по-быстрому</b> завернуть всё в пакет Debian.<br />
<br />
Для этого скачанные исходные тексты программы (для примера foobar версии 1.2.3) распаковываем в каталог foobar-1.2.3, и от рута даём команду:<br />
<blockquote>
# dh_make --createorig</blockquote>
Далее пишем<br />
<blockquote>
# debuild</blockquote>
Опять, если нам повезло, всё должно собраться без вопросов. Полученный пакет устанавливаем<br />
<blockquote>
# dpkg -i foobar_1.2.3-1_i386.deb</blockquote>
Охочим до тонкостей дебиановской кулинарии и прочим правильно писающим мальчикам <a href="http://debian-handbook.info/get/now/">просьба пройти сюда</a> и насладиться The Debian Administrator's Handbook. Эта <strike>Книга о вкусной и здоровой пище</strike> довольно занудная, водянистая и словоохотливая книжеца от двух дебианщиков расскажет вам о Debian Policy, как всё делать ортодоксально и, когда авторы вспоминают, что не мемуары пишут, про то, <b>что же таки собственно делать</b>.<br />
<br />
<h2 id="debian">
Создание собственного локального репозитория Debian своими руками</h2>
Когда количество собственноручно собранных пакетов перевалит за десяток, захочется удобства и комфорта установки софта. К счастью, создание собственного локального репозитория - дело сравнительно простое.<br />
<br />
Создаём каталог, в котором будут лежать все собранные непосильным трудом пакеты - пусть это будет ~/zips/virensdebianrepositor в который копируем deb-пакеты.<br />
<br />
Для создания репозитория нам понадобится dpkg-scanpackages который является (во всяком случае на момент написания поста) частью пакета dpkg-dev, <a href="http://lists.debian.org/debian-hppa/2005/11/msg00010.html">как это неожиданно выяснилось</a>.<br />
<br />
Создаём список пакетов:<br />
<blockquote>
$ dpkg-scanpackages . /dev/null | gzip -9c > ./Packages.gz</blockquote>
Может быть, нам будет выведено сообщение типа:<br />
<br />
<pre>dpkg-scanpackages: warning: Packages in archive but missing from override file:
dpkg-scanpackages: warning: fossil linux-headers-3.8.0-avl9-pae linux-image-3.8.0-avl9-pae pdfsam sublimetext virtualbox-4.2 xserver-xorg-input-wacom zotero
dpkg-scanpackages: info: Wrote 8 entries to output Packages file.
</pre>
<br />
Теперь в нашем репозитории 8 пакетов. Отлично, добавляем наш репозиторий в файл:<br />
<blockquote>
# vim /etc/apt/sources.list</blockquote>
строчкой типа:<br />
<br />
<pre>deb file:///home/имя_пользователя/zips/virensdebianrepository ./
</pre>
<br />
Теперь нужно обновить список пакетов, чтобы они стали доступны для установки:<br />
<blockquote>
# apt-get update </blockquote>
Всё, теперь можно установить, к примеру, свежесобранный текстовый редактор <a href="http://www.sublimetext.com/2">Sublime Text 2</a> (отличная инструкция <a href="http://community.linuxmint.com/tutorial/view/907">там</a>) как всегда: Теперь, для того, чтобы установить SublimeText достаточно сделать:<br />
<br />
<blockquote>
# apt-get install sublimetext</blockquote>
<br />
<pre>Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
sublimetext
0 upgraded, 1 newly installed, 0 to remove and 245 not upgraded.
Need to get 0 B/11.4 MB of archives.
After this operation, 17.4 MB of additional disk space will be used.
WARNING: The following packages cannot be authenticated!
sublimetext
Install these packages without verification [y/N]? Y
Selecting previously deselected package sublimetext.
(Reading database ... 247813 files and directories currently installed.)
Unpacking sublimetext (from ..././sublimetext_2.0.2_i386.deb) ...
Setting up sublimetext (2.0.2) ...
</pre>
Всё, пакет будет распакован и установлен, а то, что он из местного репозитория, видно вот тут: (from ..././sublimetext_2.0.2_i386.deb)<br />
<br />
<h2 id="_1">
Заключение</h2>
Описанные в этом посте рецепты - блюда на скорую руку, а не фуагра с трюфелями. Для больших репозиториев или сложных пакетов придётся-таки ознакомиться с <a href="http://www.debian.org/doc/manuals/maint-guide/build.en.html">документацией</a> и <a href="https://wiki.debian.org/HowToPackageForDebian">руководствами</a>. Ещё можно воспользоваться программой <a href="http://aptoncd.sourceforge.net/doc-manual.html">APTonCD</a>, которая умеет не только создавать репозитории, но и записывать их на CD/DVD диски.virenshttp://www.blogger.com/profile/12420257446841864325noreply@blogger.com17tag:blogger.com,1999:blog-30744165.post-24732853489558464662013-09-23T16:55:00.000+10:002013-09-23T16:55:00.213+10:00Исчезновение старых картинок в Google Blogger, или Что бывает, когда всё бездумно затаскивается в Google Plus<div class="separator" style="clear: both; text-align: left;">
</div>
Небольшой краткий пост - мало ли кому пригодится - с описанием технической проблемы Google Blogger, которой почему-то нигде нет. Затрагивает пользователей, которые не хотят заводить себе аккаунт Google+, но имеют старые блоги на Blogger.<br />
<br />
<br />
<a name='more'></a><br />
<h2 id="google-blogger-geocities-20">
Исчезновение старых картинок на Google Blogger</h2>
Если кто заметил исчезновение изображений из старых постов, например <a href="http://mydebianblog.blogspot.com.au/2008/01/canon-40d.html">в этом</a>, не думайте, что автор решил выкосить старые посты.<br />
<br />
У многих людей (включая автора) начали пропадать изображения в блогах на Blogger. Это есть <a href="http://googlesystem.blogspot.com.au/2013/03/picasa-web-albums-redirects-to-google.html">результат затаскивания гуглом всех и вся в этот проклятый Google+</a>.
Дело в том, что они начали менять права доступа изображений: хотя
изображения в постах исчезли, они на самом деле никуда (скорее всего) не
делись, а просто к ним нет доступа.<br />
<br />
Это особенно касается старых постов, которым более 3-4 лет. Часто
картинок просто не видно - отрисовывается пустая строка. Иногда вместо
изображения видно <a href="http://blogging.nitecruzr.net/2012/02/diagnostic-improvements-with-photos.html">"кирпич" - это значит, что нет доступа</a>. Эта гуглопслюсовская чума постигла кучу <a href="http://productforums.google.com/forum/#%21topic/blogger/35Udh-KL19Y">народа.</a><br />
<br />
<h3 id="1-google-picasa-blogger">
Проблема 1: в Google Picasa картинка есть, но в Blogger её не видно</h3>
Здесь проблема в том, что Blogger не имеет доступа к картинкам в
Picasa, даже если выставлены права "Limited, anyone with link". Раньше
всё отлично работало, но сейчас перестало: для того, чтобы Blogger
увидел изображения, нужно выставить права на альбом "Public on the web".
Так удалось вернуть часть картинок в посты, где они и продолжают быть
видимы.<br />
<br />
<h3 id="2-c-blogspot-google-picasa-blogger">
Проблема 2: старые картинки c blogspot завернули на Google+, но в Picasa их нет и Blogger их не видит</h3>
Это куда серьёзнее: нет никакой возможности с ними работать, потому
как они хостятся на старых серверах вида bp2.blogspot.com - они не были
загружены в Picasa.<br />
<br />
Опять, раньше всё отлично работало, но недавно кому-то <strike>завезли новой угарной травы</strike> пришла в голову отличная идея завернуть все картинки со старого блоггера на Google+, <b>даже если у вас G+ аккаунта нет</b>. То есть управление правами на картинки теперь можно делать из Google+, но у меня его нет (И МНЕ ЭТО НЕ НУЖНО!).<br />
<br />
<a href="http://mydebianblog.blogspot.com.au/2008/01/canon-40d.html">Пример поста с отвалившимися изображениями</a>. Вместо картинок видно вот что:<br />
<img alt="" height="268" src="https://dl.dropboxusercontent.com/u/8038890/mydebianblog/images/mydebianblog_lost_old_pictures_01.jpg" width="400" /><br />
Изображения со старого Blogger никуда не пропали: если зайти в пост,
найти ссылку на картинку и вставить её напрямую в адресную строку - она
отлично видна. В адресной строке справа favicon показывает мерзкий G+.
То есть оно типа перенаправлено:<br />
<img alt="" height="268" src="https://dl.dropboxusercontent.com/u/8038890/mydebianblog/images/mydebianblog_lost_old_pictures_02.jpg" width="400" /><br />
Та же самая проблема в Google Blogger Editor: этих картинок не видно:<br />
<img alt="" height="268" src="https://dl.dropboxusercontent.com/u/8038890/mydebianblog/images/mydebianblog_lost_old_pictures_03.jpg" width="400" /><br />
<br />
но если вставить в адресную строку - картинки есть. Это затрагивает
только изображения в старых постах, 2007-2009 годов. Остальные
изображения (пока) на месте. <br />
<br />
От броузера не зависит (Opera/Firefox/Chrome).<br />
<br />
<br />
<h3 id="">
Вести с полей</h3>
Хорошие новости: похоже, гугловцы в курсе происходящего факапа и пытаются это разрулить: некоторые посты, <a href="http://mydebianblog.blogspot.com.au/2007/02/blog-post_12.html">например этот</a>, <strike>получили свои картинки назад</strike> <strike>отвалились снова</strike> картинки появились опять. Большинство старых постов (до 2010 года) всё ещё с отвалившимися картинками.<br />
<br />
Небольшое <a href="http://productforums.google.com/forum/#%21category-topic/blogger/something-is-broken/54L0DPIP7Us">расследование </a>показало, что:<br />
<br />
<blockquote class="tr_bq">
It's only a small group of user experiencing this issue, and it's not
country related. There are users in the Netherlands which can see the
(missing) images on my weblog just fine.<br />
<div>
But there has to be something in common on users experiencing this issue, they can cofirm the issue on other blogs as well.</div>
</blockquote>
Выдаваемая ошибка в браузере выглядит так:<br />
<br />
<blockquote class="tr_bq">
This web page has a redirect loop<br />
The web page at <a href="http://4.bp.blogspot.com/_hM8AMxgJLzw/R4Wphi7GNoI/AAAAAAAAAZE/N6sMMNur3jU/s320/img7.png" target="_blank">http://4.bp.blogspot.com/_<wbr></wbr>hM8AMxgJLzw/R4Wphi7GNoI/<wbr></wbr>AAAAAAAAAZE/N6sMMNur3jU/s320/<wbr></wbr>img7.png</a>
has resulted in too many redirects. Clearing your cookies for this site
or allowing third-party cookies may fix the problem. If not, it is
possibly a server configuration issue and not a problem with your
computer.<br />
Error 310 (net::ERR_TOO_MANY_REDIRECTS): There were too many redirects.</blockquote>
<br />
Другая хорошая новость в том, что это скорее всего проблема прав
доступа, а не физического уничтожения картинок: если ввести в адресную
строку броузера адрес картинки - она будет отображена. Но ни в Blogger
Editor, ни в собственно посте изображения не видно. Хотя оно физически
никуда не делось.<br />
<br />
Пост на <a href="http://productforums.google.com/forum/#%21category-topic/blogger/something-is-broken/54L0DPIP7Us">googleforums</a> - отписываться можно и там. Участники обсуждения обещали написать в Спортлото довести это дело до инженеров Google - и видимо это сделали, потому как пока (22 Сентября) картинки к старым постам снова с нами.virenshttp://www.blogger.com/profile/12420257446841864325noreply@blogger.com16tag:blogger.com,1999:blog-30744165.post-63857825227408600982013-09-16T11:54:00.000+10:002013-09-16T11:54:00.965+10:00Как втиснусть много данных в график gnuplotСобственно, этот пост есть коллекция трюков, которая набралась в процессе подготовки двух последних конференций. Проблема в том, что нужно вместить много данных в небольшой график, и делается это порой весьма нетривиальным образом. Как известно, с помощью gnuplot можно сделать всё, что угодно, но мало кто знает как именно. Демонстрация чёрной магии в стиле Gnuplot с полным разоблачением ниже.<br />
<br />
<a name='more'></a><br />
В инженерии мало наснимать кучу данных или наделать симуляций - важно все эти данные наглядно и красиво представить. Так и самому проще анализировать полученные результаты, и проще убеждать других в их, результатах, полезности. И потом, красиво построенный информативный график смотрится намного лучше (и куда компактнее) унылой таблицы с вереницей цифр.<br />
<br />
Следующая по сложности задача - запихнуть побольше данных в график, так как статья не резиновая и часто имеет жёсткие ограничения по объёму. Вот тут-то и начинается чёрная магия.<br />
<br />
<br />
<br />
<div style="color: #783f04;">
<span style="font-size: large;"><b>Использование обеих вертикальных осей, но с разными подписями</b></span></div>
В переводе это значит, что мы будем строить два массива данных на одном графике, но подписи на оси Y с двух сторон будут разные. Вот как это выглядит:<br />
<span id="goog_1448971514"></span><span id="goog_1448971515"></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-buN4vrwNH1w/T-q1Fant6FI/AAAAAAAACh8/TI_l4gX8sl4/s1600/gnuplot-blackmagick-03.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="282" src="http://4.bp.blogspot.com/-buN4vrwNH1w/T-q1Fant6FI/AAAAAAAACh8/TI_l4gX8sl4/s400/gnuplot-blackmagick-03.jpg" width="400" /></a></div>
<br />
Если читатель внимательно присмотрится к вертикальным осям слева и справа, то увидит, что эти оси означают <i>разные</i>, хотя и взаимосвязанные, данные. Смысл в том, что два набора данных влияют друг на друга, и в тексте статьи это довольно подробно излагается со ссылками в тексте на график, подсвеченные тем же цветом, что и данные на графике. <span style="color: #bf9000;">Так</span> <span style="color: lime;">что</span> <span style="color: #cc0000;">автор</span> <span style="color: #cccccc;">зло</span><span style="color: #3d85c6;">употребляет</span> <span style="color: #cc0000;">ц</span><span style="color: #38761d;">в</span><span style="color: #f1c232;">е</span><span style="color: #0b5394;">т</span><span style="color: #741b47;">о</span><span style="color: magenta;">в</span><span style="color: cyan;">о</span><span style="color: #351c75;">й</span> <span style="color: #6aa84f;">раскраской</span> не <span style="color: #c27ba0;">только</span> в <span style="color: #bf9000;">блоге</span>, <span style="color: #cc0000;">но</span> и в <span style="color: #6fa8dc;">консервативных</span> <span style="color: lime;">научных</span> <span style="color: purple;">журналах</span> - не в ущерб содержанию, по возможности.<br />
<br />
Теперь серьёзно - вот код для графика: <br />
<br />
<div style="background: #ffffff; background: white; border-width: .1em .1em .1em .8em; border: solid gray; color: black; overflow: auto; padding: .2em .6em; width: auto;">
<table><tbody>
<tr><td><pre style="line-height: 125%; margin: 0;">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24</pre>
</td><td><pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">#! /usr/bin/gnuplot -persist</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">terminal</span> postscript <span style="background-color: #fff0f0; color: #dd2200;">"NimbusSanL-Regu"</span> eps color enhanced fontfile <span style="background-color: #fff0f0; color: #dd2200;">"/usr/share/texmf-texlive/fonts/type1/urw/helvetic/uhvr8a.pfb"</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">output</span> <span style="background-color: #fff0f0; color: #dd2200;">"./plots/threshold_sparsity.ps"</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">key</span> bottom right
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">xtics</span> <span style="color: #0000dd; font-weight: bold;">10</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">mxtics</span> <span style="color: #0000dd; font-weight: bold;">10</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">ytics</span> <span style="color: #0000dd; font-weight: bold;">10</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">mytics</span> <span style="color: #0000dd; font-weight: bold;">10</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">yrange</span> [<span style="color: #0000dd; font-weight: bold;">60</span>:<span style="color: #0000dd; font-weight: bold;">100</span>]
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">y2range</span> [<span style="color: #0000dd; font-weight: bold;">60</span>:<span style="color: #0000dd; font-weight: bold;">100</span>]
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">xrange</span> [<span style="color: #0000dd; font-weight: bold;">10</span>**<span style="color: #0000dd; font-weight: bold;">-5</span>:<span style="color: #0000dd; font-weight: bold;">1</span>]
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">style</span> line <span style="color: #0000dd; font-weight: bold;">1</span> lt <span style="color: #0000dd; font-weight: bold;">1</span> pt <span style="color: #0000dd; font-weight: bold;">6</span> ps <span style="color: #0000dd; font-weight: bold;">1.2</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">style</span> line <span style="color: #0000dd; font-weight: bold;">2</span> lt <span style="color: #0000dd; font-weight: bold;">1</span> pt <span style="color: #0000dd; font-weight: bold;">9</span> ps <span style="color: #0000dd; font-weight: bold;">1.4</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">logscale</span> x
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">format</span> x <span style="background-color: #fff0f0; color: #dd2200;">"10^{%L}"</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">grid</span> xtics ytics mxtics
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">y2tics</span> <span style="color: #0000dd; font-weight: bold;">5</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">xlabel</span> <span style="background-color: #fff0f0; color: #dd2200;">"Threshold value for the matrix"</span> font <span style="background-color: #fff0f0; color: #dd2200;">"NimbusSanL-Regu,18"</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">ylabel</span> <span style="background-color: #fff0f0; color: #dd2200;">"Matrix sparsity, \% percentage"</span> font <span style="background-color: #fff0f0; color: #dd2200;">"NimbusSanL-Regu,18"</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">y2label</span> <span style="background-color: #fff0f0; color: #dd2200;">"Output disturbance attenuation, \% percentage"</span> font <span style="background-color: #fff0f0; color: #dd2200;">"NimbusSanL-Regu,18"</span>
<span style="color: #008800; font-weight: bold;">plot</span> <span style="background-color: #fff0f0; color: #dd2200;">".data"</span> <span style="color: #003388;">using</span> <span style="color: #0000dd; font-weight: bold;">6</span>:<span style="color: #0000dd; font-weight: bold;">8</span> <span style="color: #003388;">title</span> <span style="background-color: #fff0f0; color: #dd2200;">"Percentage of sparsity of the Hessian matrix"</span> <span style="color: #003388;">with</span> points linestyle <span style="color: #0000dd; font-weight: bold;">1</span> lc rgb <span style="background-color: #fff0f0; color: #dd2200;">"blue"</span> <span style="color: #003388;">axis</span> x1y1 ,</pre>
<pre style="line-height: 125%; margin: 0pt;"> <span style="background-color: #fff0f0; color: #dd2200;">".data"</span> <span style="color: #003388;">using</span> <span style="color: #0000dd; font-weight: bold;">6</span>:((<span style="color: #0000dd; font-weight: bold;">1</span>- <span style="background-color: #e3d2d2; color: #a61717;">$</span><span style="color: #0000dd; font-weight: bold;">4</span>/<span style="background-color: #e3d2d2; color: #a61717;">$</span><span style="color: #0000dd; font-weight: bold;">2</span>)*<span style="color: #0000dd; font-weight: bold;">100</span>) <span style="color: #003388;">title</span> <span style="background-color: #fff0f0; color: #dd2200;">"Output disturbance attenuation performance, \% of rejection"</span> <span style="color: #003388;">with</span> points linestyle <span style="color: #0000dd; font-weight: bold;">2</span> lc rgb <span style="background-color: #fff0f0; color: #dd2200;">"dark-red"</span> <span style="color: #003388;">axis</span> x1y2
</pre>
</td></tr>
</tbody></table>
</div>
<br />
Ключевые для понимания строки:<br />
<table><tbody>
<tr><td><blockquote class="tr_bq">
<pre style="line-height: 125%; margin: 0pt;"> <span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">y2range</span> [<span style="color: #0000dd; font-weight: bold;">60</span>:<span style="color: #0000dd; font-weight: bold;">100</span>]
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">y2tics</span> <span style="color: #0000dd; font-weight: bold;">5</span> </pre>
<pre style="line-height: 125%; margin: 0pt;"> <span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">y2label</span> <span style="background-color: #fff0f0; color: #dd2200;">"Output disturbance attenuation, \% percentage"</span> font <span style="background-color: #fff0f0; color: #dd2200;">"NimbusSanL-Regu,18"</span> </pre>
</blockquote>
</td></tr>
</tbody></table>
Здесь используется довольно редкий финт: изменение поведения <i>второй вертикальной</i> оси <span style="color: #003388;">y2range</span> в гнуплоте. Да-да, она не просто так отсвечивает в графике и её тоже можно использовать. В данном случае мы явно указываем диапазон значений для второй оси <span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">y2range</span> [<span style="color: #0000dd; font-weight: bold;">60</span>:<span style="color: #0000dd; font-weight: bold;">100</span>] проставляем на ней другие засечки с помощью <span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">y2tics</span> <span style="color: #0000dd; font-weight: bold;">5</span> <br />
и далее присваиваем оси другую (независимую) подпись <span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">y2label</span><br />
<br />
Обратите внимание на параметры команды на строчках 23-24: мы строим два ряда данных и указываем, какие оси использовать. Сначала это <span style="color: #003388;">axis</span> x1y1 а потом <span style="color: #003388;">axis</span> x1y2 для того, чтобы два массива данных строились относительно двух разных осей.<br />
<br />
<br />
<div style="color: #783f04;">
<span style="font-size: large;"><b>Три графика один под другим</b></span></div>
Чтобы показать один и тот же сигнал, обработанный двумя разными фильтрами, полезно разместить три графика на одном, график под графиком:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-ZwJJkJp7Viw/T-prJSHMXKI/AAAAAAAAChY/IORXK-4kkrg/s1600/gnuplot-blackmagick-01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="278" src="http://2.bp.blogspot.com/-ZwJJkJp7Viw/T-prJSHMXKI/AAAAAAAAChY/IORXK-4kkrg/s400/gnuplot-blackmagick-01.jpg" width="400" /></a></div>
<br />
<br />
В строительстве подобных графиков нам поможет инструкция <span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">multiplot</span><br />
в gnuplot. Вот как выглядит код для этого графика:<br />
<br />
<div style="background: #ffffff; background: white; border-width: .1em .1em .1em .8em; border: solid gray; color: black; overflow: auto; padding: .2em .6em; width: auto;">
<table><tbody>
<tr><td><pre style="line-height: 125%; margin: 0;">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55</pre>
</td><td><pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">#! /usr/bin/gnuplot -persist</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">terminal</span> postscript <span style="background-color: #fff0f0; color: #dd2200;">"NimbusSanL-Regu"</span> eps color enhanced fontfile <span style="background-color: #fff0f0; color: #dd2200;">"/usr/share/texmf-texlive/fonts/type1/urw/helvetic/uhvr8a.pfb"</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">output</span> <span style="background-color: #fff0f0; color: #dd2200;">"./plots/plotOutputDisturbancePlant.ps"</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">lmargin</span> <span style="color: #0000dd; font-weight: bold;">10</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">rmargin</span> <span style="color: #0000dd; font-weight: bold;">2</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">grid</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">bmargin</span> <span style="color: #0000dd; font-weight: bold;">4</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">style</span> line <span style="color: #0000dd; font-weight: bold;">1</span> lt <span style="color: #0000dd; font-weight: bold;">1</span> pt <span style="color: #0000dd; font-weight: bold;">5</span> ps <span style="color: #0000dd; font-weight: bold;">0.3</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">style</span> line <span style="color: #0000dd; font-weight: bold;">2</span> lt <span style="color: #0000dd; font-weight: bold;">2</span> pt <span style="color: #0000dd; font-weight: bold;">7</span> ps <span style="color: #0000dd; font-weight: bold;">0.5</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">style</span> line <span style="color: #0000dd; font-weight: bold;">3</span> lt <span style="color: #0000dd; font-weight: bold;">3</span> pt <span style="color: #0000dd; font-weight: bold;">9</span> ps <span style="color: #0000dd; font-weight: bold;">0.3</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">style</span> line <span style="color: #0000dd; font-weight: bold;">4</span> lt <span style="color: #0000dd; font-weight: bold;">4</span> pt <span style="color: #0000dd; font-weight: bold;">11</span> ps <span style="color: #0000dd; font-weight: bold;">0.3</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">style</span> line <span style="color: #0000dd; font-weight: bold;">5</span> lt <span style="color: #0000dd; font-weight: bold;">5</span> pt <span style="color: #0000dd; font-weight: bold;">13</span> ps <span style="color: #0000dd; font-weight: bold;">0.3</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">xrange</span> [<span style="color: #0000dd; font-weight: bold;">300</span>:<span style="color: #0000dd; font-weight: bold;">600</span>]
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">multiplot</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="background-color: #e3d2d2; color: #a61717;">no</span><span style="color: #003388;">key</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">size</span> <span style="color: #0000dd; font-weight: bold;">1</span>,<span style="color: #0000dd; font-weight: bold;">0.35</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">xlabel</span> <span style="background-color: #fff0f0; color: #dd2200;">"Sampling instant"</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">ylabel</span> <span style="background-color: #fff0f0; color: #dd2200;">"Control input"</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">origin</span> <span style="color: #0000dd; font-weight: bold;">0.0</span>,<span style="color: #0000dd; font-weight: bold;">0.0</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">bmargin</span> <span style="color: #0000dd; font-weight: bold;">3</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">tmargin</span> <span style="color: #0000dd; font-weight: bold;">0</span>
<span style="color: #008800; font-weight: bold;">plot</span> <span style="background-color: #fff0f0; color: #dd2200;">"./data.data"</span> <span style="color: #003388;">index</span> <span style="color: #0000dd; font-weight: bold;">23</span> <span style="color: #003388;">using</span> <span style="color: #0000dd; font-weight: bold;">3</span> <span style="color: #003388;">title</span> <span style="background-color: #fff0f0; color: #dd2200;">" "</span> <span style="color: #003388;">with</span> linespoints linestyle <span style="color: #0000dd; font-weight: bold;">1</span> lc rgb <span style="background-color: #fff0f0; color: #dd2200;">"red"</span>,
<span style="background-color: #e3d2d2; color: #a61717;">"./data.data"</span> <span style="background-color: #e3d2d2; color: #a61717;">ind</span><span style="color: #008800; font-weight: bold;">ex</span> <span style="background-color: #e3d2d2; color: #a61717;">22</span> <span style="background-color: #e3d2d2; color: #a61717;">using</span> <span style="background-color: #e3d2d2; color: #a61717;">3</span> <span style="background-color: #e3d2d2; color: #a61717;">title</span> <span style="background-color: #e3d2d2; color: #a61717;">"</span> <span style="background-color: #e3d2d2; color: #a61717;">"</span> <span style="background-color: #e3d2d2; color: #a61717;">with</span> <span style="background-color: #e3d2d2; color: #a61717;">linespoints</span> <span style="background-color: #e3d2d2; color: #a61717;">linestyle</span> <span style="background-color: #e3d2d2; color: #a61717;">2</span> <span style="background-color: #e3d2d2; color: #a61717;">lc</span> <span style="background-color: #e3d2d2; color: #a61717;">rgb</span> <span style="background-color: #e3d2d2; color: #a61717;">"dark-red",</span>
<span style="background-color: #e3d2d2; color: #a61717;">"./data.data"</span> <span style="background-color: #e3d2d2; color: #a61717;">ind</span><span style="color: #008800; font-weight: bold;">ex</span> <span style="background-color: #e3d2d2; color: #a61717;">18</span> <span style="background-color: #e3d2d2; color: #a61717;">using</span> <span style="background-color: #e3d2d2; color: #a61717;">3</span> <span style="background-color: #e3d2d2; color: #a61717;">title</span> <span style="background-color: #e3d2d2; color: #a61717;">"</span> <span style="background-color: #e3d2d2; color: #a61717;">"</span> <span style="background-color: #e3d2d2; color: #a61717;">with</span> <span style="background-color: #e3d2d2; color: #a61717;">linespoints</span> <span style="background-color: #e3d2d2; color: #a61717;">linestyle</span> <span style="background-color: #e3d2d2; color: #a61717;">3</span> <span style="background-color: #e3d2d2; color: #a61717;">lc</span> <span style="background-color: #e3d2d2; color: #a61717;">rgb</span> <span style="background-color: #e3d2d2; color: #a61717;">"dark-green",</span>
<span style="background-color: #e3d2d2; color: #a61717;">"./data.data"</span> <span style="background-color: #e3d2d2; color: #a61717;">ind</span><span style="color: #008800; font-weight: bold;">ex</span> <span style="background-color: #e3d2d2; color: #a61717;">14</span> <span style="background-color: #e3d2d2; color: #a61717;">using</span> <span style="background-color: #e3d2d2; color: #a61717;">3</span> <span style="background-color: #e3d2d2; color: #a61717;">title</span> <span style="background-color: #e3d2d2; color: #a61717;">"</span> <span style="background-color: #e3d2d2; color: #a61717;">"</span> <span style="background-color: #e3d2d2; color: #a61717;">with</span> <span style="background-color: #e3d2d2; color: #a61717;">linespoints</span> <span style="background-color: #e3d2d2; color: #a61717;">linestyle</span> <span style="background-color: #e3d2d2; color: #a61717;">4</span> <span style="background-color: #e3d2d2; color: #a61717;">lc</span> <span style="background-color: #e3d2d2; color: #a61717;">rgb</span> <span style="background-color: #e3d2d2; color: #a61717;">"blue",</span>
<span style="background-color: #e3d2d2; color: #a61717;">"./data.data"</span> <span style="background-color: #e3d2d2; color: #a61717;">ind</span><span style="color: #008800; font-weight: bold;">ex</span> <span style="background-color: #e3d2d2; color: #a61717;">12</span> <span style="background-color: #e3d2d2; color: #a61717;">using</span> <span style="background-color: #e3d2d2; color: #a61717;">3</span> <span style="background-color: #e3d2d2; color: #a61717;">title</span> <span style="background-color: #e3d2d2; color: #a61717;">"</span> <span style="background-color: #e3d2d2; color: #a61717;">"</span> <span style="background-color: #e3d2d2; color: #a61717;">with</span> <span style="background-color: #e3d2d2; color: #a61717;">linespoints</span> <span style="background-color: #e3d2d2; color: #a61717;">linestyle</span> <span style="background-color: #e3d2d2; color: #a61717;">5</span> <span style="background-color: #e3d2d2; color: #a61717;">lc</span> <span style="background-color: #e3d2d2; color: #a61717;">rgb</span> <span style="background-color: #e3d2d2; color: #a61717;">"green"</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">ylabel</span> <span style="background-color: #fff0f0; color: #dd2200;">"Output disturbance"</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">size</span> <span style="color: #0000dd; font-weight: bold;">1</span>,<span style="color: #0000dd; font-weight: bold;">0.3</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">origin</span> <span style="color: #0000dd; font-weight: bold;">0.0</span>,<span style="color: #0000dd; font-weight: bold;">0.39</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">xlabel</span> <span style="background-color: #fff0f0; color: #dd2200;">" "</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">bmargin</span> <span style="color: #0000dd; font-weight: bold;">0</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">tmargin</span> <span style="color: #0000dd; font-weight: bold;">1</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="background-color: #e3d2d2; color: #a61717;">no</span><span style="color: #003388;">key</span>
<span style="color: #008800; font-weight: bold;">plot</span> <span style="background-color: #fff0f0; color: #dd2200;">"./data.data"</span> <span style="color: #003388;">index</span> <span style="color: #0000dd; font-weight: bold;">23</span> <span style="color: #003388;">using</span> <span style="color: #0000dd; font-weight: bold;">2</span> <span style="color: #003388;">title</span> <span style="background-color: #fff0f0; color: #dd2200;">" "</span> <span style="color: #003388;">with</span> linespoints linestyle <span style="color: #0000dd; font-weight: bold;">1</span> lc rgb <span style="background-color: #fff0f0; color: #dd2200;">"red"</span>,
<span style="background-color: #e3d2d2; color: #a61717;">"./data.data"</span> <span style="background-color: #e3d2d2; color: #a61717;">ind</span><span style="color: #008800; font-weight: bold;">ex</span> <span style="background-color: #e3d2d2; color: #a61717;">22</span> <span style="background-color: #e3d2d2; color: #a61717;">using</span> <span style="background-color: #e3d2d2; color: #a61717;">2</span> <span style="background-color: #e3d2d2; color: #a61717;">title</span> <span style="background-color: #e3d2d2; color: #a61717;">"</span> <span style="background-color: #e3d2d2; color: #a61717;">"</span> <span style="background-color: #e3d2d2; color: #a61717;">with</span> <span style="background-color: #e3d2d2; color: #a61717;">linespoints</span> <span style="background-color: #e3d2d2; color: #a61717;">linestyle</span> <span style="background-color: #e3d2d2; color: #a61717;">2</span> <span style="background-color: #e3d2d2; color: #a61717;">lc</span> <span style="background-color: #e3d2d2; color: #a61717;">rgb</span> <span style="background-color: #e3d2d2; color: #a61717;">"dark-red",</span>
<span style="background-color: #e3d2d2; color: #a61717;">"./data.data"</span> <span style="background-color: #e3d2d2; color: #a61717;">ind</span><span style="color: #008800; font-weight: bold;">ex</span> <span style="background-color: #e3d2d2; color: #a61717;">18</span> <span style="background-color: #e3d2d2; color: #a61717;">using</span> <span style="background-color: #e3d2d2; color: #a61717;">2</span> <span style="background-color: #e3d2d2; color: #a61717;">title</span> <span style="background-color: #e3d2d2; color: #a61717;">"</span> <span style="background-color: #e3d2d2; color: #a61717;">"</span> <span style="background-color: #e3d2d2; color: #a61717;">with</span> <span style="background-color: #e3d2d2; color: #a61717;">linespoints</span> <span style="background-color: #e3d2d2; color: #a61717;">linestyle</span> <span style="background-color: #e3d2d2; color: #a61717;">3</span> <span style="background-color: #e3d2d2; color: #a61717;">lc</span> <span style="background-color: #e3d2d2; color: #a61717;">rgb</span> <span style="background-color: #e3d2d2; color: #a61717;">"dark-green",</span>
<span style="background-color: #e3d2d2; color: #a61717;">"./data.data"</span> <span style="background-color: #e3d2d2; color: #a61717;">ind</span><span style="color: #008800; font-weight: bold;">ex</span> <span style="background-color: #e3d2d2; color: #a61717;">14</span> <span style="background-color: #e3d2d2; color: #a61717;">using</span> <span style="background-color: #e3d2d2; color: #a61717;">2</span> <span style="background-color: #e3d2d2; color: #a61717;">title</span> <span style="background-color: #e3d2d2; color: #a61717;">"</span> <span style="background-color: #e3d2d2; color: #a61717;">"</span> <span style="background-color: #e3d2d2; color: #a61717;">with</span> <span style="background-color: #e3d2d2; color: #a61717;">linespoints</span> <span style="background-color: #e3d2d2; color: #a61717;">linestyle</span> <span style="background-color: #e3d2d2; color: #a61717;">4</span> <span style="background-color: #e3d2d2; color: #a61717;">lc</span> <span style="background-color: #e3d2d2; color: #a61717;">rgb</span> <span style="background-color: #e3d2d2; color: #a61717;">"blue",</span>
<span style="background-color: #e3d2d2; color: #a61717;">"./data.data"</span> <span style="background-color: #e3d2d2; color: #a61717;">ind</span><span style="color: #008800; font-weight: bold;">ex</span> <span style="background-color: #e3d2d2; color: #a61717;">12</span> <span style="background-color: #e3d2d2; color: #a61717;">using</span> <span style="background-color: #e3d2d2; color: #a61717;">2</span> <span style="background-color: #e3d2d2; color: #a61717;">title</span> <span style="background-color: #e3d2d2; color: #a61717;">"</span> <span style="background-color: #e3d2d2; color: #a61717;">"</span> <span style="background-color: #e3d2d2; color: #a61717;">with</span> <span style="background-color: #e3d2d2; color: #a61717;">linespoints</span> <span style="background-color: #e3d2d2; color: #a61717;">linestyle</span> <span style="background-color: #e3d2d2; color: #a61717;">5</span> <span style="background-color: #e3d2d2; color: #a61717;">lc</span> <span style="background-color: #e3d2d2; color: #a61717;">rgb</span> <span style="background-color: #e3d2d2; color: #a61717;">"green"</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">size</span> <span style="color: #0000dd; font-weight: bold;">1</span>,<span style="color: #0000dd; font-weight: bold;">0.3</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">origin</span> <span style="color: #0000dd; font-weight: bold;">0.0</span>,<span style="color: #0000dd; font-weight: bold;">0.7</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">bmargin</span> <span style="color: #0000dd; font-weight: bold;">0.1</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">xlabel</span> <span style="background-color: #fff0f0; color: #dd2200;">" "</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">tmargin</span> <span style="color: #0000dd; font-weight: bold;">1</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">ylabel</span> <span style="background-color: #fff0f0; color: #dd2200;">"Residual disturbance"</span>
<span style="color: #008800; font-weight: bold;">plot</span> <span style="background-color: #fff0f0; color: #dd2200;">"./data.data"</span> <span style="color: #003388;">index</span> <span style="color: #0000dd; font-weight: bold;">23</span> <span style="color: #003388;">using</span> <span style="color: #0000dd; font-weight: bold;">1</span> <span style="color: #003388;">title</span> <span style="background-color: #fff0f0; color: #dd2200;">" "</span> <span style="color: #003388;">with</span> linespoints linestyle <span style="color: #0000dd; font-weight: bold;">1</span> lc rgb <span style="background-color: #fff0f0; color: #dd2200;">"red"</span>,
<span style="background-color: #e3d2d2; color: #a61717;">"./data.data"</span> <span style="background-color: #e3d2d2; color: #a61717;">ind</span><span style="color: #008800; font-weight: bold;">ex</span> <span style="background-color: #e3d2d2; color: #a61717;">22</span> <span style="background-color: #e3d2d2; color: #a61717;">using</span> <span style="background-color: #e3d2d2; color: #a61717;">1</span> <span style="background-color: #e3d2d2; color: #a61717;">title</span> <span style="background-color: #e3d2d2; color: #a61717;">"</span> <span style="background-color: #e3d2d2; color: #a61717;">"</span> <span style="background-color: #e3d2d2; color: #a61717;">with</span> <span style="background-color: #e3d2d2; color: #a61717;">linespoints</span> <span style="background-color: #e3d2d2; color: #a61717;">linestyle</span> <span style="background-color: #e3d2d2; color: #a61717;">2</span> <span style="background-color: #e3d2d2; color: #a61717;">lc</span> <span style="background-color: #e3d2d2; color: #a61717;">rgb</span> <span style="background-color: #e3d2d2; color: #a61717;">"dark-red",</span>
<span style="background-color: #e3d2d2; color: #a61717;">"./data.data"</span> <span style="background-color: #e3d2d2; color: #a61717;">ind</span><span style="color: #008800; font-weight: bold;">ex</span> <span style="background-color: #e3d2d2; color: #a61717;">18</span> <span style="background-color: #e3d2d2; color: #a61717;">using</span> <span style="background-color: #e3d2d2; color: #a61717;">1</span> <span style="background-color: #e3d2d2; color: #a61717;">title</span> <span style="background-color: #e3d2d2; color: #a61717;">"</span> <span style="background-color: #e3d2d2; color: #a61717;">"</span> <span style="background-color: #e3d2d2; color: #a61717;">with</span> <span style="background-color: #e3d2d2; color: #a61717;">linespoints</span> <span style="background-color: #e3d2d2; color: #a61717;">linestyle</span> <span style="background-color: #e3d2d2; color: #a61717;">3</span> <span style="background-color: #e3d2d2; color: #a61717;">lc</span> <span style="background-color: #e3d2d2; color: #a61717;">rgb</span> <span style="background-color: #e3d2d2; color: #a61717;">"dark-green",</span>
<span style="background-color: #e3d2d2; color: #a61717;">"./data.data"</span> <span style="background-color: #e3d2d2; color: #a61717;">ind</span><span style="color: #008800; font-weight: bold;">ex</span> <span style="background-color: #e3d2d2; color: #a61717;">14</span> <span style="background-color: #e3d2d2; color: #a61717;">using</span> <span style="background-color: #e3d2d2; color: #a61717;">1</span> <span style="background-color: #e3d2d2; color: #a61717;">title</span> <span style="background-color: #e3d2d2; color: #a61717;">"</span> <span style="background-color: #e3d2d2; color: #a61717;">"</span> <span style="background-color: #e3d2d2; color: #a61717;">with</span> <span style="background-color: #e3d2d2; color: #a61717;">linespoints</span> <span style="background-color: #e3d2d2; color: #a61717;">linestyle</span> <span style="background-color: #e3d2d2; color: #a61717;">4</span> <span style="background-color: #e3d2d2; color: #a61717;">lc</span> <span style="background-color: #e3d2d2; color: #a61717;">rgb</span> <span style="background-color: #e3d2d2; color: #a61717;">"blue",</span>
<span style="background-color: #e3d2d2; color: #a61717;">"./data.data"</span> <span style="background-color: #e3d2d2; color: #a61717;">ind</span><span style="color: #008800; font-weight: bold;">ex</span> <span style="background-color: #e3d2d2; color: #a61717;">12</span> <span style="background-color: #e3d2d2; color: #a61717;">using</span> <span style="background-color: #e3d2d2; color: #a61717;">1</span> <span style="background-color: #e3d2d2; color: #a61717;">title</span> <span style="background-color: #e3d2d2; color: #a61717;">"</span> <span style="background-color: #e3d2d2; color: #a61717;">"</span> <span style="background-color: #e3d2d2; color: #a61717;">with</span> <span style="background-color: #e3d2d2; color: #a61717;">linespoints</span> <span style="background-color: #e3d2d2; color: #a61717;">linestyle</span> <span style="background-color: #e3d2d2; color: #a61717;">5</span> <span style="background-color: #e3d2d2; color: #a61717;">lc</span> <span style="background-color: #e3d2d2; color: #a61717;">rgb</span> <span style="background-color: #e3d2d2; color: #a61717;">"green"</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="background-color: #e3d2d2; color: #a61717;">no</span><span style="color: #003388;">multiplot</span>
</pre>
</td></tr>
</tbody></table>
</div>
<br />
До строки 17 всё в общем вполне очевидно - задаём стили для линий разных типов, диапазоны на осях и сетку. Кроме того, строка 2 явно указывает гнуплоту внедрять шрифты, <a href="http://mydebianblog.blogspot.com.au/2012/01/gnuplot.html" target="_blank">о чём уже была заметка ранее</a>.<br />
<br />
Чёрная магия начинается дальше: с помощью инструкци <span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">multiplot</span> на строке 17 мы просим строить gnuplot несколько графиков на одном.<br />
<br />
График начинаем строить <i>с конца</i>, то есть с нижнего графика. Для этого мы меняем размер и позицию графика:<br />
<blockquote class="tr_bq">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">size</span> <span style="color: #0000dd; font-weight: bold;">1</span>,<span style="color: #0000dd; font-weight: bold;">0.35</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">origin</span> <span style="color: #0000dd; font-weight: bold;">0.0</span>,<span style="color: #0000dd; font-weight: bold;">0.0</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">bmargin</span> <span style="color: #0000dd; font-weight: bold;">3</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">tmargin</span> <span style="color: #0000dd; font-weight: bold;">0</span></pre>
</blockquote>
на строках 17-22. После этих танцев с бубном строим график: <br />
<br />
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">plot</span> <span style="background-color: #fff0f0; color: #dd2200;">"./data.data"</span> <span style="color: #003388;">index</span> <span style="color: #0000dd; font-weight: bold;">23</span> <span style="color: #003388;">using</span> <span style="color: #0000dd; font-weight: bold;">3</span> <span style="color: #003388;">title</span> <span style="background-color: #fff0f0; color: #dd2200;">" "</span> <span style="color: #003388;">with</span> linespoints linestyle <span style="color: #0000dd; font-weight: bold;">1</span> lc rgb <span style="background-color: #fff0f0; color: #dd2200;">"red"</span></pre>
<br />
из файла данных<span style="background-color: #e3d2d2; color: #a61717;"> ./data.data</span>, используя блок с результатами номер 22 (ибо <span style="background-color: #e3d2d2; color: #a61717;">ind</span><span style="color: #008800; font-weight: bold;">ex</span> <span style="background-color: #e3d2d2; color: #a61717;">22</span><span style="color: #a61717;"> </span>а нумерация идёт с блока 0), в котором строим 3-ю колонку (<span style="color: #003388;">using</span> <span style="color: #0000dd; font-weight: bold;">3</span><span style="color: #0000dd;">)</span> стилем линий linestyle <span style="color: #0000dd; font-weight: bold;">1</span> используя красный цвет линии lc rgb <span style="background-color: #fff0f0; color: #dd2200;">"red"</span><br />
<blockquote class="tr_bq">
<span style="font-size: x-small;">Вообще полезно продумать структуру данных для строительства графиков заранее. Например, размещать данные для разных случаев блоками (ряды данных, отбитых двумя пустыми строками), чтобы использовать возможности gnuplot и <a href="http://t16web.lanl.gov/Kawano/gnuplot/datafile2-e.html" target="_blank">особенно инструкции index</a>.</span></blockquote>
График, расположенный в середине (строки 32-43 ), строится точно так же, только:<br />
<blockquote class="tr_bq">
<pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">size</span> <span style="color: #0000dd; font-weight: bold;">1</span>,<span style="color: #0000dd; font-weight: bold;">0.3</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">origin</span> <span style="color: #0000dd; font-weight: bold;">0.0</span>,<span style="color: #0000dd; font-weight: bold;">0.39</span></pre>
</blockquote>
Ну и наконец верхний график в примере это строки 44-54, после чего выключаем multiplot и скармливаем всё gnuplot для графопостроительства. Всё легко и просто :-)<br />
<br />
<br />
<br />
<div style="color: #783f04;">
<span style="font-size: large;"><b>Графики с осями, имеющими разрывы</b></span></div>
Разр<b>ы</b>вные оси (broken axis) на графиках иногда нужны, чтобы показать данные только в тех значениях, где происходит что-то интересное. При этом масштаб нужен линейный, а применение логарифмических осей нежелательно или невозможно <span style="color: #999999;">(например, когда показывается probability density function)</span>. И если вы думали, что предыдущий пример мозговыносящий - пристегните ремни, товарищи, сейчас начнётся...<br />
<br />
<a href="http://gnuplot-surprising.blogspot.com.au/2011/10/broken-axes-graph-in-gnuplot.html" target="_blank">Рецепт</a> подсмотрен на блоге <a href="http://www.blogger.com/profile/08963583502168321534" target="_blank">одной суровой японской девушки</a>, и далее будет адаптирован для ещё более мозголомного случая. Но всё по порядку.<br />
<br />
Собственно, требуется построить простой график, но чтобы оси были разр<b>ы</b>вные. Выглядит график вот так:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-5Dq2VCk1ne0/T-p2FJqkNvI/AAAAAAAAChk/68OTAq4had8/s1600/broken_axes1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="http://3.bp.blogspot.com/-5Dq2VCk1ne0/T-p2FJqkNvI/AAAAAAAAChk/68OTAq4had8/s400/broken_axes1.png" width="400" /></a></div>
<br />
Код для построения графика, <a href="http://gnuplot-surprising.blogspot.com.au/2011/10/broken-axes-graph-in-gnuplot.html" target="_blank">взятый</a> с сайта <a href="http://gnuplot-surprising.blogspot.com/" target="_blank">Gnuplot Surprising</a>, приводится далее:<br />
<br />
<div style="background: #ffffff; background: white; border-width: .1em .1em .1em .8em; border: solid gray; color: black; overflow: auto; padding: .2em .6em; width: auto;">
<table><tbody>
<tr><td><pre style="line-height: 125%; margin: 0;">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51</pre>
</td><td><pre style="line-height: 125%; margin: 0;"><span style="color: #008800; font-weight: bold;">reset</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">term</span> png font <span style="background-color: #fff0f0; color: #dd2200;">"Times,15"</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">output</span> <span style="background-color: #fff0f0; color: #dd2200;">"broken_axes1.png"</span>
<span style="color: #008800; font-weight: bold;">f</span>(x)=<span style="color: #0066bb; font-weight: bold;">exp</span>(-x)*<span style="color: #0066bb; font-weight: bold;">sin</span>(<span style="color: #0000dd; font-weight: bold;">500</span>*x) <span style="color: #888888;">#plotting function</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">yrange</span> [<span style="color: #0000dd; font-weight: bold;">-1</span>:<span style="color: #0000dd; font-weight: bold;">1</span>] <span style="color: #888888;">#The later two plot have same yrange</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">sample</span> <span style="color: #0000dd; font-weight: bold;">400</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">tics</span> nomirror
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">tmargin</span> at screen <span style="color: #0000dd; font-weight: bold;">0.9</span> <span style="color: #888888;">#the later two plots will share this tmargin</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">bmargin</span> at screen <span style="color: #0000dd; font-weight: bold;">0.1</span> <span style="color: #888888;">#------------------------------------b------</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">multiplot</span> <span style="color: #888888;">#begin multiplot mode</span>
<span style="color: #888888;">#axes broken line</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">arrow</span> <span style="color: #0000dd; font-weight: bold;">1</span> from screen <span style="color: #0000dd; font-weight: bold;">0.5</span>,<span style="color: #0000dd; font-weight: bold;">0.08</span> to screen <span style="color: #0000dd; font-weight: bold;">0.52</span>,<span style="color: #0000dd; font-weight: bold;">0.12</span> nohead
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">arrow</span> <span style="color: #0000dd; font-weight: bold;">2</span> from screen <span style="color: #0000dd; font-weight: bold;">0.52</span>,<span style="color: #0000dd; font-weight: bold;">0.08</span> to screen <span style="color: #0000dd; font-weight: bold;">0.54</span>,<span style="color: #0000dd; font-weight: bold;">0.12</span> nohead
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">arrow</span> <span style="color: #0000dd; font-weight: bold;">3</span> from screen <span style="color: #0000dd; font-weight: bold;">0.5</span>,<span style="color: #0000dd; font-weight: bold;">0.88</span> to screen <span style="color: #0000dd; font-weight: bold;">0.52</span>,<span style="color: #0000dd; font-weight: bold;">0.92</span> nohead
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">arrow</span> <span style="color: #0000dd; font-weight: bold;">4</span> from screen <span style="color: #0000dd; font-weight: bold;">0.52</span>,<span style="color: #0000dd; font-weight: bold;">0.88</span> to screen <span style="color: #0000dd; font-weight: bold;">0.54</span>,<span style="color: #0000dd; font-weight: bold;">0.92</span> nohead
<span style="color: #888888;">#x,y axis label and title label</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">label</span> <span style="color: #0000dd; font-weight: bold;">1</span> <span style="background-color: #fff0f0; color: #dd2200;">"Time: t(s)"</span> at screen <span style="color: #0000dd; font-weight: bold;">0.475</span>,<span style="color: #0000dd; font-weight: bold;">0.025</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">label</span> <span style="color: #0000dd; font-weight: bold;">2</span> <span style="background-color: #fff0f0; color: #dd2200;">"Signal:U(mV)"</span> at screen <span style="color: #0000dd; font-weight: bold;">0.025</span>,<span style="color: #0000dd; font-weight: bold;">0.44</span> rotate by <span style="color: #0000dd; font-weight: bold;">90</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">label</span> <span style="color: #0000dd; font-weight: bold;">3</span> center <span style="background-color: #fff0f0; color: #dd2200;">"U=exp(-t)sin(500t)"</span> at screen <span style="color: #0000dd; font-weight: bold;">0.5</span>,<span style="color: #0000dd; font-weight: bold;">0.95</span>
<span style="color: #888888;">#The left part</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">border</span> <span style="color: #0000dd; font-weight: bold;">1</span>+<span style="color: #0000dd; font-weight: bold;">2</span>+<span style="color: #0000dd; font-weight: bold;">4</span> <span style="color: #888888;">#the right border is not plotted</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">lmargin</span> at screen <span style="color: #0000dd; font-weight: bold;">0.1</span> <span style="color: #888888;">#the left-part's location</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">rmargin</span> at screen <span style="color: #0000dd; font-weight: bold;">0.51</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">xtics</span> <span style="color: #0000dd; font-weight: bold;">0</span>,<span style="color: #0000dd; font-weight: bold;">0.02</span>,<span style="color: #0000dd; font-weight: bold;">0.08</span>
<span style="color: #008800; font-weight: bold;">plot</span> [<span style="color: #0000dd; font-weight: bold;">0</span>:<span style="color: #0000dd; font-weight: bold;">0.1</span>] <span style="color: #0066bb; font-weight: bold;">f</span>(x) <span style="color: #003388;">w</span> l lt <span style="color: #0000dd; font-weight: bold;">1</span> lw <span style="color: #0000dd; font-weight: bold;">2</span> <span style="color: #003388;">notitle</span>
<span style="color: #888888;">#unset the labels and arrows, otherwise they will be plot </span>
<span style="color: #888888;">#for the second time</span>
<span style="color: #008800; font-weight: bold;">unset</span> <span style="color: #003388;">label</span> <span style="background-color: #e3d2d2; color: #a61717;">1</span>
<span style="color: #008800; font-weight: bold;">unset</span> <span style="color: #003388;">label</span> <span style="background-color: #e3d2d2; color: #a61717;">2</span>
<span style="color: #008800; font-weight: bold;">unset</span> <span style="color: #003388;">label</span> <span style="background-color: #e3d2d2; color: #a61717;">3</span>
<span style="color: #008800; font-weight: bold;">unset</span> <span style="color: #003388;">arrow</span> <span style="background-color: #e3d2d2; color: #a61717;">1</span>
<span style="color: #008800; font-weight: bold;">unset</span> <span style="color: #003388;">arrow</span> <span style="background-color: #e3d2d2; color: #a61717;">2</span>
<span style="color: #008800; font-weight: bold;">unset</span> <span style="color: #003388;">arrow</span> <span style="background-color: #e3d2d2; color: #a61717;">3</span>
<span style="color: #008800; font-weight: bold;">unset</span> <span style="color: #003388;">arrow</span> <span style="background-color: #e3d2d2; color: #a61717;">4</span>
<span style="color: #888888;">#the right part</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">border</span> <span style="color: #0000dd; font-weight: bold;">1</span>+<span style="color: #0000dd; font-weight: bold;">4</span>+<span style="color: #0000dd; font-weight: bold;">8</span> <span style="color: #888888;">#the left border is not plotted</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">lmargin</span> at screen <span style="color: #0000dd; font-weight: bold;">0.53</span> <span style="color: #888888;">#the right-part's location</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">rmargin</span> at screen <span style="color: #0000dd; font-weight: bold;">0.94</span>
<span style="color: #888888;">#ytics is not plotted, as the second plot will share it with the first one</span>
<span style="color: #008800; font-weight: bold;">unset</span> <span style="color: #003388;">ytics</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">xtics</span> <span style="color: #0000dd; font-weight: bold;">0.9</span>,<span style="color: #0000dd; font-weight: bold;">0.02</span>,<span style="color: #0000dd; font-weight: bold;">1.0</span>
<span style="color: #008800; font-weight: bold;">plot</span> [<span style="color: #0000dd; font-weight: bold;">0.9</span>:<span style="color: #0000dd; font-weight: bold;">1</span>] <span style="color: #0066bb; font-weight: bold;">f</span>(x) <span style="color: #003388;">w</span> l lt <span style="color: #0000dd; font-weight: bold;">1</span> lw <span style="color: #0000dd; font-weight: bold;">2</span>
<span style="color: #008800; font-weight: bold;">unset</span> <span style="color: #003388;">multiplot</span>
</pre>
</td></tr>
</tbody></table>
</div>
<br />
<br />
Выглядит, конечно, устрашающе. Тем не менее, это тот же самый <span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">multiplot</span> только сбоку. В отличие от предыдущего примера, здесь мы строим <i>левую</i> и <i>правую</i> части графиков отдельно, с разными осями и диапазонами, а потом сшиваем вместе. <br />
<br />
Новизна тут в засечках на осях, которые строятся с плачем и рыданиями - реально, это самая сложная и занудная часть графика (строки 13-17):<br />
<br />
<table><tbody>
<tr><td><blockquote class="tr_bq">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">#axes broken line</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">arrow</span> <span style="color: #0000dd; font-weight: bold;">1</span> from screen <span style="color: #0000dd; font-weight: bold;">0.5</span>,<span style="color: #0000dd; font-weight: bold;">0.08</span> to screen <span style="color: #0000dd; font-weight: bold;">0.52</span>,<span style="color: #0000dd; font-weight: bold;">0.12</span> nohead
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">arrow</span> <span style="color: #0000dd; font-weight: bold;">2</span> from screen <span style="color: #0000dd; font-weight: bold;">0.52</span>,<span style="color: #0000dd; font-weight: bold;">0.08</span> to screen <span style="color: #0000dd; font-weight: bold;">0.54</span>,<span style="color: #0000dd; font-weight: bold;">0.12</span> nohead
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">arrow</span> <span style="color: #0000dd; font-weight: bold;">3</span> from screen <span style="color: #0000dd; font-weight: bold;">0.5</span>,<span style="color: #0000dd; font-weight: bold;">0.88</span> to screen <span style="color: #0000dd; font-weight: bold;">0.52</span>,<span style="color: #0000dd; font-weight: bold;">0.92</span> nohead
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">arrow</span> <span style="color: #0000dd; font-weight: bold;">4</span> from screen <span style="color: #0000dd; font-weight: bold;">0.52</span>,<span style="color: #0000dd; font-weight: bold;">0.88</span> to screen <span style="color: #0000dd; font-weight: bold;">0.54</span>,<span style="color: #0000dd; font-weight: bold;">0.92</span> nohead </pre>
</blockquote>
</td></tr>
</tbody></table>
Занудность в том, что угадать координаты засечек (в формате [x,y]_начало_засечки, [x,y]_конец_засечки) довольно непросто.<br />
<br />
Далее идёт построение левой части (строки 24-29): <br />
<blockquote class="tr_bq">
<table><tbody>
<tr><td><pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">#The left part</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">border</span> <span style="color: #0000dd; font-weight: bold;">1</span>+<span style="color: #0000dd; font-weight: bold;">2</span>+<span style="color: #0000dd; font-weight: bold;">4</span> <span style="color: #888888;">#the right border is not plotted</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">lmargin</span> at screen <span style="color: #0000dd; font-weight: bold;">0.1</span> <span style="color: #888888;">#the left-part's location</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">rmargin</span> at screen <span style="color: #0000dd; font-weight: bold;">0.51</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">xtics</span> <span style="color: #0000dd; font-weight: bold;">0</span>,<span style="color: #0000dd; font-weight: bold;">0.02</span>,<span style="color: #0000dd; font-weight: bold;">0.08</span>
<span style="color: #008800; font-weight: bold;">plot</span> [<span style="color: #0000dd; font-weight: bold;">0</span>:<span style="color: #0000dd; font-weight: bold;">0.1</span>] <span style="color: #0066bb; font-weight: bold;">f</span>(x) <span style="color: #003388;">w</span> l lt <span style="color: #0000dd; font-weight: bold;">1</span> lw <span style="color: #0000dd; font-weight: bold;">2</span> <span style="color: #003388;">notitle</span>
</pre>
</td></tr>
</tbody></table>
</blockquote>
Сложность здесь в том, чтобы угадать с полями (<span style="color: #008800; font-weight: bold;"> set</span> <span style="color: #003388;">lmargin</span> и<span style="color: #008800; font-weight: bold;"> set</span> <span style="color: #003388;">rmargin</span> ). У японской девушки всё легко и просто, но если нужно построить что-то посложнее, угадывание может отнять время.<br />
<br />
После убираем засечки:<br />
<blockquote class="tr_bq">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">#unset the labels and arrows, otherwise they will be plot </span>
<span style="color: #888888;">#for the second time</span>
<span style="color: #008800; font-weight: bold;">unset</span> <span style="color: #003388;">label</span> <span style="background-color: #e3d2d2; color: #a61717;">1</span>
<span style="color: #008800; font-weight: bold;">unset</span> <span style="color: #003388;">label</span> <span style="background-color: #e3d2d2; color: #a61717;">2</span>
<span style="color: #008800; font-weight: bold;">unset</span> <span style="color: #003388;">label</span> <span style="background-color: #e3d2d2; color: #a61717;">3</span>
<span style="color: #008800; font-weight: bold;">unset</span> <span style="color: #003388;">arrow</span> <span style="background-color: #e3d2d2; color: #a61717;">1</span>
<span style="color: #008800; font-weight: bold;">unset</span> <span style="color: #003388;">arrow</span> <span style="background-color: #e3d2d2; color: #a61717;">2</span>
<span style="color: #008800; font-weight: bold;">unset</span> <span style="color: #003388;">arrow</span> <span style="background-color: #e3d2d2; color: #a61717;">3</span>
<span style="color: #008800; font-weight: bold;">unset</span> <span style="color: #003388;">arrow</span> <span style="background-color: #e3d2d2; color: #a61717;">4</span></pre>
</blockquote>
и строим левую часть:<br />
<blockquote class="tr_bq">
<pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">#the right part</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">border</span> <span style="color: #0000dd; font-weight: bold;">1</span>+<span style="color: #0000dd; font-weight: bold;">4</span>+<span style="color: #0000dd; font-weight: bold;">8</span> <span style="color: #888888;">#the left border is not plotted</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">lmargin</span> at screen <span style="color: #0000dd; font-weight: bold;">0.53</span> <span style="color: #888888;">#the right-part's location</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">rmargin</span> at screen <span style="color: #0000dd; font-weight: bold;">0.94</span>
<span style="color: #888888;">#ytics is not plotted, as the second plot will share it with the first one</span>
<span style="color: #008800; font-weight: bold;">unset</span> <span style="color: #003388;">ytics</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">xtics</span> <span style="color: #0000dd; font-weight: bold;">0.9</span>,<span style="color: #0000dd; font-weight: bold;">0.02</span>,<span style="color: #0000dd; font-weight: bold;">1.0</span>
<span style="color: #008800; font-weight: bold;">plot</span> [<span style="color: #0000dd; font-weight: bold;">0.9</span>:<span style="color: #0000dd; font-weight: bold;">1</span>] <span style="color: #0066bb; font-weight: bold;">f</span>(x) <span style="color: #003388;">w</span> l lt <span style="color: #0000dd; font-weight: bold;">1</span> lw <span style="color: #0000dd; font-weight: bold;">2</span><span style="color: #003388;"></span></pre>
</blockquote>
Всё, выключаем мультиплот <span style="color: #008800; font-weight: bold;">unset</span> <span style="color: #003388;">multiplot</span> и вставляем эффектный график в статью.<br />
<br />
<br />
<div style="color: #783f04;">
<span style="font-size: large;"><b>А теперь всё вместе: три графика в одном с разрывными осями!</b></span></div>
На всякий случай: это не просто дешёвый выпендрёж автора этих строк и желание эпатировать публику, а реальная нужда запрессовать данные в ограниченный объём страниц конференции. Вот как выглядит график:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-s9A-IeDczk4/T-qE9YYjCLI/AAAAAAAAChw/MZY3CvJH6B0/s1600/gnuplot-blackmagick-02.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="457" src="http://1.bp.blogspot.com/-s9A-IeDczk4/T-qE9YYjCLI/AAAAAAAAChw/MZY3CvJH6B0/s640/gnuplot-blackmagick-02.jpg" width="640" /></a></div>
<br />
Здесь показано время работы алгоритма для трёх случаев. В одном из случаев (верхний) время распределено очень неравномерно, и нужно не просто отобразить три графика, но и сделать это с разрывными осями, которые к тому же имеют разный масштаб.<br />
<br />
Оценивая критически, этот график перегружен материалом, и автор это отлично понимает. Но проблема в том, что сделать эти графики по отдельности невозможно ввиду ограничений на число страниц, а разбить статью на две нельзя <span style="color: #999999;">(автор в абстракте наобещал золотые горы полгода назад, абстракт рецензенты конференции приняли, поезд ушёл, и в максимум 12 страниц текст и так влезает с диким скрипом)</span>. В общем, другого нет у нас пути, в руках у нас винтовка (с).<br />
<br />
Код для графика:<br />
<br />
<div style="background: #ffffff; background: white; border-width: .1em .1em .1em .8em; border: solid gray; color: black; overflow: auto; padding: .2em .6em; width: auto;">
<table><tbody>
<tr><td><pre style="line-height: 125%; margin: 0;">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66</pre>
</td><td><pre style="line-height: 125%; margin: 0;"><span style="color: #888888;">#! /usr/bin/gnuplot -persist</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">terminal</span> postscript <span style="background-color: #fff0f0; color: #dd2200;">"NimbusSanL-Regu"</span> eps color enhanced fontfile <span style="background-color: #fff0f0; color: #dd2200;">"/usr/share/texmf-texlive/fonts/type1/urw/helvetic/uhvr8a.pfb"</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">output</span> <span style="background-color: #fff0f0; color: #dd2200;">"./decoupled.ps"</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">lmargin</span> <span style="color: #0000dd; font-weight: bold;">10</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">rmargin</span> <span style="color: #0000dd; font-weight: bold;">2</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">grid</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">bmargin</span> <span style="color: #0000dd; font-weight: bold;">4</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">multiplot</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">xrange</span> [<span style="color: #0000dd; font-weight: bold;">0.16</span>:<span style="color: #0000dd; font-weight: bold;">0.22</span>]
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">yrange</span> [<span style="color: #0000dd; font-weight: bold;">0</span>:<span style="color: #0000dd; font-weight: bold;">2000</span>]
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">xtics</span> <span style="color: #0000dd; font-weight: bold;">0.005</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">grid</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">key</span> top left
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">size</span> <span style="color: #0000dd; font-weight: bold;">1</span>,<span style="color: #0000dd; font-weight: bold;">0.35</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">xlabel</span> <span style="background-color: #fff0f0; color: #dd2200;">"Mean computation time, milliseconds"</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">origin</span> <span style="color: #0000dd; font-weight: bold;">0.0</span>,<span style="color: #0000dd; font-weight: bold;">0.0</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">bmargin</span> <span style="color: #0000dd; font-weight: bold;">3</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">tmargin</span> <span style="color: #0000dd; font-weight: bold;">0</span>
<span style="color: #008800; font-weight: bold;">plot</span> <span style="background-color: #fff0f0; color: #dd2200;">".data"</span> <span style="color: #003388;">using</span> (<span style="background-color: #e3d2d2; color: #a61717;">$</span><span style="color: #0000dd; font-weight: bold;">2</span>*<span style="color: #0000dd; font-weight: bold;">10</span>**<span style="color: #0000dd; font-weight: bold;">3</span>):<span style="color: #0000dd; font-weight: bold;">1</span> <span style="color: #003388;">title</span> <span style="background-color: #fff0f0; color: #dd2200;">"No coupling, DM with 4 actuators"</span> <span style="color: #003388;">with</span> boxes fs pattern <span style="color: #0000dd; font-weight: bold;">2</span> lc rgb <span style="background-color: #fff0f0; color: #dd2200;">"blue"</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">ylabel</span> <span style="background-color: #fff0f0; color: #dd2200;">"Frequency of occurrences (out of 4000 data points)"</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">size</span> <span style="color: #0000dd; font-weight: bold;">1</span>,<span style="color: #0000dd; font-weight: bold;">0.3</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">origin</span> <span style="color: #0000dd; font-weight: bold;">0.0</span>,<span style="color: #0000dd; font-weight: bold;">0.39</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">bmargin</span> <span style="color: #0000dd; font-weight: bold;">0</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">tmargin</span> <span style="color: #0000dd; font-weight: bold;">1</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">xtics</span> <span style="color: #0000dd; font-weight: bold;">0.1</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">xrange</span> [<span style="color: #0000dd; font-weight: bold;">0.2</span>:<span style="color: #0000dd; font-weight: bold;">1.7</span>]
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">yrange</span> [<span style="color: #0000dd; font-weight: bold;">0</span>:<span style="color: #0000dd; font-weight: bold;">130</span>]
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">xlabel</span> <span style="background-color: #fff0f0; color: #dd2200;">""</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">grid</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">key</span> top left
<span style="color: #008800; font-weight: bold;">plot</span> <span style="background-color: #fff0f0; color: #dd2200;">".data"</span> <span style="color: #003388;">using</span> (<span style="background-color: #e3d2d2; color: #a61717;">$</span><span style="color: #0000dd; font-weight: bold;">2</span>*<span style="color: #0000dd; font-weight: bold;">10</span>**<span style="color: #0000dd; font-weight: bold;">3</span>):<span style="color: #0000dd; font-weight: bold;">1</span> <span style="color: #003388;">title</span> <span style="background-color: #fff0f0; color: #dd2200;">"No coupling, DM with 49 actuators"</span> <span style="color: #003388;">with</span> boxes fs pattern <span style="color: #0000dd; font-weight: bold;">1</span> lc rgb <span style="background-color: #fff0f0; color: #dd2200;">"dark-red"</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">xtics</span> <span style="color: #0000dd; font-weight: bold;">0.5</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">size</span> <span style="color: #0000dd; font-weight: bold;">1</span>,<span style="color: #0000dd; font-weight: bold;">0.3</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">origin</span> <span style="color: #0000dd; font-weight: bold;">0.0</span>,<span style="color: #0000dd; font-weight: bold;">0.7</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">bmargin</span> <span style="color: #0000dd; font-weight: bold;">0.1</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">tmargin</span> <span style="color: #0000dd; font-weight: bold;">1</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">xrange</span> [<span style="color: #0000dd; font-weight: bold;">0</span>:<span style="color: #0000dd; font-weight: bold;">8</span>]
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">xlabel</span> <span style="background-color: #fff0f0; color: #dd2200;">""</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">ylabel</span> <span style="background-color: #fff0f0; color: #dd2200;">""</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">arrow</span> <span style="color: #0000dd; font-weight: bold;">3</span> from screen <span style="color: #0000dd; font-weight: bold;">0.52</span>,<span style="color: #0000dd; font-weight: bold;">0.98</span> to screen <span style="color: #0000dd; font-weight: bold;">0.50</span>,<span style="color: #0000dd; font-weight: bold;">0.94</span> nohead
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">arrow</span> <span style="color: #0000dd; font-weight: bold;">4</span> from screen <span style="color: #0000dd; font-weight: bold;">0.57</span>,<span style="color: #0000dd; font-weight: bold;">0.98</span> to screen <span style="color: #0000dd; font-weight: bold;">0.55</span>,<span style="color: #0000dd; font-weight: bold;">0.94</span> nohead
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">arrow</span> <span style="color: #0000dd; font-weight: bold;">1</span> from screen <span style="color: #0000dd; font-weight: bold;">0.52</span>,<span style="color: #0000dd; font-weight: bold;">0.72</span> to screen <span style="color: #0000dd; font-weight: bold;">0.50</span>,<span style="color: #0000dd; font-weight: bold;">0.68</span> nohead
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">arrow</span> <span style="color: #0000dd; font-weight: bold;">2</span> from screen <span style="color: #0000dd; font-weight: bold;">0.57</span>,<span style="color: #0000dd; font-weight: bold;">0.72</span> to screen <span style="color: #0000dd; font-weight: bold;">0.55</span>,<span style="color: #0000dd; font-weight: bold;">0.68</span> nohead
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">border</span> <span style="color: #0000dd; font-weight: bold;">1</span>+<span style="color: #0000dd; font-weight: bold;">2</span>+<span style="color: #0000dd; font-weight: bold;">4</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">lmargin</span> at screen <span style="color: #0000dd; font-weight: bold;">0.1</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">rmargin</span> at screen <span style="color: #0000dd; font-weight: bold;">0.51</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">xtics</span> <span style="color: #0000dd; font-weight: bold;">0.1</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">yrange</span> [<span style="color: #0000dd; font-weight: bold;">0</span>:<span style="color: #0000dd; font-weight: bold;">80</span>]
<span style="color: #008800; font-weight: bold;">plot</span> [<span style="color: #0000dd; font-weight: bold;">0.3</span>:<span style="color: #0000dd; font-weight: bold;">1.5</span>] <span style="background-color: #fff0f0; color: #dd2200;">".data"</span> <span style="color: #003388;">using</span> (<span style="background-color: #e3d2d2; color: #a61717;">$</span><span style="color: #0000dd; font-weight: bold;">2</span>*<span style="color: #0000dd; font-weight: bold;">10</span>**<span style="color: #0000dd; font-weight: bold;">3</span>):<span style="color: #0000dd; font-weight: bold;">1</span> <span style="color: #003388;">title</span> <span style="background-color: #fff0f0; color: #dd2200;">"No coupling, DM with 100 actuators"</span> <span style="color: #003388;">with</span> boxes fs pattern <span style="color: #0000dd; font-weight: bold;">5</span> lc rgb <span style="background-color: #fff0f0; color: #dd2200;">"dark-green"</span>
<span style="color: #008800; font-weight: bold;">unset</span> <span style="color: #003388;">arrow</span> <span style="background-color: #e3d2d2; color: #a61717;">1</span>
<span style="color: #008800; font-weight: bold;">unset</span> <span style="color: #003388;">arrow</span> <span style="background-color: #e3d2d2; color: #a61717;">2</span>
<span style="color: #008800; font-weight: bold;">unset</span> <span style="color: #003388;">arrow</span> <span style="background-color: #e3d2d2; color: #a61717;">3</span>
<span style="color: #008800; font-weight: bold;">unset</span> <span style="color: #003388;">arrow</span> <span style="background-color: #e3d2d2; color: #a61717;">4</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">border</span> <span style="color: #0000dd; font-weight: bold;">1</span>+<span style="color: #0000dd; font-weight: bold;">4</span>+<span style="color: #0000dd; font-weight: bold;">8</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">lmargin</span> at screen <span style="color: #0000dd; font-weight: bold;">0.56</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">rmargin</span> at screen <span style="color: #0000dd; font-weight: bold;">0.975</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="background-color: #e3d2d2; color: #a61717;">no</span><span style="color: #003388;">key</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">xtics</span> <span style="color: #0000dd; font-weight: bold;">0.05</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">yrange</span> [<span style="color: #0000dd; font-weight: bold;">0</span>:<span style="color: #0000dd; font-weight: bold;">1000</span>]
<span style="color: #008800; font-weight: bold;">plot</span> [<span style="color: #0000dd; font-weight: bold;">7</span>:<span style="color: #0000dd; font-weight: bold;">7.5</span>] <span style="background-color: #fff0f0; color: #dd2200;">".data"</span> <span style="color: #003388;">using</span> (<span style="background-color: #e3d2d2; color: #a61717;">$</span><span style="color: #0000dd; font-weight: bold;">2</span>*<span style="color: #0000dd; font-weight: bold;">10</span>**<span style="color: #0000dd; font-weight: bold;">3</span>):<span style="color: #0000dd; font-weight: bold;">1</span> <span style="color: #003388;">title</span> <span style="background-color: #fff0f0; color: #dd2200;">" "</span> <span style="color: #003388;">with</span> boxes fs pattern <span style="color: #0000dd; font-weight: bold;">5</span> lc rgb <span style="background-color: #fff0f0; color: #dd2200;">"dark-green"</span>
<span style="color: #008800; font-weight: bold;">set</span> <span style="background-color: #e3d2d2; color: #a61717;">no</span><span style="color: #003388;">multiplot</span>
</pre>
</td></tr>
</tbody></table>
</div>
<br />
Собственно, здесь объёдинены два предыдущих примера. Только вместо точек строятся гистограммы, на что намекает строчка <span style="color: #003388;">with</span> boxes fs pattern <span style="color: #0000dd; font-weight: bold;">5</span> для команды<span style="color: #008800; font-weight: bold;"> plot</span>.<br />
<br />
Строчки 45-52 прямо вытащены из примера про разрывные оси.<br />
<br />
Обращаю внимание на то, что в коде наличествуют странные на первый взгляд инструкции вида <span style="color: #008800; font-weight: bold;">set</span> <span style="color: #003388;">xlabel</span> <span style="background-color: #fff0f0; color: #dd2200;">" "</span> они тут совершенно не случайно: при таком строительстве графиков подписи на осях будут красть ценное место, так что лучше спроектировать график так, чтобы оси были одна под другой.<br />
<br />
Выражение<br />
<blockquote class="tr_bq">
<span style="color: #008800; font-weight: bold;">plot</span> [<span style="color: #0000dd; font-weight: bold;">7</span>:<span style="color: #0000dd; font-weight: bold;">7.5</span>] <span style="background-color: #fff0f0; color: #dd2200;">".data"</span> <span style="color: #003388;">using</span> (<span style="background-color: #e3d2d2; color: #a61717;">$</span><span style="color: #0000dd; font-weight: bold;">2</span>*<span style="color: #0000dd; font-weight: bold;">10</span>**<span style="color: #0000dd; font-weight: bold;">3</span>):<span style="color: #0000dd; font-weight: bold;">1</span></blockquote>
<br />
тоже требует пояснений: это на самом деле один из самых простых примеров пред-обработки данных перед строительством графика. Здесь мы просим умножить данные в столбце 2 в тысячу раз: <span style="background-color: #e3d2d2; color: #a61717;">$</span><span style="color: #0000dd; font-weight: bold;">2</span>*<span style="color: #0000dd; font-weight: bold;">10</span>**<span style="color: #0000dd; font-weight: bold;">3</span> . Если приглядеться графику, то ось Х содержит данные в милисекундах, но сняты данные были в долях секунды. Удобнее умножить их в гнуплоте, чем пытаться переделать потом.<br />
<br />
Усвоенный урок лично автором этих строк: такие мозговыносящие графики стоит создавать поэтапно - сначала нижний график, потом средний, потом верхний. Так проще отлавливать ошибки в инструкциях гнуплоту.<br />
<br />
<br />
<span style="color: #783f04; font-size: large;"><b>Заключение</b></span><br />
У автора <strike style="color: #999999;">окончательно двинулась крыша на почве гнуплота</strike> была реальная необходимость втиснуть много данных в график для опубликования. И про это, собственно, созрел пост. И не один.<br />
<br />
На самом деле, такие графики довольно удобны: <span style="color: #660000;">вместо того, чтобы городить десяток графиков, пугая и сбивая с толку читателя</span>, <span style="color: #274e13;">проще и лучше сделать один напичканный данными график, а потом по ходу текста его со смаком обсуждать</span>. К тому же, такой упиханный данными до зубов график позволяет сэкономить место, сохранив при этом читабельность статьи.<br />
<br />
<div style="color: #783f04;">
<b>И это ещё не всё!</b></div>
Оставлю тут ссылки на будущее с описаниями ещё более навороченных графиков. Представление <a href="http://sparky.rice.edu/gnuplot.html" target="_blank">о возможностях гнуплота</a> можно получить из <a href="http://www.gnuplot.info/demo/" target="_blank">галереи на официальном сайте</a>.<br />
<br />
Огромное количество разобранных примеров можно найти на замечательном блоге <a href="http://gnuplot-surprising.blogspot.com/" target="_blank">Gnuplot Surprising</a>. Блог на английском, и ведёт его <a href="http://www.blogger.com/profile/08963583502168321534" target="_blank">японская девушка</a>, которая с помощью гнуплота умеет делать <a href="http://gnuplot-surprising.blogspot.com.au/2011/10/broken-axes-graph-in-gnuplot.html" target="_blank">разрывные</a> <a href="http://gnuplot-surprising.blogspot.com.au/2011/10/broken-axes-graph-in-gnuplot-2.html" target="_blank">оси</a>, <a href="http://gnuplot-surprising.blogspot.com.au/2011/09/statistic-analysis-using-gnuplot-1.html" target="_blank">отображать статистику</a> на графиках, использовать <a href="http://gnuplot-surprising.blogspot.com.au/2011/09/plot-histograms-using-boxes.html" target="_blank">прозрачность</a>, и вообще <a href="http://gnuplot-surprising.blogspot.com.au/2011/09/gradient-colored-curve-in-gnuplot0.html" target="_blank">удалять гланды автогеном через отверстия, о которых вы даже не подозреваете</a> :-)<br />
<br />
<div class="kd-appbar">
</div>
Но ещё дальше пошёл суровый <a href="http://www.blogger.com/profile/10560778800525149384" target="_blank">Zoltán Vörös</a> aka Gnuplotter. В своём блоге <a href="http://gnuplot-tricks.blogspot.com/" target="_blank">Gnuplot tricks</a> и авторским сборником <a class="anchor" href="http://www.phyast.pitt.edu/%7Ezov1/gnuplot/html/intro.html" id="intro" target="_blank">Impossible gnuplot graphs</a> он <strike style="color: #999999;">творит адский трэш, олдскул и угар</strike> приводит примеры самых невероятных графиков. Галерея <a href="http://www.phyast.pitt.edu/%7Ezov1/gnuplot/html/gallery.html" target="_blank">графиков, которые строит Золтан на последних версиях гнуплота</a>, иначе как heavy woodoo назвать нельзя. Среди прочего, стоит отметить <a href="http://gnuplot-tricks.blogspot.com.au/2010/09/projecting-contours.html" target="_blank">проецирование контуров</a> на плоскости в mesh plots, построение <a href="http://gnuplot-tricks.blogspot.com.au/2010/09/projecting-contours.html" target="_blank">Fence Plots</a>, параметрические <a href="http://gnuplot-tricks.blogspot.com.au/2010/02/plotting-in-6-dimensions-parametric.html" target="_blank">6-ти мерные (!) графики</a>, цветовое <a href="http://www.phyast.pitt.edu/%7Ezov1/gnuplot/html/statistics.html" target="_blank">отображение статистики</a> на графиках и прочие чудеса на виражах.<br />
<br />
Раскраска кода выполнена с помощью веб-сервиса <a href="http://hilite.me/">http://hilite.me/</a> который, оказывается, знает и гнуплот.virenshttp://www.blogger.com/profile/12420257446841864325noreply@blogger.com12