\newcommand 使用 keyval 进行表格输入

\newcommand 使用 keyval 进行表格输入

我正在尝试使用 定义一个用于表格条目的命令keyval

\documentclass{article}

\usepackage{keyval}

\makeatletter
\define@key{tabularEntryKeys}{a}[\dots]{#1 & }
\define@key{tabularEntryKeys}{b}[\dots]{#1   }
\makeatother

\newcommand{\tabularEntry}[1]{\setkeys{tabularEntryKeys}{#1}}

\begin{document}

\begin{tabular}{c|c}\hline
  \tabularEntry{a=1,b=2} % shall be "1 & 2"
\end{tabular}

\end{document}

但是它无法编译。有什么建议吗?

答案1

这是另一种方法。它既不进行全局定义,也不使用e-TeX扩展和\edef

表格键

\documentclass{article}

\usepackage{keyval}
\def\TAB{&}

\makeatletter
\define@key{tabularEntryKeys}{a}[\dots]{\def\tek@rowA{#1}}
\define@key{tabularEntryKeys}{b}[\dots]{\def\tek@rowB{#1}}
% initialize
\def\tek@rowA{}
\def\tek@rowB{}

\newcommand{\tabularEntry}[1]{\setkeys{tabularEntryKeys}{#1}%
                              \tek@rowA \expandafter\TAB\tek@rowB }
\makeatother

\begin{document}

\begin{tabular}{c|c}
\hline
  \tabularEntry{a=1,b=2} \\
  \tabularEntry{a=1} \\
  \tabularEntry{b=2} \\
  \tabularEntry{a,b} \\
  \tabularEntry{a} \\
  \tabularEntry{b} \\
  \tabularEntry{} \\
\end{tabular}
% \begin{tabular}{c|c}\hline
%   \tabularEntry{a=1,b=2}\\
%   \tabularEntry{a=3,b=7}\\
%   \tabularEntry{a=10,b=20}
% \end{tabular}

\end{document}

如果一行中有多个单元格,则需要一个变体来避免出现许多个:(请注意,除了和 之外,在初始默认值\expandafter之前和 中添加的额外空格 )#1\tek@rowA\tekrowD

\usepackage{keyval}
\def\TAB{&}
\makeatletter
\define@key{tabularEntryKeys}{a}[\dots]{\def\tek@rowA{#1}}
\define@key{tabularEntryKeys}{b}[\dots]{\def\tek@rowB{ #1}}
\define@key{tabularEntryKeys}{c}[\dots]{\def\tek@rowC{ #1}}
\define@key{tabularEntryKeys}{d}[\dots]{\def\tek@rowD{#1}}
% initialize
\def\tek@rowA{}
\def\tek@rowB{ }
\def\tek@rowC{ }
\def\tek@rowD{}

\newcommand{\tabularEntry}[1]{\setkeys{tabularEntryKeys}{#1}%
     \tek@rowA \expandafter\TAB
     \romannumeral0\expandafter\tek@rowB\expandafter\TAB
     \romannumeral0\expandafter\tek@rowC\expandafter\TAB
     \tek@rowD 
}
\makeatother

答案2

下面是它的工作原理:

\documentclass{article}

\usepackage{keyval}    

\makeatletter
\define@key{tabularEntryKeys}{a}[\dots]{\gdef\A{#1}}
\define@key{tabularEntryKeys}{b}[\dots]{\gdef\B{#1}}
\makeatother

\newcommand\tabularEntry[1]{\setkeys{tabularEntryKeys}{#1} \A & \B}

\begin{document}

\begin{tabular}{c|c}\hline
    \tabularEntry{a=1,b=2}
\end{tabular}

\end{document}

答案3

您的\setkeys命令不能跨越两个单元格。另一方面,全局定义\A\B似乎不是一个好主意。

\documentclass{article}

\usepackage{keyval,etoolbox}    

\makeatletter
\define@key{tabularEntryKeys}{a}[\dots]{\def\tek@rowA{\unexpanded{#1}}}
\define@key{tabularEntryKeys}{b}[\dots]{\def\tek@rowB{\unexpanded{#1}}}
% initialize
\def\tek@rowA{}
\def\tek@rowB{}
\newcommand\tabularEntry[1]{%
  \setkeys{tabularEntryKeys}{#1}%
  \edef\tek@row{\tek@rowA & \tek@rowB}\tek@row
}
\makeatother

\begin{document}

\begin{tabular}{c|c}
\hline
  \tabularEntry{a=1,b=2} \\
  \tabularEntry{a=1} \\
  \tabularEntry{b=2} \\
  \tabularEntry{a,b} \\
  \tabularEntry{a} \\
  \tabularEntry{b} \\
  \tabularEntry{} \\
\end{tabular}

\end{document}

注意,中的可选参数\define@key是在未指定键时分配给该键的值=<value>,而不是初始值。

在此处输入图片描述

如果您希望在未指定键的情况下重复值,那么说

\define@key{tabularEntryKeys}{a}[\dots]{\gdef\tek@rowA{\unexpanded{#1}}}
\define@key{tabularEntryKeys}{b}[\dots]{\gdef\tek@rowB{\unexpanded{#1}}}

但不要使用“简单”的宏名,例如\A\B

答案4

使用该包可以轻松完成这项任务expkv-cs,因为它是完全可扩展的(因此不必关心添加的隐式组,&因为它不需要任何可能受该范围限制的定义)并且可以将 key=value 参数拆分为几个编号参数。

可以定义一个新的拆分宏

\ekvcSplit\tabularEntry{a=,b=}{#1&#2}

这将使用两个键定义宏,如果未使用,则均为空参数。要了解\dots是否使用没有值的键,我们必须使用以下方式定义这些默认值

\ekvcSecondaryKeys\tabularEntry{default a = \dots, default b = \dots}

完整的代码如下:

\documentclass{article}

\usepackage{expkv-cs}

\ekvcSplit\tabularEntry{a=,b=}{#1&#2}
\ekvcSecondaryKeys\tabularEntry{default a=\dots, default b=\dots}

\begin{document}

\begin{tabular}{c|c}\hline
  \tabularEntry{a=1,b=2} \\
  \tabularEntry{a=1} \\
  \tabularEntry{b=2} \\
  \tabularEntry{a,b} \\
  \tabularEntry{a} \\
  \tabularEntry{b} \\
  \tabularEntry{} \\
\end{tabular}

\end{document}

结果如下:

在此处输入图片描述

相关内容