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 \title
usw. \author
schreiben ihre Argumente in die internen Makros \@title
usw. \@author
Sie 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 \address
analog 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_match
akzeptiert 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 .sty
Datei 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}