LaTeX ではメタデータが頻繁に使用されますが、最も一般的なものは次のとおりです。
- \タイトル
- \著者
- \日付
- \住所
ほとんどの場合、有効性チェックなしで使用されます。
メタデータの他のエントリを定義し、ドキュメント内の値を使用し、テストを定義してエントリの値を確認できるパッケージはありますか?
このようなパッケージは、メタデータの使用を拡大し、データの階層の定義を可能にし、何よりもテストを可能にする上で非常に役立つと思われます。
答え1
コメントで述べたように、この質問はむしろ詳細が不十分です。ただし、メタデータの「テスト スイート」のようなものを書くのは比較的簡単です。コマンドなどは\title
、\author
引数を内部マクロなどに書き込みます\@title
。\@author
たとえば、正規表現を使用して、これらの内部マクロの値を検査できます。これは決してこのようなチェックを実行するための最良または最も簡単な方法ではありませんが、概念実証として役立ちます。
ただし、一般的には、これらのフィールドではほとんどの入力が許可されることに注意してください。以下のおもちゃの例では、いくつかのルールを定義しましたが、ルールを破ることが合理的である状況を想像するのはそれぞれにとってかなり簡単です。これは私のおもちゃのルール自体の制限ではないと思います。あなたが思いつく可能性のあるどのルールにも例外があります。
さて、コードです。まず、\address
と同様にを定義します\title
(つまり、引数を に格納します\@address
)。このコマンドはクラスでデフォルトで定義されていないためですarticle
。
次に、チェック中に表示されるいくつかのメッセージを設定します。その後、内部マクロがトークン リストにコピーされ、正規表現の入力として使用されます。
残りのコードは一般的な管理用です。何らかの理由で\regex_match
トークンリストを受け入れません。変数ただし、直接トークン リストのみなので、バリアントを作成する必要があります。パッケージ コードとユーザー コマンドを分離し、すべてを 1 つの.sty
ファイルにまとめることにしました。
ファイル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
ユーザードキュメント:
\documentclass{article}
\usepackage{metadatacheck}
\title{my Title}
\author{Alic3 Sm1th}
\date{Christmas '23}
\address{23 Mulholland Drive}
\CheckMetaData
\begin{document}
\maketitle
\end{document}
結果(ターミナルとログファイル内):
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
もちろん、ドキュメント コマンドまたは構成ファイルを使用して、ユーザーが正規表現とメッセージを提供できるようにすることで、これをさらに拡張することもできます。
答え2
現在、スコット・パキンが開発したctanで利用可能なパッケージが少なくとも1つあります。https://ctan.org/pkg/hyperxmp?lang=en ハイパーXMPOP が要求していることを実行でき、拡張する必要がある場合は良い出発点になります。
コメントでは、開発作業を行う前にまず仕様を記述することが提案されました。私は Adobe の仕様へのリンクも提供しましたが、これは良い例だと思います。多くの場合、列挙されたリストとテーブルのみを使用できます。私の意見では、最も重要な部分はプログラムの範囲です。質問のコンテキストでは、メタデータが異なるプログラム間で情報を交換するためのインターフェイスであることを考えると、どのソフトウェアがこの情報を読み取ることが期待されるかに答える必要があります。仕様が記述されると、検証機能を開発できます。必要に応じて、さまざまな書き込みシステムとエンコードをカバーするように注意する必要があります。
LaTeX パッケージの要件に準拠した日付のデータ検証の例は、l3 プログラミング レイヤーを使用して記述された l3doc リストにあります。これは、l3 プログラミングの驚異的な技です。
注意点としては、Web 開発も同様の開発段階を経てきましたが、検索が改善され、LLM の登場により、このようなオントロジーは完全に消滅する可能性があるため、実際には普及しませんでした。ただし、これは単なる私の意見であり、皆さんを落胆させる意図はありません。
答え3
これは正確には回答ではありませんが、上記のコメントで Ulrike Fischer が尋ねた仕様です。まだ初期段階なので、適宜編集します。
パッケージ メタデータは、メタデータ エントリの使用と検証を定義し、許可します。
新しいエントリを定義するには、次を使用します。
\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}
どこ:
データの種類:
可能:
- 数値(整数または小数)
- 文字列
- 日付時刻
フォーマット:
定義したデータ型の形式を指定します。
下限範囲=0001-01-01:
上限範囲=9999-12-31:
連続しているか、長すぎて完全にリストできないデータの下限と上限の範囲を定義します。
日付セットの範囲の例: 0001-01-01 から 9999-12-31
有限範囲:
簡単に完全にリストできるデータの範囲を定義します。
デフォルト値:
定義されていない場合にメタデータ エントリがデフォルトとする値。
オプション/必須:
特定のメタデータ エントリが、それを定義する領域内で必須かオプションかを定義します。
validation_routine (外部):
エントリを検証する外部ルーチンの呼び出し。
階層:
以前に定義された別のメタデータ エントリに基づいて再帰的に定義された要素。
定義と使用例
データの種類:
考慮すべきデータには 3 つの種類があります。
- 数値(整数または小数)
- 文字列
- 日付時刻
日付形式:
日付: 形式: YYYY-MM-DD 日付時刻: 形式: YYYY-MM-DD HH:MI:SS
日付の形式には、「dd-mm-yyyy」、「yyyy-mm-dd」、「mm-dd-yyyy」など、さまざまなタイプがあります。
最もよく使用される 10 個の形式を、短い世紀 (yy) と長い世紀 (yyyy) とともに示します。
- 米国: mm/dd/yy および mm/dd/yyyy
- ANSI: yy.mm.dd および yyyy.mm.dd
- イギリス/フランス語: dd/mm/yy および dd/mm/yyyy
- ドイツ語: dd.mm.yy & dd.mm.yyyy
- 日本: yy/mm/dd & yyyy/mm/dd
- ISO: yymmdd および yyyymmdd
- ヨーロッパのデフォルト + ミリ秒: dd mon yyyy hh:mi:ss:mmm (24 時間)
- ヒジュラ暦: dd/mm/yyyy 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}
メタデータの階層。
\definemetadataentry[type=CHARACTERSTRING(2),
required,
]{country}
\definemetadataentry[type=CHARACTERSTRING(10),
hierarchy=country,
]{zipcode}
使用例:
\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}
使用例:
\msc[2010]{76B75}
\msc[2020]{76D55}
\definemetadataentry[type=CHARACTERSTRING(100),
required,
]{full_name}
\definemetadataentry[type=CHARACTERSTRING(30),
hierarchy=full_name,
]{last_name}
使用例:
\full_name{John Ewing}
\last_name{Ewing}