没有 .initial:n 的空参数

没有 .initial:n 的空参数

当未设置初始值且参数为空时,将使用变量中的当前值,不一定是原来的值.initial:n

.initial:n仅在使用时设置一次值,而不添加任何稍后重置这些值的方法。

所描述的情况是否被视为有缺陷?是否应该实际上禁止使用当前值并在每次调用命令时重置?

\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}

答案1

我修改了您的示例以显示两个变体 A(您的版本),它会获取您未设置的任何键的当前设置,而 B 会使所有键标准化,因此不使用当前设置。

在此处输入图片描述

\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{\setdimensionsA} { O{} }
{
  % Use the dimensions in your document or perform other actions
  \fbox
  {
    \keys_set:nn { mymodule } { #1 }
    \begin{tabular}{ll}AAA\\
      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}
  }
}

\NewDocumentCommand{\setdimensionsB} { O{} }
{
  % Use the dimensions in your document or perform other actions
  \fbox
  {
    \keys_set:nn {mymodule} {
      width = 100pt,
      height = 200pt,
      margin = 300pt,
      }
    \keys_set:nn { mymodule } { #1 }
    \begin{tabular}{ll}BBB\\
      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}
  }
}

\NewDocumentCommand\setmymodulekeys{m}{ \keys_set:nn { mymodule } { #1 }}

\ExplSyntaxOff

\begin{document}

% Example usage
With custom values:

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

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

With current values:

\setdimensionsA

\setdimensionsB

With default values:

\setdimensionsA[width,height,margin]

\setdimensionsB[width,height,margin]

Change current values in the current document scope


\setmymodulekeys{width=5pt,height=5pt,margin=5pt}


With new current values:

\setdimensionsA

\setdimensionsB


\end{document}

您可以在单个命令中使用这两种样式。例如,\includegraphics很少有意义获取文件名的当前值,每次都需要指定它,但 \textwidth如果人们希望所有图像具有相同的宽度,他们通常会将宽度全局设置为某个分数。

答案2

默认值和初始值是不同的。

.default:n如果调用的键没有任何值,则您可以指定提供什么值。

最初,您需要.initial:n指定密钥所具有的值。

处理键值项的常见方式是将键设置在一个组中,因此当关闭该组时,初始值将被重置,但这并不总是可行的。

您的分析存在缺陷,因为您将键设置在 内部\fbox,从而形成了一个隐式组。

让我们看看保持初始值的两种可能策略。

策略 1 – 分组

\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
    \group_begin:
    \keys_set:nn { mymodule } { #1 }
    \begin{tabular}[t]{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}
    \group_end:
}

\ExplSyntaxOff

\begin{document}

% Example usage
With custom values:

\setdimensions[
  width = 80pt,
  height = 40pt,
  margin = 20pt,
]

\bigskip

With initial values:

\setdimensions

\bigskip

With default values:

\setdimensions[width,height,margin]

\end{document}

在此处输入图片描述

您会看到在第二次调用中使用了初始值。

策略 2 – 不分组

如果无法分组或不方便分组,您可以预编译初始值并在设置新值之前使用它们。

\documentclass{article}

\ExplSyntaxOn

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

\tl_new:N \l_mymodule_initial_tl
\keys_precompile:nnN { mymodule } { width=34pt, height=34pt, margin=34pt } \l_mymodule_initial_tl

% Command to use the keys
\NewDocumentCommand{\setdimensions} { O{} }
{
  % Use the dimensions in your document or perform other actions
    \tl_use:N \l_mymodule_initial_tl
    \keys_set:nn { mymodule } { #1 }
    \begin{tabular}[t]{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 = 80pt,
  height = 40pt,
  margin = 20pt,
]

\bigskip

With initial values:

\setdimensions

\bigskip

With default values:

\setdimensions[width,height,margin]

\end{document}

输出与以前相同。

相关内容