tipo (de datos):

tipo (de datos):

En LaTeX se utilizan metadatos con frecuencia, siendo los más comunes:

  • \título
  • \autor
  • \fecha
  • \DIRECCIÓN

Que se utilizan principalmente sin control de validez.

¿Existe algún paquete que permita definir otras entradas de metadatos y utilizar los valores en documentos y posiblemente definir pruebas y verificar los valores de las entradas?

Parece que un paquete de este tipo sería extremadamente útil para ampliar el uso de metadatos, permitiendo la definición de jerarquías de datos dentro y, sobre todo, permitiendo pruebas.

Respuesta1

Como se menciona en los comentarios, la pregunta está bastante poco especificada. Sin embargo, es relativamente fácil escribir una especie de "conjunto de pruebas" para los metadatos. Los comandos \title, \authoretc. escriben sus argumentos en las macros internas \@title, \@authoretc. Puede inspeccionar los valores de estas macros internas, por ejemplo, con expresiones regulares. Si bien esta no es de ninguna manera la mejor ni la más sencilla forma de realizar dichas comprobaciones, puede servir como prueba de concepto.

Sin embargo, tenga en cuenta que, en el caso general, la mayoría de las entradas deberían estar permitidas en estos campos. Para el siguiente ejemplo de juguete, he definido algunas reglas, pero es bastante fácil para cada una de ellas imaginar una situación en la que romper la regla sería razonable. Creo que eso no es una limitación de mis reglas sobre juguetes como tal, ya que cualquier regla que se te ocurra tiene excepciones.

Ahora el código. Primero define \addressalgo análogo a \title(es decir, almacena el argumento en \@address), porque este comando no está definido de forma predeterminada en la articleclase.

Luego configura algunos mensajes para mostrar durante las comprobaciones. Luego, las macros internas se copian en listas de tokens y se utilizan como entrada para las expresiones regulares.

El resto del código es material administrativo general: por alguna razón \regex_matchno acepta una lista de tokensvariablepero solo una lista de tokens directamente, por lo que es necesario crear una variante. Intenté separar el código del paquete y los comandos del usuario y puse todo en un .styarchivo.

Archivo 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

Documento de usuario:

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

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

Resultado (en terminal y archivo de registro):

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

Por supuesto, esto podría ampliarse aún más permitiendo al usuario proporcionar las expresiones regulares y los mensajes, ya sea mediante comandos de documento o tal vez con un archivo de configuración.

Respuesta2

Actualmente al menos un paquete disponible en ctan desarrollado por Scott Pakinhttps://ctan.org/pkg/hyperxmp?lang=en hiperxmppuede hacer lo que solicita el OP y sería un buen punto de partida, si es necesario ampliarlo.

En los comentarios se sugirió que primero se escriba una especificación antes de realizar cualquier trabajo de desarrollo. También proporcioné un enlace a la especificación de Adobe, que creo que es un buen ejemplo. En muchos casos se pueden utilizar simplemente listas y tablas enumeradas. La parte más importante, en mi opinión, es el alcance del programa. En el contexto de la pregunta, se debe responder qué software se espera que lea esta información, dado que los metadatos son interfaces para el intercambio de información entre diferentes programas. Una vez escrita la especificación, se pueden desarrollar las funciones de validación. Se debe tener cuidado de cubrir diferentes sistemas de escritura y codificaciones, según sea necesario.

Se puede encontrar un ejemplo de validación de datos para fechas que cumplen con los requisitos del paquete LaTeX en los listados de l3doc, escritos utilizando la capa de programación l3. ¡Una maravilla de acrobacias de programación l3!

Solo una advertencia: el desarrollo web pasó por etapas de desarrollo similares, pero tales ontologías no lograron ponerse de moda, a medida que la búsqueda mejoró y ahora con los LLM podrían desaparecer por completo, pero esta es solo mi opinión y no pretende desanimarlo. .

Respuesta3

Esta no es exactamente una respuesta, sino las especificaciones solicitadas por Ulrike Fischer en los comentarios anteriores. Todavía está en forma embrionaria y lo editaremos en consecuencia.

Los metadatos del paquete definirán y permitirán el uso y la validación de las entradas de metadatos.

Para definir un nuevo uso de entrada:

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

dónde:

tipo (de datos):

Puede ser:

  • NUMÉRICO (ENTERO o DECIMAL)
  • CADENA DE CARACTERES
  • FECHA Y HORA

formato:

Proporcione el formato del tipo de datos recién definido.

rango_inferior=0001-01-01:

rango_superior=9999-12-31:

Define el rango inferior y superior de datos que son continuos o demasiado largos para enumerarse en su totalidad.

Ejemplo de rango para un conjunto de fechas: 0001-01-01 a 9999-12-31

rango_finito:

Define el rango de datos que se pueden enumerar fácilmente en su totalidad.

valor por defecto:

El valor predeterminado de una entrada de metadatos, si no está definido.

opcional/obligatorio:

Define si una entrada de metadatos particular es obligatoria u opcional dentro del ámbito que la define.

rutina_validación (externa):

Una llamada a una rutina externa que valida la entrada.

jerarquía:

Un elemento definido de forma recursiva en términos de otra entrada de metadatos previamente definida.

Definiciones y ejemplos de uso

Tipos de datos:

Hay 3 tipos de datos a considerar:

  • NUMÉRICO (ENTERO o DECIMAL)
  • CADENA DE CARACTERES
  • FECHA Y HORA

Formato de fecha:

FECHA: Formato: AAAA-MM-DD FECHA HORA: Formato: AAAA-MM-DD HH:MI:SS

El formato de fecha puede ser de diferentes tipos, como: 'dd-mm-aaaa', 'aaaa-mm-dd', 'mm-dd-aaaa'.

Por mencionar los 10 formatos más utilizados, con siglo corto (yy) y con siglo largo (yyyy).

  • EE. UU.: dd/mm/aa y dd/mm/aaaa
  • ANSI: aa.mm.dd y aaaa.mm.dd
  • Británico/francés: dd/mm/aa y dd/mm/aaaa
  • Alemán: dd.mm.aa y dd.mm.aaaa
  • Japón: aa/mm/dd y aaaa/mm/dd
  • ISO: aammdd y aaaammdd
  • Predeterminado en Europa + milisegundos: dd lun aaaa hh:mi:ss:mmm (24h)
  • Hijri: dd/mm/aaaa 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}

Jerarquía de metadatos.

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

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

Ejemplo de uso:

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

Ejemplo de uso:

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

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

Ejemplo de uso:

\full_name{John Ewing}
\last_name{Ewing}

información relacionada