данные,
ЛаТеХ
13 коммент.
В этом блоге публикуются заметки и решения, найденные в процессе работы, освоения и жизни в дистрибутиве Debian GNU/Linux.
\usepackage[mathlines]{lineno}% Enable numberingОтлично, теперь вставляем команду:
\linenumbers\par %%% <---- turn on the numeration of linesтам, где мы хотим начать нумерацию линий. Если нужно оборвать нумерацию в конце статьи перед, скажем, списком литературы, команда выглядит так:
\nolinenumbers %%% do not use line numbers any more.Важно то, что пакет lineno позволяет не только автоматически проставлять номера строк, но ещё и ссылаться на них. Автор настоятельно рекомендует использовать эту возможность, чтобы не сойти с ума самому при правках и не злить рецензентов.
\linelabel{review:1R1}Как и везде в ЛаТеХе, ссылки стоит ставить разумные: например, здесь написано, что это ответ на замечание 1 от рецензента 1 (они обычно анонимные).
We clarified this on page~\pageref{review:1R1} line~\ref{review:1R1}.
\newcommand{\footnoteremember}[2]{\footnote{#2} \newcounter{#1} \setcounter{#1}{\value{footnote}}} \newcommand{\footnoterecall}[1]{\footnotemark[\value{#1}]}Теперь в тексте можно написать:
The Finite Element Analysis was perfomed on a crappy computer\footnoteremember{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.}.
(see footnote\footnoterecall{footnotelatitude})И вы теперь сможете видеть номер сноски, на которую вы ссылаетесь. Трюк позаимствован отсюда.
pdftotext -layout -nopgbrk reviewnotes_12-0238_MS.pdfгде ключи означают:
-layout : maintain original physical layoutЕсли нужно перевести в текст только со страницы 5 по страницу 10, даём команду:
-nopgbrk : don't insert page breaks between pages
pdftotext -f 5 -l 10 reviewnotes_12-0238_MS.pdfПосле этого текст можно вставлять в веб-форму для ответа рецензентам.
\usepackage{nameref}
\section{Introduction}\label{intro}И ссылемся в тексте:
See more details in the \nameref{intro} section that has number \ref{intro}.Вместо этого мы при компиляции увидим:
See more details in the Introduction section that has number 1.Этот удобный и простой трюк подсмотрен тут.
Нужно сказать, что 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.