тип (данных):

тип (данных):

В LaTeX часто используются метаданные, наиболее распространенными из которых являются:

  • \заголовок
  • \автор
  • \дата
  • \адрес

Которые в основном используются без проверки действительности.

Существует ли пакет, который позволял бы определять другие записи метаданных и использовать значения в документах, а также, возможно, определять тесты и проверять значения записей?

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

решение1

Как упоминалось в комментариях, вопрос довольно недоопределен. Однако относительно легко написать своего рода «тестовый набор» для метаданных. Команды и \titleт \author. д. записывают свои аргументы во внутренние макросы и т. д. Вы можете проверить значения этих внутренних макросов \@title, \@authorнапример, с помощью регулярных выражений. Хотя это ни в коем случае не лучший и не самый простой способ выполнения таких проверок, он может служить доказательством концепции.

Однако следует отметить, что в общем случае большая часть ввода должна быть допустима в этих полях. Для игрушечного примера ниже я определил некоторые правила, но для каждого из них довольно легко представить ситуацию, когда нарушение правила было бы разумным. Я думаю, что это не ограничение моих игрушечных правил как таковых, для любого правила, которое вы могли бы придумать, есть исключения.

Теперь код. Сначала он определяет \addressаналог с \title(т.е. сохраняет аргумент в \@address), поскольку эта команда не определена по умолчанию в articleклассе.

Затем он устанавливает некоторые сообщения для отображения во время проверок. После этого внутренние макросы копируются в списки токенов и используются в качестве входных данных для регулярных выражений.

Остальной код — это общие административные вещи: по какой-то причине \regex_matchне принимает список токенов.переменнаяно только список токенов напрямую, поэтому нужно создать вариант. Я попытался разделить код пакета и пользовательские команды и поместить все в файл .sty.

Файл metadatacheck.sty:

\ProvidesPackage{metadatacheck}[2024/01/07 v0.1 Regex Check on Metadata]
\newcommand{\address}[1]{\gdef\@address{#1}}

\ExplSyntaxOn
\prg_generate_conditional_variant:Nnn \regex_match:nn {nV} {T,F,TF}
\msg_new:nnnn{metadatacheck}{titleok}{Title~check~OK}{}
\msg_new:nnnn{metadatacheck}{authorok}{Author~check~OK}{}
\msg_new:nnnn{metadatacheck}{dateok}{Date~check~OK}{}
\msg_new:nnnn{metadatacheck}{addressok}{Address~check~OK}{}

\msg_new:nnnn{metadatacheck}{titleerr}{Title~does~not~start~with~upper~case}{}
\msg_new:nnnn{metadatacheck}{authorerr}{Author~cannot~have~numbers}{}
\msg_new:nnnn{metadatacheck}{dateerr}{Date~does~not~include~4-digit~year}{}
\msg_new:nnnn{metadatacheck}{addresserr}{Address~too~short~(5~characters~minimum)}{}

\cs_new:Nn \check_meta_data: {
\tl_set:Nx \l_title_tl {\@title}
\tl_set:Nx \l_author_tl {\@author}
\tl_set:Nx \l_date_tl {\@date}
\tl_set:Nx \l_address_tl {\@address}

\regex_match:nVTF{\A[A-Z]}{\l_title_tl}{\msg_note:nn{metadatacheck}{titleok}}{\msg_warning:nn{metadatacheck}{titleerr}}
\regex_match:nVTF{\A[^0-9]+\Z}{\l_author_tl}{\msg_note:nn{metadatacheck}{authorok}}{\msg_warning:nn{metadatacheck}{authorerr}}
\regex_match:nVTF{\d{4}}{\l_date_tl}{\msg_note:nn{metadatacheck}{dateok}}{\msg_warning:nn{metadatacheck}{dateerr}}
\regex_match:nVTF{.{5}}{\l_address_tl}{\msg_note:nn{metadatacheck}{addressok}}{\msg_warning:nn{metadatacheck}{addresserr}}
}
\NewDocumentCommand{\CheckMetaData}{ }
{
\check_meta_data:
}
\ExplSyntaxOff

Пользовательский документ:

\documentclass{article}
\usepackage{metadatacheck}
\title{my Title}
\author{Alic3 Sm1th}
\date{Christmas '23}
\address{23 Mulholland Drive}
\CheckMetaData

\begin{document}
\maketitle
\end{document}

Результат (в терминале и файле журнала):

Package metadatacheck Warning: Title does not start with upper case

Package metadatacheck Warning: Author cannot have numbers

Package metadatacheck Warning: Date does not include 4-digit year

Package metadatacheck Info: Address check OK

Конечно, это можно расширить, позволив пользователю предоставлять регулярные выражения и сообщения либо через команды документа, либо с помощью файла конфигурации.

решение2

В настоящее время на ctan доступен как минимум один пакет, разработанный Скоттом Пакинымhttps://ctan.org/pkg/hyperxmp?lang=en гиперксмпможет сделать то, что просит ОП, и будет хорошей отправной точкой, если возникнет необходимость в его расширении.

В комментариях было предложено, чтобы спецификация была написана до начала любой разработки. Я также предоставил ссылку на спецификацию Adobe, которая, по моему мнению, является хорошим примером. Во многих случаях можно использовать просто перечисленные списки и таблицы. Наиболее важной частью, по моему мнению, является область действия программы. В контексте вопроса она должна отвечать на вопрос, какое программное обеспечение, как ожидается, будет читать эту информацию, учитывая, что метаданные являются интерфейсами для обмена информацией между различными программами. После того, как спецификация написана, можно разработать функции проверки. Следует позаботиться о том, чтобы охватить различные системы записи и кодировки, если это необходимо.

Пример проверки данных для дат, соответствующих требованиям пакета LaTeX, можно найти в листингах l3doc, написанных с использованием слоя программирования l3. Чудо акробатики программирования l3!

Хочу предупредить, что веб-разработка прошла через похожие этапы развития, но такие онтологии не смогли по-настоящему завоевать популярность, поскольку поиск совершенствовался, а теперь, с появлением степеней LLM, они могут вообще исчезнуть. Но это всего лишь мое мнение, и я не хочу вас отговаривать.

решение3

Это не совсем ответ, но спецификации, заданные Ульрике Фишер в комментариях выше. Они все еще в зачаточном состоянии, и мы отредактируем их соответствующим образом.

Метаданные пакета будут определять и позволять использовать и проверять записи метаданных.

Чтобы определить новую запись, используйте:

\definemetadataentry[type=
                     format=yyyy-mm-dd,
                     lower_range=0001-01-01,
                     upper_range=9999-12-31,
                     finite_range=,
                     default_value=,
                     optional/required,
                     validation_routine=,
                     hierarchy=
                    ]{name_of_metadata_entry}

где:

тип (данных):

Возможно:

  • ЧИСЛОВОЕ (ЦЕЛОЕ ИЛИ ДЕСЯТИЧНОЕ)
  • СТРОКА СИМВОЛОВ
  • ДАТАВРЕМЯ

формат:

Укажите формат только что определенного типа данных.

нижний_диапазон=0001-01-01:

верхний_диапазон=9999-12-31:

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

Пример диапазона для набора дат: от 0001-01-01 до 9999-12-31

конечный_диапазон:

Определяет диапазон данных, которые можно легко перечислить в полном объеме.

значение по умолчанию:

Значение, которое по умолчанию используется для записи метаданных, если оно не определено.

необязательно/обязательно:

Определяет, является ли конкретная запись метаданных обязательной или необязательной в области, которая ее определяет.

процедура_проверки (внешняя):

Вызов внешней процедуры, проверяющей запись.

иерархия:

Элемент, определенный рекурсивно в терминах другой, ранее определенной записи метаданных.

Определения и примеры использования

Типы данных:

Необходимо учитывать 3 типа данных:

  • ЧИСЛОВОЕ (ЦЕЛОЕ ИЛИ ДЕСЯТИЧНОЕ)
  • СТРОКА СИМВОЛОВ
  • ДАТАВРЕМЯ

Формат даты:

ДАТА: Формат: ГГГГ-ММ-ДД ДАТАВРЕМЯ: Формат: ГГГГ-ММ-ДД ЧЧ:МИ:СС

Формат даты может быть разных типов, например: «дд-мм-гггг», «гггг-мм-дд», «мм-дд-гггг».

Назовем 10 наиболее используемых форматов: с кратким обозначением столетия (гг) и с длинным обозначением столетия (гггг).

  • США: мм/дд/гг и мм/дд/гггг
  • ANSI: гг.мм.дд и гггг.мм.дд
  • Британский/французский: дд/мм/гг и дд/мм/гггг
  • Немецкий: дд.мм.гг и дд.мм.гггг
  • Япония: гг/мм/дд и гггг/мм/дд
  • ISO: ггммдд и ггггммдд
  • Европа по умолчанию + миллисекунды: дд пн гггг чч:ми:сс:ммм (24ч)
  • Хиджра: дд/мм/гггг чч:ми:сс:мммAM
RequirePackage{metadata}
\definemetadataentry[type=DATETIME,
                     format=yyyy-mm-dd,
                     lower_range=0001-01-01,
                     upper_range=9999-12-31
                     default_value=2000-12-31,
                     optional,
                     validation_routine=/usr/local/texlive2024/bin/abc.lua,
                    ]{date_of_publication}

\definemetadataentry[type=DECIMAL,
                     fomat=(8,6),
                    ]{latitude}

\definemetadataentry[type=DECIMAL,
                     format=(9,6),
                    ]{llongitude}

\definemetadataentry[type=CHARACTERSTRING]{email}

\definemetadataentry[type=CHARACTERSTRING]{url}

\definemetadataentry[type=NUMERIC,
                     format=integer,
                     lower-range=1,
                     upper-range=9999,
                    ]{volume_number}

\definemetadataentry[type=CHARACTERSTRING(2),
                     range={US,MX,CA,GT,HT,CU,HN,...},
                    ]{north_american_country}

Иерархия метаданных.

\definemetadataentry[type=CHARACTERSTRING(2),
                     required,
                    ]{country}

\definemetadataentry[type=CHARACTERSTRING(10),
                     hierarchy=country,
                    ]{zipcode}

Пример использования:

\zipcode[BR]{22430-085}
\zipcode[US]{91106-3840}
\zipcode[CA]{K1A 0T6}
\zipcode[DE]{13057}
\zipcode[IR]{81599-95950}
\definemetadataentry[type=CHARACTERSTRING(2),
                     required,
                    ]{decade}

\definemetadataentry[type=CHARACTERSTRING(10),
                     hierarchy=decade,
                    ]{msc}

Пример использования:

\msc[2010]{76B75}
\msc[2020]{76D55}
\definemetadataentry[type=CHARACTERSTRING(100),
                     required,
                    ]{full_name}

\definemetadataentry[type=CHARACTERSTRING(30),
                     hierarchy=full_name,
                    ]{last_name}

Пример использования:

\full_name{John Ewing}
\last_name{Ewing}

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