我正在尝试使用 定义一个用于表格条目的命令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}
这将使用两个键定义宏,如果未使用,则均为空参数。要了解\dots
是否使用没有值的键,我们必须使用以下方式定义这些默认值
\ekvcSecondaryKeys\tabularEntry{default a = \dots, default b = \dots}
完整的代码如下:
\documentclass{article}
\usepackage{expkv-cs}
\ekvcSplit\tabularEntry{a=,b=}{#1}
\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}
结果如下: