Автоматическая сортировка сред по параметрам (например, по дате)

Автоматическая сортировка сред по параметрам (например, по дате)

Я хочу какую-то простую систему для манипулирования "разделами" или средами на основе дополнительных данных, таких как даты. Я сделал предварительный поиск в 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}

Связанный контент