Я хочу какую-то простую систему для манипулирования "разделами" или средами на основе дополнительных данных, таких как даты. Я сделал предварительный поиск в Google и не смог ничего придумать, потому что не могу выразить это словами, но я постараюсь сделать все возможное, чтобы сформировать пример. Я не уверен, позволяет ли LaTeX вообще это, поскольку я могу сравнить его только с bibtex.
Я хочу иметь возможность иметь «записи» или «разделы» во многом похожие на стиль журнала, которые имеют аргумент для «даты» или некоторых других критериев, по которым они могут быть отсортированы. Некоторый псевдокод:
\begin{entry}{1928}{3}{28}
This is an entry.
\end{entry}
\begin{entry}{1777}{4}{30}
This is another entry, but dated before the last one.
\end{entry}
Цель тогда будет в том, чтобы при компиляции записи были автоматически отсортированы по дате. То есть вторая запись (как она появляется в коде) будет появляться перед первой.
Есть ли какая-нибудь библиотека или что-то еще, что помогло бы выполнить эту задачу? Это похоже на то, как сортирует bibtex, несмотря на порядок кода. Все, что близко к этому, также приветствуется, независимо от того, работает ли это через секционирование или окружение. Цель состоит в том, чтобы сортировать по какому-то "тегу", например, по дате. Любые советы приветствуются, спасибо!
решение1
Чтобы изменить порядок некоторых похожих разделов, я бы создал поддокументы как 19280328.tex
, 17770430.tex
и т.д., а затем вставил бы в основной документ с помощью
\input{19280328}
\input{17770430}
...
Тогда любой хороший редактор сможет быстро сократить это в правильном порядке.
В случае небольших записей, которые необходимо отобразить в виде описания среды, одним из вариантов может быть пакет nomencl
:
\documentclass{article}
\usepackage{nomencl}
\makenomenclature
\def\nomname{Cronology}
\begin{document}
\nomenclature{1928/03/28}{This is an entry.}
\nomenclature{1777/04/30}{This is another entry, but dated before the last one.}
\settowidth{\nomlabelwidth}{0000/00/00xx}
\printnomenclature
\end{document}
Обратите внимание, что после сохранения этого файла, чтобы test.tex,
скомпилировать его, вам следует выполнить:
pdflatex test.tex
makeindex test.nlo -s nomencl.ist -o test.nls
pdflatex test.tex
pdflatex test.tex # really not needed for this simple example
решение2
Вы можете использоватьdatatool
для хранения, сортировки и печати записей журнала.
Поскольку вы используете разумное представление ГГГГ-ММ-ДД для дат, я объединил их в одно поле, называемое date
внутри journal
базы данных. Сортировка достигается с помощью \DTLsort{date}{journal}
, после чего печать выполняется циклическим обходом базы данных с помощью \DTLforeach
.
\documentclass{article}
\usepackage{datatool,environ}
\dtlexpandnewvalue
\NewEnviron{entry}[1]{%
\DTLnewrow{journal}% Add new row to database
\DTLnewdbentry{journal}{date}{#1}% Add date entry
\DTLnewdbentry{journal}{entry}{\BODY}% Add entry body
}
\DTLnewdb{journal}
\newcommand{\printentries}{%
\section*{Journal}
\DTLsort{date}{journal}%
\DTLforeach{journal}{%
\entrydate=date,
\entrybody=entry%
}{%
\subsection*{\entrydate}
\entrybody
}
}
\begin{document}
\begin{entry}{2018-01-02}
This is an entry.
\end{entry}
\begin{entry}{2017-01-05}
This is another entry.
\end{entry}
\printentries
\end{document}
Обратите внимание, что если записи будут содержать абзацы, вам придется использовать \DTLpar
вместо пустых строк/переносы строк. Например,
\begin{entry}{1234-56-78}
First paragraph.
\DTLpar
Second paragraph.
\end{entry}