processkv 或 keyval 包的键不允许使用 0 个键

processkv 或 keyval 包的键不允许使用 0 个键

processkv 或 keyval 包似乎不允许使用 0 键。当我执行 0=val 时,尝试处理键时会出错,但当我执行 1=val 时,一切正常。

有什么想法吗?在 parcolumns 中,它使用以下方法处理键值:

\expandafter\processkeyvalues\expandafter{\the\toks@}\pc@setsinglecolwidth%

并且密钥被简单地定义为

\define@key{parcolumns}{colwidths}{\toks@{#1}}

其中调用以下宏来对键值对进行操作:

\def\pc@setsinglecolwidth#1#2{%
    \@ifundefined{pc@column@width@\number#1}{%
        \PackageError{parcolumns}{`#1' is not a valid column width number!}{\@ehc}%
    }{%
        \csname pc@column@width@\number#1\endcsname=#2\relax%
    }%
}

错误消息来自包错误。\pc@column@width@0由于某种原因,它没有创建值,但所有其他正值都可以工作(嗯,最多可达列数)。

我理解的代码只是processkv处理每个键值对并\pc@setsinglecolwidth在每个键值对上调用宏(在本例中为)。因此,我认为没有理由“0”不起作用。由于我在 parcolumns 中找不到将 0 视为特殊的东西,所以我看不出错误为什么会出现在 parcolumns 中(因此唯一的其他地方是processkvkeyval

作品:

\begin{parcolumns}[nofirstindent,distance=0pt,colwidths={1=30pt}]{6}%

不起作用:

\begin{parcolumns}[nofirstindent,distance=0pt,colwidths={0=30pt}]{6}%

答案1

这与按键机制无关。只是列被标记为 1、2、3...,所以您无法设置列 0 的宽度。

答案2

(这实际上是一个扩展的评论。)使用稍微被破解的测试文件

\RequirePackage{keyval,processkv}
\makeatletter
\define@key{parcolumns}{colwidths}{\toks@{#1}}
\define@key{parcolumns}{nofirstindent}[true]{}
\define@key{parcolumns}{distance}{}
\def\pc@setsinglecolwidth#1#2{%
    \@ifundefined{pc@column@width@\number#1}{%
        \PackageError{parcolumns}{`#1' is not a valid column width number!}{\@ehc}%
    }{%
        \csname pc@column@width@\number#1\endcsname=#2\relax%
    }%
}
\newenvironment{parcolumns}[2][]{%
  \setkeys{parcolumns}{#1}%
  \expandafter\processkeyvalues\expandafter{\the\toks@}\pc@setsinglecolwidth%
}
{}
\expandafter\newdimen\csname pc@column@width@0\endcsname
\expandafter\newdimen\csname pc@column@width@1\endcsname
\begin{parcolumns}[nofirstindent,distance=0pt,colwidths={0=30pt}]{6}%
  \expandafter\showthe\csname pc@column@width@0\endcsname
  \expandafter\showthe\csname pc@column@width@1\endcsname
\end{parcolumns}

\begin{parcolumns}[nofirstindent,distance=0pt,colwidths={1=30pt}]{6}%
  \expandafter\showthe\csname pc@column@width@0\endcsname
  \expandafter\showthe\csname pc@column@width@1\endcsname
\end{parcolumns}

除了预期的分配差异外,我看不到行为上的任何差异。正如我对这个问题的评论,我怀疑这是使用暂存器的问题\tok@,但如果没有一个可以跟踪寄存器的完整示例,很难确定。

相关内容