десктоп,
научное
3 коммент.
В этом посте мы безтрепетной рукой вырвем с мясом из зотеры список книг, засунутых туда через графический, скажем так, интерфейс. В этом нам поможет язык Tcl (Тикль), Debian и SQLite3.
В этом блоге публикуются заметки и решения, найденные в процессе работы, освоения и жизни в дистрибутиве Debian GNU/Linux.
Нужно сказать, что LaTeX является Turing complete language, то есть на нем можно писать любые программы. Например, можно написать интерпретатор Бейсика, симулятор машины Тьюринга, Mandelbrot with LaTeX и другие программы. То есть на латехе можно писать что угодно. Не всегда это просто (особенно в случае с календарём), но можно.Пост поделён на две части: сначала немного о возможностях пакета Calendar, а потом про то, как обновление названий месяцев сделать автоматически из LaTeX.
%%% Turning on the Monthly calendar and Event listдля календаря на месяц и списка событий, и:
\usepackage{monthly,evntlist,lscape} \parindent=0pt
%%% Turning on the Yearly calendarдля календаря на год соответсвенно.
\usepackage{yearly}
%%%%%%% My Personal CalendarСначала указываем год в отдельном файле Essentials/Calenda/year2010.cld в котором пишем:
range Essentials/Calendar/year2010 %% What year do we want?
%% ONE-TIME EVENTS
january 28 2010 {Описать GTD} [Описать GTD для блога]
%%%%% RECURRING EVENTS
every Sunday {Еженед. обзор} [Еженед. обзор]
%% Span the whole year hereПовторяющиеся события будут определены только в интервале из этого файла.
January 1 2010 to December 31 2010 {The year 2010}
\begin{eventlist} {} {Essentials/Calendar/myEvents}и собираете LaTeXом документ, получая список календарных событий на это время:
january 24 2010 to january 30 2010
\end{eventlist}
\begin{monthly}Все события в календаре на указанный месяц (январь 2010 в данном случае) берутся из того же файла events.cld, который мы использовали для генерации списка календарных дней на неделю.
{firstday=1} %% begins with Monday
{Essentials/Calendar/myEvents}
jan 2010
\end{monthly}
\begin{yearly}После сборки документа годовой календарик будет выглядеть так:
{title= \begin{center} \textbf{\Large The Year 2013}\end{center} \normalsize,firstday=1}
{}
2013
\end{yearly}
out +=r'\begin{landscape}'+'\n' указывает Питону не интерпретировать \b а печатать как есть. Вызов команды date делается через os.popen(cmd), хотя теперь так уже не модно (но тем не менее работает), а модно через subprocess.check_output (но у меня так не получилось)..rstrip('\n') и далее сшивается с другими стоками. Результат записывается в файл tmpCalendarMonth.tex, который в свою очередь вставляется в ЛаТеХ через \input{Calendar/tmpCalendarMonth} и обрабатывается при сборке. Скрипт на питоне ниже: #! /usr/bin/python import string, os import commands kmvStartDir = '.' kmvDestDir = kmvStartDir+'/Calendar/' #destination directory for graphs ###### Getting dates and months as text using DATE command in Linux #### cmd='date --date="today" +%Y' stdout_handle = os.popen(cmd) kmv_year = stdout_handle.read() kmv_year = kmv_year.rstrip('\n') stdout_handle.close() cmd='date --date="today" +%B' stdout_handle = os.popen(cmd) kmv_month = stdout_handle.read() kmv_month = kmv_month.rstrip('\n') stdout_handle.close() cmd='date --date="today" +%e' stdout_handle = os.popen(cmd) kmv_day = stdout_handle.read() kmv_day = kmv_day.rstrip('\n') stdout_handle.close() #################################### #### Month Calendar regeneration ### #################################### kmvCalName = kmvDestDir+'tmpCalendarMonth' out = '' out +=r'\begin{landscape}'+'\n' out +=r'\begin{monthly}' out +='\n {firstday=1} \n' out +='{Calendar/myEvents} \n' out +=kmv_month+' '+kmv_year+'\n' out +='\end{monthly}\n' out +='\end{landscape}\n' ### Output to the Calendar's file ###### kmvCalName+='.tex' fout=open(kmvCalName,'w') fout.write(out) fout.close() ####################################
calendar_regenerate.py и все остальные файлы можно взять отсюда. Скрипт написан для того, чтобы быть максимально понятным, а не красивым или эффективным.calendar_regenerate.py в тот же каталог, где лежит файл 4myGTD.tex, из которого скрипт будет вызываться. В преамбуле документа пишем:%%% Python script for calendar regeneration \immediate\write18{./calendar_regenerate.py}
-shell-escape который позволяет выполнение внешних скриптов.
Внимание! Как совершенно справедливо отмечается многими, подобный трюк в сочетании с параметром –shell-escape
небезопасен и представляет собой потенциальную дыру в безопасности. Так
можно написать вредоносный документ с командой типа \write18{rm -rf ~} в
Unix. По этому поводу есть статья (PDF) об этой и других опасных командах в LaTeX.
Команда \immediate приказывает ЛаТеХ выполнить скрипт немедленно,
не дожидаясь окончания генерации всего документа. В данном случае это
оправдано, так как мы хотим, чтобы в документ вставился уже обновлённый
календарь.
Как это всегда бывает, когда что-то кажется слишком прекрасным, чтобы быть правдой, обязательно найдётся заподлянка. И pdfsam не исключение - написан он на Java, а это значит кучи exceptions по поводу и без, лютые тормоза и интерфейс из фильма ужасов.
$ java -jar pdfsamдаёт что-то вроде:
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdfЭто может сжать PDF, по крайней мере в большинстве случаев.
$ sudo apt-get install pdftkСинтаксис pdftk можно описать примерно так:
pdftk исходный_файл.pdf ДЕЙСТВИЕ страницы output получаемый_файл.pdfИтак, поехали....
$ pdftk document.pdf cat 140-142 output zz1.pdfЭта команда выдаст файл zz1.pdf, в котором будут три страницы, а именно 140, 141 и 142. Если же нужно разбить файл с какой-то страницы до конца, делаем так:
$ pdftk foo.pdf cat 30-end output biography.pdf
$ pdftk zz* cat output Issue26.pdfслужит для объединения всех файлов, содержащих zz в имени, в один Issue26.pdf
$ pdftk 1.pdf 2.pdf ... cat output merged.pdfбудет объединён в один файл merged.pdf.
pdftk book.pdf dump_data output report.txtВ этом файле мы увидим нечто вроде:
InfoKey: TitleЭти значения можно отредактировать в полученном текстовом файле (report.txt в этом примере) и загрузить обратно:
InfoValue: Coders At Work
InfoKey: Author
InfoValue: Peter Seivel
InfoKey: Subject
InfoValue: Programming
pdftk book.pdf update_info report.txt output bookcopy.pdfУ pdf-документов могут быть и другие поля, которые тоже можно поправить при желании.
\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}
\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}
pages=-) в 2x2 страницы на одной (nup=2x2) с прорисованной границей вокруг каждой страницы (frame). \includepdf[pages=1,landscape,clip,trim=1cm 2cm 3cm 4cm,frame,noautoscale,fitpaper=false]{AllTheMyGTDinOneScheme}
$ gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=finished.pdf file1.pdf file2.pdfТеперь что это всё значит:
-dBATCH -- после окончания пакетной обработки, GS прекращает работу (без этой опции он будет продолжать имитировать бурную деятельность)
-dNOPAUSE -- обрабатывать каждую страницу без пауз между ними
-q -- тихий режим, без выдачи сообщений
-sDEVICE=pdfwrite -- использовать встроенный обработчик PDF
-sOutputFile=finished.pdf -- записать выхлоп в файл finished.pdf
Преимущество такого джедайства в том, что Ghostscript входит во все
дистрибутивы Linux и часто уже установлен в системе. И не нужно тащить
килотонны джавы.
$ ps2pdf letterhead.eps
Я не буду говорить о вменяемости авторов ps2pdf, но всякий разработчик с IQ выше комнатной температуры должен понимать, что подобные WTF-моменты в пользовательском опыте в конечном итоге приводят к тому, год линупсов на десктопе уезжает в голубую даль. И это происходит именно из-за таких вот казусов, коих в ёпенсорце год от года становится только больше из-за набегающих леннартов поттерингов и прочих ковбоев, склонных к тяжёлому велосипедостроению там, где этого абсолютно не требуется.Так как ps2pdf принимает те же аргументы, что и Ghostscript, имеющий 900 газиллионов опций, среди которых должна быть возможность сохранять BoundingBox. И таки да, чудо случилось:
$ ps2pdf -dEPSCrop letterhead.eps
# ar vx mypackage.debФайл пакета mypackage.deb содержит три вложенных файла:
$ tar -xzvf data.tar.gzВ текущем каталоге появится ./usr текущего каталога. Желанный бинарник лежит в ./usr/bin подкаталоге.
$ ar p mypackage.deb data.tar.gz | tar zxэто распакует пакет deb в текущий каталог. Другой вариант - использовать dpkg-deb в виде:
$ dpkg-deb -x что.deb куда/
$ rpm2cpio mypackage.rpm | cpio -vidЕсли же нужно просмотреть содержимое пакета, не распаковывая его, даём команду:
$ rpm2cpio mypackage.rpm | cpio -vtДля того, чтобы (попытаться) конвертировать RPM-пакет в Debian, можно воспользоваться командой:
# alien mypack.i386.rpmНадо сказать, что пакеты RPM и DEB сильно отличаются друг и друга, и такое простое конвертирование не всегда проходит.
Часто хочется сделать побыстрее, чтоб "завелось и поехало" - и вместо пакетов пользователи устанавливают программы в виде ./configure, make & make install (вместо make install можно использовать checkinstall). Как уже говорилось не раз, не стоит поддаваться искушению и ставить программы в Linux в обход менеджера пакетов - пакетный менеджер ничего о них знать не будет, и при обновлении системы вы рискуете получить больше проблем на свою голову, чем представляете.Иногда бывает так, что исходников к пакету нет - скажем, поступила к нам проприетарщина, а упаковать её в пакет хочется. Или мы наваяли скрипт, и хочется, чтобы он был на многих машинах. Нет проблем: завернём это в deb-пакет и скормим apt-у.
# apt-get install dpkg-devПодопытным кроликом будет служить бинарный файл системы контроля версий fossil, о котором уже говорилось ранее.
$ mkdir -p ./tempprog/usr/bin/Так мы создадим все подкаталоги за один проход. Зайдём внутрь:
$ cd tempprog/и увидим созданные подкаталоги:
$ treeВот они:
.
└── usr
└── bin
2 directories, 0 files
$ mkdir ./DEBIAN
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: описание программы
.
├── DEBIAN
│.. └── control
└── usr
└── bin
└── fossil
3 directories, 2 files
$ dpkg-deb -b ./ ./В результате появится пакет (в нашем примере с fossil) вида:
fossil_1.21_i386.debкоторый можно сразу же установить в систему:
$ 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) ...
Небольшое примечание: если кто хочет установить программу в директорию
/opt/ нужно сделать следующее:
- В локальном каталоге ./tempprog создаём каталог /opt/ и размещаем там
программу так, как она и будет установлена в /opt
- Там же, в ./tempprog создаём подкаталоги /tempprog/usr/bin/
в котором размещаем небольшой скрипт, например zotero
- В нём пишем:
#! /bin/sh PATH=$PATH:/opt/zotero/ /opt/zotero/zotero
Это говорит системе, что теперь можно запускать файлы и из /opt/zotero
# dh_make --createorigДалее пишем
# debuildОпять, если нам повезло, всё должно собраться без вопросов. Полученный пакет устанавливаем
# dpkg -i foobar_1.2.3-1_i386.debОхочим до тонкостей дебиановской кулинарии и прочим правильно писающим мальчикам просьба пройти сюда и насладиться The Debian Administrator's Handbook. Эта
$ dpkg-scanpackages . /dev/null | gzip -9c > ./Packages.gzМожет быть, нам будет выведено сообщение типа:
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.
# vim /etc/apt/sources.listстрочкой типа:
deb file:///home/имя_пользователя/zips/virensdebianrepository ./
# apt-get updateВсё, теперь можно установить, к примеру, свежесобранный текстовый редактор Sublime Text 2 (отличная инструкция там) как всегда: Теперь, для того, чтобы установить SublimeText достаточно сделать:
# apt-get install sublimetext
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) ...Всё, пакет будет распакован и установлен, а то, что он из местного репозитория, видно вот тут: (from ..././sublimetext_2.0.2_i386.deb)
Материалы сайта «Записки дебианщика» написаны virens’ом и доступны на условиях лицензии Creative Commons Attribution-Non-Commercial-Share Alike 3.0 Unported License. Вы можете копировать, распространять, показывать эту работу, и создавать производные работы в некоммерческих целях на условиях:
1) обязательной ссылки на автора (virens, http://mydebianblog.blogspot.com/);
2) распространении любых производных работ на условиях этой же лицензии (ссылка на эту лицензию обязательна!).
Пожалуйста соблюдайте условия лицензии Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License. Авторские права - Михаил Конник aka virens.