当未设置初始值且参数为空时,将使用变量中的当前值,不一定是原来的值.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}
输出与以前相同。