Russian Qt Forum

Qt => Кладовая готовых решений => Тема начата: m_ax от Июнь 23, 2013, 14:30



Название: BibMake - генератор библиографических списков
Отправлено: m_ax от Июнь 23, 2013, 14:30
Мотивация

При использовании LaTeX'а http://ru.wikipedia.org/wiki/LaTeX (http://ru.wikipedia.org/wiki/LaTeX) для набора документов (статей, книг и т.п.) которые должны включать список цитированной литературы (References), часто сталкиваюсь с проблемой его оформления в соответствии с правилами или требованиями его оформления. Т.е. это просто утомительно, особенно когда ссылок порядка ста.
Конечно, BibTeX http://ru.wikipedia.org/wiki/BibTeX (http://ru.wikipedia.org/wiki/BibTeX) легко решает эту проблему, при условии что у вас есть соответствующий .bst файл с инструкциями (на Фортоподобном языке) которые определяют стиль оформления ссылок. На основе .bst файла и библиографической базы (bib-файлы специального текстового формата для хранения списков библиографических записей) программа bibtex создаёт bbl файл со списком литературы, который в свою очередь подхватывает latex.
   
Итак, проблема с оформлением библиографии возникает когда у нас нет соответствующего .bst файла. Раньше эту проблему я решал одним из трёх способов:
1) Вообще не использовать BiBTeX и набирать список литературы вручную (в соответствии с правилами) в самом LaTeX файле. Это приемлемо, когда ссылок немного, но всё равно это утомительно.. Если ещё учесть, что после правок самой статьи, порядок ссылок в тексте может измениться и тогда придётся переставлять их и в самой библиографии.

2) Использовать близкий по стилю .bst файл и корректировать уже сгенерированный bbl файл.  Это занятие тоже утомительное)

3) Взять близкий по стилю .bst файл и подправить его. И может быть, после продолжительных ночных бдений, что-нибудь и получится) Я, конечно, ничего не имею против форта http://ru.wikipedia.org/wiki/%D0%A4%D0%BE%D1%80%D1%82_(%D1%8F%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F) (http://ru.wikipedia.org/wiki/%D0%A4%D0%BE%D1%80%D1%82_(%D1%8F%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F))
но подходить к этому третьему пункту нужно с очищенным (от плюсов) сознанием)

В связи с вышесказанным, назрела необходимость написать свою альтернативу BiBTeX'а - BibMake.
Идеология BibMake при этом будет полностью соответствовать BibTeX'у, только вместо устрашающих .bst файлов будет использован свой формат шаблона оформления. Достаточно прозрачный и интуитивно понятный любому, кто владеет LaTeX'ом на начальном уровне. Таким, чтобы этот шаблон оформления можно было легко изменить в соответствии с правилами (или ГОСТ'ами).

О архитектуре

BibMake включает в себя ядро (core) предоставляющее своё API и саму утилиту bibmake.
Сейчас работаю над самим ядром. Большая часть уже реализована.

Настало время разработать формат для шаблона. Например этот аналог bst файла может выглядеть так:

Код
Bash
article {
#AUTHORS #TITLE {\it #JOURNAL}  {\bf #VOLUME}, (#YEAR), p.~#PAGES  
}
 
book{
...
}
 
booklet{
...
}
 
и т.д.
 
где будут определены зарезервированные слова, и на их места будет вставлены данные из bib файла (библиографической базы). На основе этого шаблона будет получен bbl файл.
Например такой (с ссылкой на статью):
Код
Bash
\begin{thebibliography}{10}
\bibitem{Fivel_PRD_1970} Fivel, D. I. and Mitter, P. K. Theory of Weak Interactions without Divergences {\it Phys. Rev. D}  {\bf 1}, (1970), p.~3270--3290
и т.д.
\end{thebibliography}
 
Т.е. все ссылки на статьи оформляются согласно шаблону article, ссылки на книгу (book), согласно шаблону book и т.д.

Вобщем, сейчас разрабатываю этот формат.
Есть правда пока некоторые сложности.. но..
Если есть какие-либо идеи или замечания - welcome)
Единственное, синтаксис шаблона должен быть наиболее близок к синтаксису LaTeXа и быть наиболее интуитивно понятным)

Спасибо за внимание) В ближайшее время выложу исходники.

 





 
   


     


Название: Re: BibMake - генератор библиографических списков
Отправлено: Igors от Июнь 23, 2013, 14:59
Несколько лучше чем предыдущая попытка пополнения кладовой, но все равно - мелкотемье, мелкочленье. 


Название: Re: BibMake - генератор библиографических списков
Отправлено: Old от Июнь 23, 2013, 15:09
Несколько лучше чем предыдущая попытка пополнения кладовой, но все равно - мелкотемье, мелкочленье. 
Вы знаете, уже мало что может сравниться с эпохальным "Переходничком (http://www.prog.org.ru/topic_14795_0.html)".
После этого, все остальное в программировании "мелкотемье, мелкочленье". :)
Уж простите, не сдержался.


Название: Re: BibMake - генератор библиографических списков
Отправлено: Igors от Июнь 23, 2013, 15:35
Вы знаете, уже мало что может сравниться с эпохальным "Переходничком (http://www.prog.org.ru/topic_14795_0.html)".
После этого, все остальное в программировании "мелкотемье, мелкочленье". :)
Да, неплохая была темка :) Обычно достаточно не упомянуть известные термины, не сослаться на паттерн - и "начитавшегося" можно брать тепленьким.

Кстати у меня есть задача несколько похожая на ту что у m_ax. Вроде и просто, но как ее сделать - ясно не предствляю, а поскольку пользователи не очень настаивают - давно и лежит несделанная.

- приложение делает картинки, может одну, может серию. Было бы желательно дать возможность "подписывать" их, т.е. писать поверх текст заданный пользователем. Напр внизу картинки
Цитировать
кадр 15, время 1:07, всего 15:06   Сделал Я!
Но в отличие от задачи m_ax никаких файлов создавать нельзя, надо как-то это впихнуть в UI. И что-то я затрудняюсь с организацией и дызайном. Есть предложения?


Название: Re: BibMake - генератор библиографических списков
Отправлено: Old от Июнь 23, 2013, 15:46
Кстати у меня есть задача несколько похожая на ту что у m_ax.
Для кого это кстати, для m_ax? :)
Что-то мне подсказывает, что он не отнесет вашу задачу к "крупнотемью и крупночленью".

Как всегда постановка задачи на высоте... Вы ее не можете решить, только потому, что вы ее не можете сформулировать даже самому себе.


Название: Re: BibMake - генератор библиографических списков
Отправлено: Igors от Июнь 23, 2013, 15:57
Для кого это кстати, для m_ax? :)
Что-то мне подсказывает, что он не отнесет вашу задачу к "крупнотемью и крупночленью".
Так я и сам ее к этому не отношу  :)

Как всегда постановка задачи на высоте... Вы ее не можете решить, только потому, что вы ее не можете сформулировать даже самому себе.
Зачем "уличать" меня если я прямо говорю что не могу сфломулировать, т.е. не вижу как это сделать элегантно, удобно для юзверя.  Вот Вы и объясните/покажите как, поразите широтой размаха, концептуальностью и.т.п.  :)


Название: Re: BibMake - генератор библиографических списков
Отправлено: Old от Июнь 23, 2013, 16:03
Зачем "уличать" меня если я прямо говорю что не могу сфломулировать, т.е. не вижу как это сделать элегантно, удобно для юзверя. 
Что сделать? Вы так и не написали. :)
Для текущей постановки: на главное окно программы нужно добавить QLineEdit, в который пользователь будет набирать строку, которая будет добавляться на все картинки.


Название: Re: BibMake - генератор библиографических списков
Отправлено: m_ax от Июнь 23, 2013, 16:03
Да, неплохая была темка :) Обычно достаточно не упомянуть известные термины, не сослаться на паттерн - и "начитавшегося" можно брать тепленьким.
Вы это серьёзно? Т.е. свой, доморощенный костыль для вас всё равно будет всех милее) О чём тут можно говорить?

Цитировать
Кстати у меня есть задача несколько похожая на ту что у m_ax.

Ой, чувствую, она совсем не похожая..
 



Название: Re: BibMake - генератор библиографических списков
Отправлено: Old от Июнь 23, 2013, 16:07
Вы это серьёзно? Т.е. свой, доморощенный костыль для вас всё равно будет всех милее) О чём тут можно говорить?

"Начитавшийся" просто не в состоянии понять всю глубину этого решения... :)

Ой, чувствую, она совсем не похожая..
А я пока ничего не чувствую. :)
Но думаю, что задача про то, как для пользователя удобней задавать шаблоны.


Название: Re: BibMake - генератор библиографических списков
Отправлено: Igors от Июнь 23, 2013, 16:17
Вы это серьёзно? Т.е. свой, доморощенный костыль для вас всё равно будет всех милее) О чём тут можно говорить?
Ну напр о том как человек превращается в жалкого копировальщика чужих решений - но Вам ведь этот разговор не понравится  :)

на главное окно программы нужно добавить QLineEdit, в который пользователь будет набирать строку, которая будет добавляться на все картинки.
Там "откуда ни возьмись" появляется вагон опций

- размеры отступов
- выравнивание слева/справа
- рамка для текста, ее заливка (часто полупрозрачная)
- неск строк, вверху/внизу
- размер шрифта
- как-то намекнуть (что ли) как вводить имена переменных
и.т.д.

В общем "пришел за памперсами, купил подводную лодку". Не хочется начинать "большую возню" для скромного ф-ционала  


Название: Re: BibMake - генератор библиографических списков
Отправлено: m_ax от Июнь 23, 2013, 16:27
Вы это серьёзно? Т.е. свой, доморощенный костыль для вас всё равно будет всех милее) О чём тут можно говорить?

"Начитавшийся" просто не в состоянии понять всю глубину этого решения... :)
Точно) Жалкие копировальщики не способны к "творческому" мышлению)


Название: Re: BibMake - генератор библиографических списков
Отправлено: Old от Июнь 23, 2013, 16:31
Ну напр о том как человек превращается в жалкого копировальщика чужих решений - но Вам ведь этот разговор не понравится  :)
Про какие решения вы говорите? Что вы подразумеваете под "решением"?

Там "откуда ни возьмись" появляется вагон опций
Да вы что? Тремя сообщениями выше про про них забыли? :)

Не хочется начинать "большую возню" для скромного ф-ционала  
Тогда лучше не начинать. Оно когда еще и не хочется, вообще плохо будет получаться.



Название: Re: BibMake - генератор библиографических списков
Отправлено: Igors от Июнь 23, 2013, 16:47
Да вы что? Тремя сообщениями выше про про них забыли? :)
Ну а зачем сразу лезть со всеми подробностями? Лучше посмотреть как другие умеют работать с постановкой задачи.

Тогда лучше не начинать. Оно когда еще и не хочется, вообще плохо будет получаться.
Не то чтобы "не хочется", фича полезная, вот только не вижу как сделать компактно, поэтому и не начинаю


Название: Re: BibMake - генератор библиографических списков
Отправлено: _OLEGator_ от Июнь 23, 2013, 19:57
Igors, честно говоря ты уже замахал. В каждую тему лезешь со своими нравоучениями и жизненной позицией. Я уже не могу читать темы, где ты оставляешь свой неповторимый след, а точнее не читаю.
Может тебе отдельный форум создать? Потому что ты уже во все ветки лезешь.


Название: Re: BibMake - генератор библиографических списков
Отправлено: Igors от Июнь 23, 2013, 20:16
Igors, честно говоря ты уже замахал. В каждую тему лезешь со своими нравоучениями и жизненной позицией. Я уже не могу читать темы, где ты оставляешь свой неповторимый след, а точнее не читаю.
Может тебе отдельный форум создать? Потому что ты уже во все ветки лезешь.
Судя хоть по этой теме - единственный поучающий здесь Вы, причем довольно хамовитый  :)


Название: Re: BibMake - генератор библиографических списков
Отправлено: _Vitaliy_ от Июнь 23, 2013, 21:19
Цитировать
Если есть какие-либо идеи или замечания - welcome)
На мой взгляд необходимо отталкиваться от нормативной базы (ГОСТ, ДСТУ и тд)
На вскидку, по ДСТУ, оформление одного автора, двух, трех и более отличаются друг от друга, также как и ссылка на автореферат, статью, диссертацию, монографию и тд. и таких "шаблонов" более десятка, поэтому логичнее всего оттолкнуться от этого.
   


Название: Re: BibMake - генератор библиографических списков
Отправлено: m_ax от Июнь 23, 2013, 22:37
Цитировать
Если есть какие-либо идеи или замечания - welcome)
На мой взгляд необходимо отталкиваться от нормативной базы (ГОСТ, ДСТУ и тд)
На вскидку, по ДСТУ, оформление одного автора, двух, трех и более отличаются друг от друга, также как и ссылка на автореферат, статью, диссертацию, монографию и тд. и таких "шаблонов" более десятка, поэтому логичнее всего оттолкнуться от этого.
   

Так идея файла шаблонов как раз и заключается в том, чтобы конечный пользователь сам мог быстро составить свой шаблон в зависимости от ГОСТов, ДСТУстов или других требований к оформлению литературы.
Да, список доступных типов ссылок не маленький: (article, book, booklet, conference, inbook и т.д.). Для каждого типа ссылки будет задан свой шаблон.

Но проблема, как вы правильно заметили, заключается именно в том, что оформление списка авторов может зависеть от их числа, от типа публикации и т.д.. Взять хотя бы ГОСТ 2003 года, (от которого все плюются) и который попортил мне не мало крови, когда диссер писал..



     


Название: Re: BibMake - генератор библиографических списков
Отправлено: _Vitaliy_ от Июнь 24, 2013, 09:17
Сам сейчас кандидатский "опус" пишу, поэтому это знакомо...
По моим представлениям должно выглядеть следующим образом (проба сделать мультиславянский  :o ):
1. Выбор нормативного источника (Россия - ГОСТ, Украина - ДСТУ, Беларусь - ХЗ (просто не знаю)). 
2. Выбор типа публикации (учебник, монография, книга, ссылка на электронный ресурс и тд) -- после этого пользователю должен быть предоставлен шаблон.
3. Заполнение шаблона.
4. Вуаля.

З.Ы. Как по мне то полезно будет еще реализовать возможность составления "временного перечня литературы" по разделам.
Поясню. В процессе редактирования (вычитывания, переработки) некоторого раздела может появится необходимость, например добавить ссылку, и предыдущий перечень может "поплыть" по нумерации.
З.З.Ы. Или сразу реализовывать перечень по разделам, а в конце его объединять.
Но это просто рассуждения. 


Название: Re: BibMake - генератор библиографических списков
Отправлено: kambala от Июнь 24, 2013, 12:24
не совсем понял как в латехе/бибтехе может что-то «поплыть» — нумерация же автоматически обновляется


Название: Re: BibMake - генератор библиографических списков
Отправлено: m_ax от Июнь 24, 2013, 21:35
не совсем понял как в латехе/бибтехе может что-то «поплыть» — нумерация же автоматически обновляется
Да, если вы bibtex используете.
Но если список литературы в ручную оформляется (в самом tex файле) то нумерация ссылок в тексте будет определяться той последовательностью, которой они (ссылки) идут в секции
\begin{thebibliography}
\bibitem{tag1} ...
\bibitem{tag2} ...
...
\end{thebibliography}
И вот если после правки текста, ссылки были выкинуты, какие то новые добавлены, у каких то порядок в самом тексте изменился, то придётся в соответствии с текстом, их руками переставлять/дописывать/убирать и в самом списке литературы.. :(


Название: Re: BibMake - генератор библиографических списков
Отправлено: m_ax от Июль 01, 2013, 21:05
Опишу вкратце структуру ядра.

1) tag_extractor - класс, извлекающий из tex файлов все тэги на библиографические ссылки (\cite{tag1, tag2, tag3,  ..}) в том порядке в котором они появляются тексте. При этом tag_extractor содержит лишь  уникальные (неповторяющиеся) тэки.
пример использования:
Код
C++ (Qt)
core::tag_extractor tags;
if (tags.load_tex("text.tex")) {
   int i = 0;
   for (auto tag : tags) {
       std::cout << ++i << " " << tag << std::endl;
   }
}
 

2) класс bib_entry - содержит информацию по конкретной библиографической записи.

3) bib_parser - парсер для формата bib файлов (библиографической базы). С поддержкой перекрёстных ссылок (crossref). Пример использования:
Код
C++ (Qt)
core::bib_parser parser("bibliography.bib");
if (parser.is_load()) {
   core::bib_entry entry;
   if (parser.find_bib_entry("tag", entry)) {
       for (auto field : entry) {
           std::cout << field.first << " = " << field.second << std::endl;
       }
   }
}
 

4) authors - на основе bib-формата списка авторов принятого в bibtexe формирует список всех авторов. Т.е. фактически тоже является парсером. Пример использования:
Код
C++ (Qt)
core::authors authors("Abrikosov, A. A. and  Gorkov, L. P.");
for (auto author : authors) {
   std::cout << author.family_name() << " " << author.first_name_initial() << ".";
   for (auto mn : author.middle_names_initials()) {
       std::cout << mn << "."; // middle_names - может быть несколько.
   }    
}
 
   

5) Базовый класс для  работы с логами

6) Интерпритатор шаблонов (здесь всёже придётся писать мини язык, поскольку без конструкций условного выбора, похоже не обойтись)

7) Менеджер библиографических ссылок - фактически контейнер для bib_entry, но с возможностью сортирования их по заданному критерию + ещё некоторых плюшек.