初始、默认和用户定义的键

初始、默认和用户定义的键

我想传递用户定义的键。但是当用户未指定值时,将使用默认值。我需要一些关于在命令中做什么的解释\setdimensions。到底是怎么.initial回事?

\documentclass{article}

\ExplSyntaxOn

% Define dimension variables
\dim_new:N \l_mymodule_width_dim
\dim_new:N \l_mymodule_height_dim
\dim_new:N \l_mymodule_margin_dim

% Define a new key-value family
\keys_define:nn { mymodule }
  {
    width  .dim_set:N = \l_mymodule_width_dim,
    width .initial:n = 34pt,
    width .default:n = 34pt,

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

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

% Command to use the keys
\NewDocumentCommand{\setdimensions}{o}
  {
    % Use the dimensions in your document or perform other actions
    \fbox
    {
      Width:  \dim_use:N \l_mymodule_width_dim \\
      Height: \dim_use:N \l_mymodule_height_dim \\
      Margin: \dim_use:N \l_mymodule_margin_dim
    }
  }

\ExplSyntaxOff

\begin{document}

% Example usage
\setdimensions{
  width = 8cm,
  height = 4cm,
  margin = 1.5cm,
}

\end{document}

答案1

如果您希望使参数成为可选的,那么您只需说\setdimensions使用这些initial值,您就可以这样做,只要您使用\setdimensions[<list of key-values>]方括号而不是花括号即可。

例如,

\documentclass{article}

\ExplSyntaxOn

% Define a new key-value family
\keys_define:nn { mymodule }
{
  width  .dim_set:N = \l_mymodule_width_dim,
  width .initial:n = 34pt,
  width .default:n = 10pt,
  
  height .dim_set:N = \l_mymodule_height_dim,
  height .initial:n = 34pt,
  height .default:n = 10pt,
  
  margin .dim_set:N = \l_mymodule_margin_dim,
  margin .initial:n = 34pt,
  margin .default:n = 10pt,
}

% Command to use the keys
\NewDocumentCommand{\setdimensions} { O{} }
{
  % Use the dimensions in your document or perform other actions
  \fbox
  {
    \keys_set:nn { mymodule } { #1 }
    \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}

% Example usage
With custom values:

\setdimensions[%
  width = 8cm,
  height = 4cm,
  margin = 1.5cm,
]

With initial values:

\setdimensions

With default values:

\setdimensions[width,height,margin]

\end{document}

生产

自定义、初始和默认值

我不确定这是否是使用您想要的不同值的示例......

答案2

您的问题不太清楚,无法回答,但我会尝试......

代码产生

在此处输入图片描述

框中的文本没有空格,因为它是设置的\ExplSyntaxOn,它只显示由键设置的三个寄存器的值initial,因为这些值是在定义键时设置的,此后您永远不会设置任何键。

[...] 该命令被定义为具有一个它从未使用的可选参数,因此该参数将在以下标记内使用

{
  width = 8cm,
  height = 4cm,
  margin = 1.5cm,
}

根本无法被命令看到,只是排版为文本,如上图所示。


我猜你是想

在此处输入图片描述

其中命令被定义为接受一个参数,该参数用于设置键值。键设置包含在本地组中,因此在命令之后不会更改。

\documentclass{article}

\ExplSyntaxOn

% Define dimension variables
\dim_new:N \l_mymodule_width_dim
\dim_new:N \l_mymodule_height_dim
\dim_new:N \l_mymodule_margin_dim

% Define a new key-value family
\keys_define:nn { mymodule }
  {
    width  .dim_set:N = \l_mymodule_width_dim,
    width .initial:n = 34pt,
    width .default:n = 34pt,

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

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

% Command to use the keys
\NewDocumentCommand{\setdimensions}{m}
{
 \group_begin:
  \keys_set:nn{mymodule}{#1}
    % Use the dimensions in your document or perform other actions
    \fbox
    {\begin{tabular}{l}
      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}
    }
  \group_end:
 }

\ExplSyntaxOff

\begin{document}

% Example usage
\setdimensions{
  width = 8cm,
  height = 4cm,
  margin = 1.5cm,
}

\end{document}

答案3

这个答案只是为了澄清一些细节,而不是提供一些可以运行的代码。

由于密钥定义和密钥设置是分开的,因此l3keys您必须运行单独的程序\keys_set:nn来设置第一个/初始值。由于这很麻烦,并且将密钥声明与其初始化分开,因此.initial:n添加了处理程序。

该处理程序所做的就是将一个键设置为一个值(因此本质上<key> .initial:n = { <value> }内部\keys_define:nn { <module> }与您\keys_set:nn { <module> } { <key> = { <value> } }在该点放置一个相同,它不会向键代码添加任何其他内容。因此,该键的任何后续设置(嵌套组之外)都将覆盖该.initial:n值,并且如果没有通过不同方式手动记录它,就不可能将其恢复。

相关内容