尝试同时创建动态表和命令

尝试同时创建动态表和命令

我正在尝试执行一个命令,允许用户为文档创建一个特定的表格,但该用户能够随时决定表格的名称(因此他可以动态创建多个表格)。

\newcommand{\WIT}[2]{
    \eAddQuoteTableTokens{#1}
    \ifcsname c@#1\endcsname
        \relax
    \else
        \newcounter{#1}

        \expandafter\providecommand*{\csname #1QuoteTkTable\endcsname}{}%
        \expandafter\newtoks\csname @#1Quotetabtoks\endcsname%
        \expandafter\providecommand\csname Add#1QuoteTableToken\endcsname[1]{
            \expandafter\global\csname @#1Quotetabtoks\endcsname\expandafter{
                \expandafter\the\csname @#1Quotetabtoks##1\endcsname%
            }
        }

        \expandafter\providecommand\csname eAdd#1QuoteTableTokens\endcsname[1]{%
            \protected@edef\csname #1QuoteTkTable\endcsname{##1}%
            \expandafter\expandafter\csname Add#1QuoteTableToken\endcsname\expandafter{\csname #1QuoteTkTable\endcsname}%

            \expandafter\providecommand*{\csname #1Table\endcsname}{
                \begin{flushleft}
                    \textbf{#1:} \\
                    Total #1: \arabic{#1}h \\
                \end{flushleft}
                \begin{table}[h]
                    \begin{tabularx}{\textwidth}{llXr}
                        \expandafter\the\csname @#1Quotetabtoks\endcsname
                    \end{tabularx}
                \end{table}
            }
        }
    \fi

    \expandafter\providecommand\csname #1\endcsname[2]{
        \csname eAdd#1QuoteTableTokens\endcsname{##1 \hfill ##2}%
        \addtocounter{#1}{##2}%         
    }
}

因此,如果用户输入

\WIT{Analysis}
\WIT{Development}
\WIT{Management}

他应该能够使用以下命令

\Analysis{Analysis Activity 1}{30}
\Analysis{Analysis Activity 2}{40}
\Development{Development Activity 1}{150}
\Development{Development Activity 1}{340}
\Management{Management Activity 1}{20}
\Management{Management Activity 2}{35}

最后,他只需要使用

\ManagementTable
\AnalysisTable
\DevelopmentTable

根据设计,他使用 \Analysis、\Development 和 \Management 的顺序不应该对表格的最终结果产生任何影响。只有他输入这些内容的顺序才会对打印顺序产生影响。

我的问题是,我在@edef 附近遇到了错误,我无法得到解决方案(并且我很确定之后我还会遇到其他错误,但我不知道,因为我被困在那里)

提前致谢

答案1

您的代码存在几个问题,最值得注意的是:

  • 如果引用在宏中定义的命令的宏参数,则必须使用双引号#。例如,#1引用当前定义的第一个参数,##1可用于引用在另一个宏中定义的宏的参数。

  • 您必须确保以正确的顺序展开内容。 类似于 的内容\providecommand*{由三个标记组成,因此如果您在其前面加上\expandafter,则星号将首先展开(效果不大)。

在此处输入图片描述

\documentclass{article}

\makeatletter
\newcommand{\WIT}[1]%
  {\newcounter{#1}%
   \expandafter\def\csname#1Contents\endcsname{}%
   \expandafter\def\csname#1\endcsname##1##2
     {\addtocounter{#1}{##2}%
      \expandafter\g@addto@macro\csname#1Contents\endcsname{\\##1&##2}%
     }%
   \expandafter\def\csname#1Table\endcsname{\WITtable{#1}{\csname#1Contents\endcsname}}%
  }
\makeatother
\newcommand\WITtable[2]%
  {\begin{flushleft}
   \textbf{#1:} \\
   Total #1: \arabic{#1}h \\
   \end{flushleft}
   \begin{tabular}{@{}p{5cm}r@{}}
   Activity & Hours
   #2
   \end{tabular}
  }

\begin{document}
\WIT{Analysis}
\WIT{Development}
\WIT{Management}
\Analysis{Analysis Activity 1}{30}
\Analysis{Analysis Activity 2}{40}
\Development{Development Activity 1}{150}
\Development{Development Activity 1}{340}
\Management{Management Activity 1}{20}
\Management{Management Activity 2}{35}
\ManagementTable
\AnalysisTable
\DevelopmentTable
\end{document}

编辑:要使用单个命令生成所有表\SummaryTable,按照注释中的要求,添加以下两行:

\newcommand\SummaryTable{}% <<<<<<<<<<<<<<<<<<
\makeatletter
\newcommand{\WIT}[1]%
  {\newcounter{#1}%
   ...
   \expandafter\def\csname#1Table\endcsname{\WITtable{#1}{\csname#1Contents\endcsname}}%
   \g@addto@macro\SummaryTable{\csname#1Table\endcsname}% <<<<<<<<<<<<<<<<<<
  }
\makeatother

相关内容