tipo (de dados):

tipo (de dados):

No LaTeX usa-se metadados com frequência, sendo os mais comuns:

  • \título
  • \autor
  • \data
  • \endereço

Que são usados ​​​​principalmente sem verificação de validade.

Existe um pacote que permitiria definir outras entradas de metadados e usar os valores em documentos e possivelmente definir testes e verificar os valores das entradas?

Parece que tal pacote seria extremamente útil para expandir o uso de metadados, permitindo a definição de hierarquias de dados dentro e acima de tudo permitindo testes.

Responder1

Conforme mencionado nos comentários, a questão é bastante subespecificada. No entanto, é relativamente fácil escrever uma espécie de "conjunto de testes" para os metadados. Os comandos \title, \authoretc. escrevem seus argumentos nas macros internas \@title, \@authoretc. Você pode inspecionar os valores dessas macros internas, por exemplo, com expressões regulares. Embora esta não seja de forma alguma a melhor ou mais fácil maneira de realizar tais verificações, pode servir como uma prova de conceito.

Note-se, contudo, que, no caso geral, a maior parte das informações devem ser permitidas nestes campos. Para o exemplo do brinquedo abaixo, defini algumas regras, mas é bastante fácil para cada uma delas imaginar uma situação em que quebrar a regra seria razoável. Acho que isso não é uma limitação das minhas regras de brinquedos como tal, pois qualquer regra que você possa criar há exceções.

Agora, para o código. Primeiro ele define \addressanálogo \title(ou seja, armazenando o argumento em \@address), porque este comando não é definido por padrão na articleclasse.

Em seguida, ele define algumas mensagens para serem exibidas durante as verificações. Posteriormente, as macros internas são copiadas em listas de tokens e usadas como entrada para as expressões regulares.

O restante do código é administrativo geral: por algum motivo, \regex_matchnão aceita uma lista de tokensvariávelmas apenas uma lista de tokens diretamente, portanto, uma variante precisa ser criada. Tentei separar o código do pacote e os comandos do usuário e coloquei tudo em um .styarquivo.

Arquivo 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 do usuário:

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

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

Resultado (no terminal e arquivo de log):

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

É claro que isso poderia ser estendido ainda mais, permitindo ao usuário fornecer as expressões regulares e as mensagens, seja por meio de comandos de documento ou talvez com um arquivo de configuração.

Responder2

Atualmente, pelo menos um pacote disponível no ctan desenvolvido por Scott Pakinhttps://ctan.org/pkg/hyperxmp?lang=en hiperxmppode fazer o que o OP está solicitando e seria um bom ponto de partida, se houver necessidade de estendê-lo.

Nos comentários foi sugerido que uma especificação fosse escrita primeiro, antes de qualquer trabalho de desenvolvimento ser realizado. Também forneci um link para a especificação da Adobe, que considero um bom exemplo. Em muitos casos, apenas listas e tabelas enumeradas podem ser usadas. A parte mais importante, na minha opinião, é o escopo do programa. No contexto da questão, deve-se responder quais softwares devem ler essas informações, visto que os metadados são interfaces para a troca de informações entre diferentes programas. Depois que a especificação for escrita, as funções de validação podem ser desenvolvidas. Deve-se tomar cuidado para abranger diferentes sistemas de escrita e codificações, conforme necessário.

Um exemplo de validação de dados para datas em conformidade com os requisitos do pacote LaTeX pode ser encontrado nas listagens l3doc, escritas usando a camada de programação l3. Uma maravilha das acrobacias de programação l3!

Apenas uma palavra de cautela: o desenvolvimento web passou por estágios semelhantes de desenvolvimento, mas tais ontologias não conseguiram realmente pegar, à medida que a pesquisa se tornou melhor e agora com LLMs elas podem desaparecer completamente, mas esta é apenas minha opinião e não pretende desencorajá-lo .

Responder3

Esta não é exatamente uma resposta, mas sim as especificações solicitadas por Ulrike Fischer nos comentários acima. Ainda está em forma embrionária e iremos editá-lo de acordo.

Os metadados do pacote definirão e permitirão o uso e validação de entradas de metadados.

Para definir uma nova entrada use:

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

onde:

tipo (de dados):

Pode ser:

  • NUMÉRICO (INTEIRO ou DECIMAL)
  • CADEIA DE CARACTERES
  • DATA HORA

formatar:

Forneça o formato do tipo de dados que acabamos de definir.

intervalo_inferior=0001-01-01:

intervalo_superior=9999-12-31:

Define o intervalo inferior e superior de dados que são contínuos ou muito longos para serem listados por completo.

Exemplo de intervalo para um conjunto de datas: 0001-01-01 a 9999-12-31

intervalo_finito:

Define o intervalo de dados que pode ser facilmente listado por completo.

valor padrão:

O valor padrão de uma entrada de metadados, se não for definido.

opcional/obrigatório:

Define se uma determinada entrada de metadados é obrigatória ou opcional dentro do domínio que a define.

validação_routine (externa):

Uma chamada para uma rotina externa que valida a entrada.

hierarquia:

Um elemento definido recusivamente em termos de outra entrada de metadados previamente definida.

Definições e exemplo de uso

Tipos de dados:

Existem 3 tipos de dados a serem considerados:

  • NUMÉRICO (INTEIRO ou DECIMAL)
  • CADEIA DE CARACTERES
  • DATA HORA

Formato de data:

DATA: Formato: AAAA-MM-DD DATETIME: Formato: AAAA-MM-DD HH:MI:SS

O formato da data pode ser de diferentes tipos, como: 'dd-mm-aaaa', 'aaaa-mm-dd', 'mm-dd-aaaa'.

Para citar os 10 formatos mais utilizados, com século curto (aa) e com século longo (aaaa).

  • EUA: mm/dd/aa e mm/dd/aaaa
  • ANSI: aa.mm.dd e aaaa.mm.dd
  • Britânico/Francês: dd/mm/aa e dd/mm/aaaa
  • Alemão: dd.mm.aa e dd.mm.aaaa
  • Japão: aa/mm/dd e aaaa/mm/dd
  • ISO: aaaammdd e aaaammdd
  • Padrão da Europa + milissegundos: dd mon yyyy 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}

Hierarquia de metadados.

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

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

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

Exemplo de uso:

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

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

Exemplo de uso:

\full_name{John Ewing}
\last_name{Ewing}

informação relacionada