Typ (der Daten):

Typ (der Daten):

In LaTeX werden häufig Metadaten verwendet. Am häufigsten sind:

  • \Titel
  • \Autor
  • \Datum
  • \Adresse

Die meist ohne Gültigkeitsprüfung verwendet werden.

Gibt es ein Paket, mit dem man weitere Metadateneinträge definieren und die Werte in Dokumenten verwenden und möglicherweise Tests definieren und die Werte der Einträge überprüfen kann?

Es scheint, dass ein solches Paket äußerst nützlich wäre, um die Verwendung von Metadaten zu erweitern, indem es die Definition von Datenhierarchien und vor allem Tests ermöglicht.

Antwort1

Wie in den Kommentaren erwähnt, ist die Frage eher unzureichend spezifiziert. Es ist jedoch relativ einfach, eine Art „Testsuite“ für die Metadaten zu schreiben. Die Befehle \titleusw. \authorschreiben ihre Argumente in die internen Makros \@titleusw. \@authorSie können die Werte dieser internen Makros beispielsweise mit regulären Ausdrücken überprüfen. Dies ist zwar keineswegs die beste oder einfachste Möglichkeit, solche Prüfungen durchzuführen, kann jedoch als Proof of Concept dienen.

Beachten Sie jedoch, dass im Allgemeinen die meisten Eingaben in diesen Feldern zulässig sein sollten. Für das Spielzeugbeispiel unten habe ich einige Regeln definiert, aber es ist für jeden von ihnen ziemlich einfach, sich eine Situation vorzustellen, in der es sinnvoll wäre, die Regel zu brechen. Ich denke, das ist keine Einschränkung meiner Spielzeugregeln als solche, denn für jede Regel, die Sie sich ausdenken könnten, gibt es Ausnahmen.

Nun zum Code. Zunächst wird \addressanalog zu definiert \title(also das Argument in gespeichert \@address), da dieser Befehl in der Klasse nicht standardmäßig definiert ist article.

Anschließend legt es einige Meldungen fest, die während der Prüfungen angezeigt werden sollen. Anschließend werden die internen Makros in Tokenlisten kopiert und als Eingabe für die regulären Ausdrücke verwendet.

Der Rest des Codes ist allgemeines Verwaltungskram: \regex_matchakzeptiert aus irgendeinem Grund keine TokenlisteVariablesondern nur eine Tokenliste direkt, daher muss eine Variante erstellt werden. Ich habe versucht, Paketcode und Benutzerbefehle zu trennen und alles in eine .styDatei zu packen.

Datei 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

Benutzerdokument:

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

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

Ergebnis (im Terminal und in der Protokolldatei):

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

Dies könnte natürlich noch weiter ausgebaut werden, indem dem Benutzer ermöglicht wird, die regulären Ausdrücke und die Nachrichten entweder über Dokumentbefehle oder vielleicht mit einer Konfigurationsdatei bereitzustellen.

Antwort2

Zur Zeit ist mindestens ein Paket bei ctan verfügbar, entwickelt von Scott Pakinhttps://ctan.org/pkg/hyperxmp?lang=en hyperxmpkann die Anforderungen des OP erfüllen und wäre ein guter Ausgangspunkt, falls eine Erweiterung erforderlich ist.

In den Kommentaren wurde vorgeschlagen, dass zuerst eine Spezifikation geschrieben wird, bevor mit der Entwicklungsarbeit begonnen wird. Ich habe auch einen Link zur Adobe-Spezifikation bereitgestellt, die meiner Meinung nach ein gutes Beispiel ist. In vielen Fällen können einfach aufgezählte Listen und Tabellen verwendet werden. Der wichtigste Teil ist meiner Meinung nach der Umfang des Programms. Im Kontext der Frage muss beantwortet werden, welche Software diese Informationen lesen soll, da Metadaten Schnittstellen für den Informationsaustausch zwischen verschiedenen Programmen sind. Sobald die Spezifikation geschrieben ist, können die Validierungsfunktionen entwickelt werden. Es sollte darauf geachtet werden, bei Bedarf verschiedene Schriftsysteme und Kodierungen abzudecken.

Ein Beispiel für die Datenvalidierung für Datumsangaben, die den Anforderungen des LaTeX-Pakets entsprechen, finden Sie in den L3doc-Auflistungen, die mit der L3-Programmierebene geschrieben wurden. Ein Wunderwerk der L3-Programmierakrobatik!

Nur ein Wort der Warnung: Die Webentwicklung hat ähnliche Entwicklungsstadien durchlaufen, aber solche Ontologien konnten sich nicht richtig durchsetzen, da die Suche besser wurde und sie jetzt mit LLMs möglicherweise ganz verschwinden. Das ist aber nur meine Meinung und soll Sie nicht entmutigen.

Antwort3

Dies ist nicht direkt eine Antwort, sondern die von Ulrike Fischer in den obigen Kommentaren geforderten Spezifikationen. Es ist noch im Anfangsstadium und wir werden es entsprechend bearbeiten.

Die Paketmetadaten definieren und ermöglichen die Verwendung und Validierung von Metadateneinträgen.

Um einen neuen Eintrag zu definieren, verwenden Sie:

\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}

Wo:

Typ (der Daten):

Kann sein:

  • NUMERISCH (INTEGER oder DEZIMAL)
  • ZEICHENKETTE
  • TERMINZEIT

Format:

Geben Sie das Format des gerade definierten Datentyps an.

unterer_Bereich=0001-01-01:

oberer_Bereich=9999-12-31:

Definiert den unteren und oberen Datenbereich, der entweder kontinuierlich ist oder zu lang ist, um vollständig aufgelistet zu werden.

Beispiel für einen Bereich für einen Datumssatz: 01.01.0001 bis 31.12.9999

endlicher_Bereich:

Definiert den Datenbereich, der problemlos vollständig aufgelistet werden kann.

Standardwert:

Der Wert, der standardmäßig für einen Metadateneintrag verwendet wird, wenn er nicht definiert ist.

optional/erforderlich:

Definiert, ob ein bestimmter Metadateneintrag innerhalb des Bereichs, der ihn definiert, erforderlich oder optional ist.

Validierungsroutine (extern):

Ein Aufruf einer externen Routine, die die Eingabe validiert.

Hierarchie:

Ein Element, das rekursiv in Bezug auf einen anderen, zuvor definierten Metadateneintrag definiert ist.

Definitionen und Anwendungsbeispiele

Arten von Daten:

Es müssen drei Arten von Daten berücksichtigt werden:

  • NUMERISCH (INTEGER oder DEZIMAL)
  • ZEICHENKETTE
  • TERMINZEIT

Datumsformat:

DATUM: Format: JJJJ-MM-TT DATUM UHRZEIT: Format: JJJJ-MM-TT HH:MI:SS

Das Datumsformat kann verschiedene Typen haben, beispielsweise: „tt-mm-jjjj“, „jjjj-mm-tt“, „mm-tt-jjjj“.

Hier sind die 10 am häufigsten verwendeten Formate: mit kurzem Jahrhundert (yy) und mit langem Jahrhundert (yyyy).

  • USA: tt/mm/jj & tt/mm/jjjj
  • ANSI: jj.mm.tt und jjjj.mm.tt
  • Britisch/Französisch: tt/mm/jj & tt/mm/jjjj
  • Deutsch: tt.mm.jj & tt.mm.jjjj
  • Japan: jj/mm/tt und jjjj/mm/tt
  • ISO: jjmmtt und jjjjmmtt
  • Europa-Standard + Millisekunden: tt mon jjjj hh:mi:ss:mmm (24h)
  • Hijri: tt/mm/jjjj hh:mi:ss:mmmAM
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}

Hierarchie der Metadaten.

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

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

Anwendungsbeispiel:

\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}

Anwendungsbeispiel:

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

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

Anwendungsbeispiel:

\full_name{John Ewing}
\last_name{Ewing}

verwandte Informationen