我不确定这个问题,因为我真的不明白它为什么会失败。
我倾向于使用命令来生成表格,当我使用#1
访问参数的样式时,它可以工作。但现在我有一个更广泛的数据集,需要使用这个技巧:如何定义接受超过 9 个参数的命令将所有参数放在一个命令中。
最小示例:
\documentclass[]{article}
\begin{document}
\newcommand\rowdata[2]{%
\def\firstPoint{#1}%
\def\secondPoint{#2}%
\createRow
% #1 & #2 \\ would work.
}
\newcommand\createRow{ %
\wlog{\firstPoint \secondPoint} % it appears in the log
\firstPoint & \secondPoint \\ % this fails
}
\begin{table}
\begin{tabular}{l l}
\rowdata{a}{b}
\rowdata{d}{b}
\rowdata{a}{c}
\end{tabular}
\end{table}
\end{document}
这会出现以下错误:
! Undefined control sequence.
\createRow ...dPoint } \firstPoint & \secondPoint
\\
l.16 \rowdata{a}{b}
如果我删除它,&
它确实有效,但我无法再创建表。
那么这里发生了什么?
答案1
在评论中,指出了原因:&
除了其他事情结束并开始一个组,所以的定义\secondPoint
被遗忘了。解决方案:使用\gdef
:
\documentclass[]{article}
\begin{document}
\newcommand\rowdata[2]{%
\gdef\firstPoint{#1}%
\gdef\secondPoint{#2}%
\createRow
% #1 & #2 \\ would work.
}
\newcommand\createRow{ %
\wlog{\firstPoint \secondPoint} % it appears in the log
\firstPoint & \secondPoint \\ % this fails
}
\begin{table}
\begin{tabular}{l l}
\rowdata{a}{b}
\rowdata{d}{b}
\rowdata{a}{c}
\end{tabular}
\end{table}
\end{document}
答案2
该stringstrings
软件包有一个\getargs
像 Unix 一样工作的命令。它将单个参数解析为\argi
、\argii
等。参数总数为\narg
。
\documentclass{article}
\usepackage{stringstrings}
\begin{document}
\getargs{1 2 3 4 5 6 7 8 9 10 11 12 FinalArgument}
There are \narg~arguments. The thirteenth is \argxiii
\end{document}
此示例的结果是:
共有 13 个参数。第十三个是 FinalArgument
======
在回答 MWE 请求时,我注意到确实stringstrings
遇到了用户上面提到的相同问题,即 getargs 结果不是全局的。不过,我在这里通过\makeatletter
重新定义 来解决这个问题\getargs
。
然后我重新定义\rowdata
为采用一个大的空格分隔参数。因此,下面是如何使用生成行的命令打印 12 列表。此外,该参数仅仅是空格分隔的数据,而不是单独的 {} 块。
后记:\rowdata 命令可以接受的不仅仅是键入的数据作为其内容。例如,您可以将 \today 作为数据的一部分,它将占用表格的三个参数(即列)
以下是代码
\documentclass[]{article}
\usepackage{stringstrings}
\makeatletter
\renewcommand\getargs[2][q]{\+%
\if v#1\def\@mode{q}\else\def\@mode{#1}\fi
\edef\@argv{#2}%
\@getstringlength{\@argv}{@stringsize}%
\setcounter{@iargc}{0}%
\whiledo{\value{@stringsize} > 0}{%
\addtocounter{@iargc}{1}%
\getaword[\@mode]{\@argv}{1}%
\expandafter\global\expandafter\edef\csname arg\roman{@iargc}\endcsname{\thestring}%
\removeword[e]{\@argv}%
\edef\@argv{\thestring}%
\@getstringlength{\@argv}{@stringsize}%
}
\edef\narg{\arabic{@iargc}}%
\?}
\makeatother
\newcommand\rowdata[1]{%
\getargs{#1}
\argi & \argii & \argiii & \argiv & \argv & \argvi & \argvii &
\argviii & \argix & \argx & \argxi & \argxii \\ }
\begin{document}
\begin{table}
\begin{tabular}{l l l l l l l l l l l l}
\rowdata{a b 3 4 5 6 7 8 9 10 11 12}
\rowdata{d b blah 3 45 89 s rt 343 \today}
\rowdata{a c 45 dfgf 454 454 fd 7 sds ssd s s}
\end{tabular}
\end{table}
\end{document}