需要 \NewDocumentEnvironment 的参数

需要 \NewDocumentEnvironment 的参数

我定义了一个类似于下面显示的环境,并且我希望其中两个参数是必需的。我从 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

  1. .value_required:n意思是:如果提供了键,那么必须提供一个值。
    .value_required:n并不意味着必须提供键。
  2. 如果您希望编译失败 = 在未提供某些特定键的情况下停止并显示错误消息(?),那么,以我的拙见,传递键和值的参数可能不应该是可选的且默认值为空,而应该是可选的且默认值为键提供默认值,或者是强制性的,这样,如果您希望编译成功,就不必提供该参数。
  3. 您可以引入一个布尔值,并且.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}

在此处输入图片描述

相关内容