xparse 宏和 expl3 键值对的使用

xparse 宏和 expl3 键值对的使用

我正在尝试设置一个密钥对系列以用于\NewDocumentCommand。目标是拥有一个具有两个密钥对的函数。我希望能够获取宏中两个键的值,类似于使用 #1、#2。

\documentclass{beamer}

\mode<presentation>
{    \usetheme{metropolis}    }

\geometry{verbose,papersize={160mm,90mm}}
\usepackage{tikz,xkeyval}
\setlength{\parindent}{0pt}

\makeatletter
\define@key{mykeyset}{testingkey}{#1}
\presetkeys{mykeyset} {testingkey} {testingkey={testingkey~default~value}}
\define@key{mykeyset}{secondkey}{#1}
\presetkeys{mykeyset}{secondkey}{secondkey={secondkey~default~value}}
\makeatother

\ExplSyntaxOn
\NewDocumentCommand\ifelsetest{ m o }{
  optional~parameter~:~#2
  \par
  \IfNoValueTF{#2}
  { \setkeys{mykeyset}{secondkey={secondkey~default~value~set~by~macro}} }
  { \setkeys{mykeyset}{#2} }

%here trying to print independently the values alone of the keys
  \mykeyset@testingkey  
  \mykeyset@secondkey
}
\ExplSyntaxOff

\begin{document}
\begin{frame}
\ifelsetest{test} % #2 should be -NoValue-
\par
\ifelsetest{test}[]
\par
\ifelsetest{test}[testingkey=shouldtesttrue]
\par
\ifelsetest{test}[testingkey=]
\end{frame}
\end{document}

编辑:根据评论,这里尝试使用expl3。我还在标题中将“ xkeyval”更改为“expl3键值对”。

键值最终以布尔值结束,将字符串yes视为 True,并将其他任何内容(包括空字符串)视为False

实际上,我想添加很多可以通过密钥发出并最终以 或 结束的True可能性False

例如True:“是”、“好的”、“继续”......以及False:“不”、“停止”、“不要这样做”......

虽然我可以\tl_if_in:NnTF对每个单词发出一个,但有没有更短的选择?

编辑:根据建议,我添加了一个 clist 以允许几个选项将布尔值设置为True 我使用的\clist_if_in:NnTF,但我需要一个 \clist_if_in:NNTF . Because\clist_if_in:NnTF` 期望一个列表作为它的第二个参数,我必须使用 \tl_use:N。

它不起作用,并且 NiceTabular 中存在奇怪的东西(第一列内容开头的逗号)

\documentclass{beamer}
\mode<presentation>
{    \usetheme{metropolis}    }

\geometry{verbose,papersize={160mm,90mm}}
\usepackage{nicematrix}

\ExplSyntaxOn
\keys_define:nn {groupetest/textbloc }
{
  clef .tl_set:N = \l_groupetest_clef_tl
}

\bool_new:N \l_clef_bool
\clist_new:N \l_istrue_clist
\clist_set:Nn \l_istrue_clist { {yes} , {oui} , {ok} , {dac} , {go~head} , {yup} , {super} }

\NewDocumentCommand\textbloc{ O{} }{
  \keys_set:nn { groupetest/textbloc } { #1 }

  \tl_if_empty:NTF \l_groupetest_clef_tl
     {
       \bool_set_false:N \l_clef_bool
     }

% here using \clist_if_in:NnTF, but why is there
% no \clist_if_in:NNTF ??
     {
       \clist_if_in:NnTF \l_istrue_clist 
                    { \tl_use:N \l_groupetest_clef_tl }
         {
           \bool_set_true:N \l_clef_bool
         }
         {
           \bool_set_false:N \l_clef_bool
         }
     }
     
  \bool_if:NTF \l_clef_bool
    {
      clé~'clef'~=~\l_groupetest_clef_tl & var.~bool~'clef'~: True \\
    }
    {
      clé~'clef'~=~\l_groupetest_clef_tl & var.~bool~'clef'~: False \\
    }

  \keys_set:nn { groupetest/textbloc }
    { clef={} }
}
\ExplSyntaxOff
\setlength{\parindent}{0pt}

\begin{document}
\begin{frame}
\begin{NiceTabular}{ll}[hvlines]
\textbloc[clef=abc]  
\textbloc[clef=yes]  
\textbloc  
\end{NiceTabular}
\end{frame}
\end{document}

这里是:

https://imgur.com/yzYb80b.png 截屏

相关内容