重置星号版本的 l3key 值

重置星号版本的 l3key 值

我真的不明白 的用途.initial:n。它只对第一次调用没有用户值的命令有用,之后将使用当前值。

希望带星号的版本在没有参数时始终使用初始值,仅使用键名时使用默认值,设置为参数时使用提供的值。

对于未加星号的版本,我想在没有参数时使用初始值或当前值,仅使用键名时使用默认值,设置为参数时使用提供的值。

\documentclass{article}

\ExplSyntaxOn

\dim_new:N \l_mymodule_width_dim
\dim_new:N \l_mymodule_height_dim
\dim_new:N \l_mymodule_margin_dim

\keys_define:nn { mymodule }
  {
    width .dim_set:N = \l_mymodule_width_dim,
    width .initial:n = 34pt,
    width .default:n = 36pt,

    height .dim_set:N = \l_mymodule_height_dim,
    height .initial:n = 34pt,
    height .default:n = 36pt,

    margin .dim_set:N = \l_mymodule_margin_dim,
    margin .initial:n = 34pt,
    margin .default:n = 36pt,
  }

\NewDocumentCommand {\setdimensionsC} { s o }
  {
    \IfBooleanTF {#1}
      {
        \IfValueTF {#2}
          { 
            \keys_set:nn { mymodule }
              { width = 36pt, height = 36pt, margin = 36pt }
            \keys_set:nn {mymodule} {#2} 
          }
              { 
                \keys_set:nn { mymodule }
                  { width = 36pt, height = 36pt, margin = 36pt }
              }
      }
        {
          \IfValueTF {#2}
            { \keys_set:nn {mymodule} {#2} }
                { \keys_set:nn {mymodule} {} }
        }

      % Use the dimensions in your document or perform other actions
      \fbox { \begin{tabular}{ll}
                Width:  & \dim_use:N \l_mymodule_width_dim  \\
                Height: & \dim_use:N \l_mymodule_height_dim \\
                Margin: & \dim_use:N \l_mymodule_margin_dim
              \end{tabular} }
  }

\ExplSyntaxOff

\begin{document}
 
With Initial Values:
\setdimensionsC

With Default values:
\setdimensionsC[width,height,margin]

With Current Values:
\setdimensionsC

\end{document}

答案1

您似乎想使用策略 2,如我之前的回答中所述。因此这些.initial:n位完全不相关。

\documentclass{article}

\ExplSyntaxOn

\tl_new:N \l_mymodule_initial_tl

\keys_define:nn { mymodule }
  {
    width .dim_set:N = \l_mymodule_width_dim,
    width .default:n = 36pt,

    height .dim_set:N = \l_mymodule_height_dim,
    height .default:n = 36pt,

    margin .dim_set:N = \l_mymodule_margin_dim,
    margin .default:n = 36pt,
  }
\keys_precompile:nnN { mymodule } { width=34pt, height=34pt, margin=34pt } \l_mymodule_initial_tl

\NewDocumentCommand {\setdimensionsC} { s O{} }
  {
    \IfBooleanTF {#1}
      {
        \keys_set:nn { mymodule } { width = 8cm, height = 4cm, margin = 1.5cm }
        \keys_set:nn {mymodule} {#2}
      }
      {
        \tl_use:N \l_mymodule_initial_tl
        \keys_set:nn {mymodule} {#2}
      }

      % Use the dimensions in your document or perform other actions
      \fbox { \begin{tabular}{ll}
                Width:  & \dim_use:N \l_mymodule_width_dim  \\
                Height: & \dim_use:N \l_mymodule_height_dim \\
                Margin: & \dim_use:N \l_mymodule_margin_dim
              \end{tabular} }
  }

\ExplSyntaxOff

\begin{document}
 
With Initial Values:
\setdimensionsC

With Default values:
\setdimensionsC[width,height,margin]

With Initial Values:
\setdimensionsC

With *:
\setdimensionsC*

With * (modified):
\setdimensionsC*[height=20pt]

\end{document}

在此处输入图片描述

请注意,您不需要o,只需将其O{}作为默认值传递即可。

相关内容