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