生成表时如何在命令中使用变量?

生成表时如何在命令中使用变量?

我不确定这个问题,因为我真的不明白它为什么会失败。

我倾向于使用命令来生成表格,当我使用#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}

在此处输入图片描述

相关内容