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 中(因此唯一的其他地方是processkv
和keyval
?
作品:
\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@
,但如果没有一个可以跟踪寄存器的完整示例,很难确定。