我定义了一个类似于下面显示的环境,并且我希望其中两个参数是必需的。我从 interface3 文档中得到的印象是,.value_required
在中说的话keys_define
可以达到我想要的效果:如果没有向环境提供参数,则编译应该会失败。相反,如果用户省略该参数,则第一个变量(字符串)将保留为空字符串 - 或者可能是未定义的。第二个值(浮点数)设置为零。
我如何判断用户是否提供了所需的参数?
\documentclass[10pt]{article}
\ExplSyntaxOn
\NewDocumentEnvironment{intfig} { O{} }
{
\group_begin:
\keys_set:nn{intfig}{#1}
\rm{string\ is\ } \l_intfig_astring_str \\
\rm{height\ is\ } \fp_eval:n { \l_intfig_height_fp }\\
% There isn't anything like \bool_eval:n it seems.
\rm{done\ boolean\ is\ } \bool_if:NTF\l_intfig_done_bool{TRUE}{FALSE} \\
\group_end:
}{}
\keys_define:nn { intfig }
{
astring.str_set:N = \l_intfig_astring_str,
astring.value_required:n = true,
height.fp_set:N = \l_intfig_height_fp,
height.value_required:n = true,
done.bool_set:N = \l_intfig_done_bool,
}
\ExplSyntaxOff
\begin{document}
\begin{intfig}
random body
\end{intfig}
\end{document}
答案1
.value_required
你不能使用的方法只是你astring
必须给出一个值astring=xxx
所以这会出现错误
\documentclass[10pt]{article}
\ExplSyntaxOn
\NewDocumentEnvironment{intfig} { O{} }
{
\group_begin:
\keys_set:nn{intfig}{#1}
\textrm{string\ is\ } \l_intfig_astring_str \\
\textrm{height\ is\ } \fp_eval:n { \l_intfig_height_fp }\\
% There isn't anything like \bool_eval:n it seems.
\textrm{done\ boolean\ is\ } \bool_if:NTF\l_intfig_done_bool{TRUE}{FALSE} \\
\group_end:
}{}
\keys_define:nn { intfig }
{
astring.str_set:N = \l_intfig_astring_str,
astring.value_required:n = true,
height.fp_set:N = \l_intfig_height_fp,
height.value_required:n = true,
done.bool_set:N = \l_intfig_done_bool,
}
\ExplSyntaxOff
\begin{document}
\begin{intfig}[astring]
random body
\end{intfig}
\end{document}
! LaTeX3 Error: The key 'intfig/astring' requires a value.
如果您想要检测根本astring
没有使用的情况,您可以.initial
给它一个可区分的值,您可以检测出该值与任何用户提供的值不同。
答案2
.value_required:n
意思是:如果提供了键,那么必须提供一个值。
.value_required:n
并不意味着必须提供键。- 如果您希望编译失败 = 在未提供某些特定键的情况下停止并显示错误消息(?),那么,以我的拙见,传递键和值的参数可能不应该是可选的且默认值为空,而应该是可选的且默认值为键提供默认值,或者是强制性的,这样,如果您希望编译成功,就不必提供该参数。
- 您可以引入一个布尔值,并且
.set_str:N
可以使用处理程序.code:n
来切换布尔值和设置字符串变量。
\documentclass[10pt]{article}
\ExplSyntaxOn
\NewDocumentEnvironment{intfig} { m }
{
\group_begin:
\bool_set_false:N \l_intfig_done_bool
\keys_set:nn{intfig}{#1}
\textrm{string\ is\ } \l_intfig_astring_str \\
\textrm{height\ is\ } \fp_eval:n { \l_intfig_height_fp }\\
\textrm{done\ boolean\ is\ } \bool_if:NTF\l_intfig_done_bool{TRUE}{FALSE} \\
\group_end:
}{}
\bool_new:N \l_intfig_done_bool
\str_new:N \l_intfig_astring_str
\keys_define:nn { intfig }
{
astring.code:n= \bool_set_true:N \l_intfig_done_bool
\str_set:Nn \l_intfig_astring_str {#1},
astring.value_required:n = true,
height.fp_set:N = \l_intfig_height_fp,
height.value_required:n = true,
done.bool_set:N = \l_intfig_done_bool,
}
\ExplSyntaxOff
\begin{document}
\begin{intfig}{astring=Some string}
random body
\end{intfig}
\end{document}