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
, \author
etc. escrevem seus argumentos nas macros internas \@title
, \@author
etc. 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 \address
análogo \title
(ou seja, armazenando o argumento em \@address
), porque este comando não é definido por padrão na article
classe.
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_match
nã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 .sty
arquivo.
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}