
Ich versuche, eine durch Kommas getrennte Liste in einer Schlüssel-Wert-Eigenschaft zu speichern, um sie später zu verwenden, aber ich bekomme es nicht richtig zum Laufen.
Ich verstehe nicht wirklich, wie Latex einen Keyval-Parameter analysiert, aber ich vermute, dass es den Parameter als einfachen Text verarbeitet.
Dies ist der Code, den ich derzeit habe:
\documentclass{article}
\usepackage{expl3}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand { \getvmeta } { m } { \prop_item:cn { g_rvnlatex_doc_prop } { #1 } }
\NewDocumentCommand { \setvmeta } { m m } { \prop_gput:cnV { g_rvnlatex_doc_prop } { #1 } #2 }
\keys_define:nn { ravenhill/latex/meta } {
author .clist_set:N = \l_rvnlatex_author_clist ,
}
\NewDocumentCommand { \setup } { m } {
\group_begin:
\prop_new:c { g_rvnlatex_doc_prop }
\keys_set:nn { ravenhill/latex/meta } { #1 }
\setvmeta { author } { \l_rvnlatex_author_clist }
\group_end:
}
\NewDocumentCommand { \authorblock } { } {
\clist_new:N \l__authblock_authcopy_clist
\clist_set:Nn \l__authblock_authcopy_clist { \getvmeta { author } }
\clist_use:Nnnn \l__authblock_authcopy_clist { ~and~ } { ,~ } { ,~and~ }
}
\ExplSyntaxOff
\setup {
author = {John, Bob},
}
\begin{document}
\authorblock
\end{document}
Das Ergebnis, das ich erhalten habe, ist John,Bob
anstelle von John and Bob
.
Übersehe ich etwas?
Antwort1
Ihre Vermutung ist richtig. Wenn Sie
\clist_set:Nn \l__authblock_authcopy_clist { \getvmeta { author } }
der Clist-Parser sieht nur \getvmeta { author }
, was für ihn keinen Unterschied zu darstellt getvmeta { author }
, da es dort kein Komma enthält.
Um die Kommaliste, die Sie an den author
Schlüssel übergeben haben, sichtbar zu machen, müssen Sie sie \getvmeta{author}
auf ihren Inhalt erweitern. Verwenden Sie dazu \clist_set:Nx
( x
bedeutet erschöpfende Erweiterung). Dies funktioniert, weil \prop_item:Nn
es durch Erweiterung funktioniert und das Element daher in einem Erweiterungskontext zurückgeben kann (Sie müssen \getvmeta
die Erweiterung auch zulassen, indem Sie sie mit deklarieren ).\NewExpandableDocumentCommand
Verschieben Sie die Variablendeklarationen außerdem außerhalb von Befehlen auf Benutzerebene: Sie wissen nie, ob jemand versucht, sie beispielsweise \setup
zweimal zu verwenden. Wenn dies geschieht, wird Ihr Code einen Fehler verursachen, wenn er versucht, eine Variable zu deklarieren, die bereits existiert.
\documentclass{article}
\usepackage{expl3}
\usepackage{xparse}
\ExplSyntaxOn
\NewExpandableDocumentCommand { \getvmeta } { m }
{ \prop_item:Nn \g_rvnlatex_doc_prop {#1} }
\NewDocumentCommand { \setvmeta } { m m }
{ \prop_gput:NnV \g_rvnlatex_doc_prop {#1} #2 }
\keys_define:nn { ravenhill/latex/meta }
{ author .clist_set:N = \l_rvnlatex_author_clist }
\prop_new:N \g_rvnlatex_doc_prop
\clist_new:N \l__authblock_authcopy_clist
\NewDocumentCommand \setup { m }
{
\group_begin:
\keys_set:nn { ravenhill/latex/meta } {#1}
\setvmeta { author } { \l_rvnlatex_author_clist }
\group_end:
}
\NewDocumentCommand \authorblock { }
{
\clist_set:Nx \l__authblock_authcopy_clist { \getvmeta { author } }
\clist_use:Nnnn \l__authblock_authcopy_clist { ~and~ } { ,~ } { ,~and~ }
}
\ExplSyntaxOff
\setup{author = {John, Bob}}
\begin{document}
\authorblock
\end{document}