我真的不明白 的用途.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{}
作为默认值传递即可。