Keycommand 包 - \commandkey{mykey} 不扩展

Keycommand 包 - \commandkey{mykey} 不扩展

已更新,请参阅编辑历史以了解完整性

我正在尝试键盘命令包但它没有按预期工作。似乎与表格存在一些不兼容问题,但我已经阅读并重读了文档,但还是搞不清楚到底是什么问题。

我构建了一个我正在做的事情的最小示例。它正在使用longtable,因为它们似乎比常规的要好一点,而且这是我现在需要它与之一起工作的:

\documentclass{article}
\usepackage{longtable} 
\usepackage{keycommand}

\newkeycommand\mycommand[first=one,second=2][1]{%
#1 \\    
First: \commandkey{first} & second: \commandkey{second}%
}

\begin{document}
\begin{longtable}{ll}
\mycommand{hello} \\
\mycommand[first=1,second=two]{world!}
\end{longtable}
\end{document}

问题在于,它不输出参数值,而是输出参数名称

EXPECTED OUTPUT                      ACTUAL OUTPUT
***************                      *************
hello                                hello
First: one    second: 2              first: first        second: second
world!                               world!
First: 1      second: two            first: first        second: second

为什么会这样?我该怎么办?

答案1

这似乎是 中的一个严重错误keycommands。调用时执行的提供值的赋值\commandkey是本地的;\\定义中的 结束了进行这些赋值的组,并且keycommands忘记了值应该是什么,因此它会打印键名。

您可以使用不同的(可靠的)方法来获得相同的结果。

\documentclass{article}
\usepackage{longtable} 
\usepackage{xparse}

\ExplSyntaxOn
% Set up the keys
\keys_define:nn { lycken-mycommand }
 {
  first  .tl_gset:N = \g_lycken_first_tl,
  second .tl_gset:N = \g_lycken_second_tl,
 }

\NewDocumentCommand{\mycommand}{ O{} m }
 {
  \keys_set:nn { lycken-mycommand }
   {
    % provide the default values
    first = first,
    second = 2,
    #1 % evaluate the keys in the optional argument
   }
  #2 \\    
  First:~\g_lycken_first_tl & second:~\g_lycken_second_tl
 }
\ExplSyntaxOff

\begin{document}
\begin{longtable}{ll}
\mycommand{hello} \\
\mycommand[first=1,second=two]{world!}
\end{longtable}
\end{document}

在此处输入图片描述

答案2

这是微不足道的,并且无需任何全局分配(就此而言的任何分配)即可实现expkv-cs(下面使用它的Hash变体,因为它的语法更接近keycommand,即使示例只需要两个键,并且使用变体进行设置会更快Split)。

免责声明:我是expkv

\documentclass{article}
\usepackage{longtable} 

\usepackage{expkv-cs}
% grabbing the argument as an optional argument
\newcommand\mycommand[1][]{\mycommandKV{#1}}
% parsing the keys "first" and "second"
\ekvcHashAndForward\mycommandKV\mycommandOUT{first=one,second=2}
% output
% #1 contains the parsed keys accessible via \ekvcValue
% #2 the mandatory argument
\newcommand\mycommandOUT[2]
  {%
    #2 \\
    First: \ekvcValue{first}{#1} & second: \ekvcValue{second}{#1}%
  }

\begin{document}
\begin{longtable}{ll}
\mycommand{hello} \\
\mycommand[first=1,second=two]{world!}
\end{longtable}
\end{document}

在此处输入图片描述

相关内容