Wie kann ich eine Clist in eine Keyval-Eigenschaft analysieren?

Wie kann ich eine Clist in eine Keyval-Eigenschaft analysieren?

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,Bobanstelle 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 authorSchlüssel übergeben haben, sichtbar zu machen, müssen Sie sie \getvmeta{author}auf ihren Inhalt erweitern. Verwenden Sie dazu \clist_set:Nx( xbedeutet erschöpfende Erweiterung). Dies funktioniert, weil \prop_item:Nnes durch Erweiterung funktioniert und das Element daher in einem Erweiterungskontext zurückgeben kann (Sie müssen \getvmetadie 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 \setupzweimal 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}

verwandte Informationen