我有一张表,我试图在每增加一步时将第一列增加 10。我看过几篇文章,它们展示了如何使用令牌来做到这一点,但我似乎做不到。当我执行以下操作时,它只会打印最终的“步骤”编号:
\newcounter{procstep}
\newtoks\@procitems
\newcommand\addprocitems[1]{\@procitems\expandafter{\the\@procitems#1}}
\newcommand*\resetprocitems{\@procitems{}}
\newcommand*\printprocitems{\the\@procitems}
\newcommand{\step}[1]{
\addprocitems{\theprocstep & #1 & \\}
\addtocounter{procstep}{10}
}
\NewEnviron{procedure}{
\setcounter{procstep}{10}
\vspace{0.1in}
\par
\begin{tabularx}{\textwidth}{|p{1cm}|X|p{1.5cm}|}
\hline
\textbf{Step} & \textbf{Instructions} & \textbf{Check} \\
\endhead
\BODY
\printprocitems
\hline
\end{tabularx}
}
例如如果我做了
\begin{procedure}
\step{Hello}
\step{How are you}
\end{procedure}
我会得到
30 Hello
30 How are you
而不是
10 Hello
20 How are you
答案1
我不认为这是一个必须用以下代码构建表格内容的例子tokens
N
我建议在array
执行添加操作的包中使用新的列类型,然后\step
命令显示该步骤。
原则上,\theprocstep
可以在类型中使用N
,但它也会在标题中打印数字。
\documentclass{article}
\usepackage{environ}
\usepackage{ltablex}
\usepackage{array}
\newcounter{procstep}
\newcolumntype{N}[1]{>{\addtocounter{procstep}{10}}p{#1}}
\newcommand{\step}[1]{%
\theprocstep & #1 & \\%
}
\makeatother
\NewEnviron{procedure}{%
\setcounter{procstep}{0}%
\vspace{0.1in}
\par
\begin{tabularx}{\textwidth}{|N{1cm}|X|p{1.5cm}|}
\hline
\textbf{Step} & \textbf{Instructions} & \textbf{Check} \\
\endhead
\BODY
\hline
\end{tabularx}
}
\begin{document}
\begin{procedure}
\step{foo}
\step{foobar}
\step{more foobar}
\end{procedure}
\end{document}
答案2
您可以按照自己设计的方式进行操作,但是\theprocstep
在添加到令牌列表寄存器之前,您必须完全扩展。
\documentclass{article}
\usepackage{tabularx,ltablex,environ}
\newcounter{procstep}
\makeatletter
\newtoks\@procitems
\newcommand\addprocitems[1]{\@procitems\expandafter{\the\@procitems#1}}
\newcommand*\resetprocitems{\@procitems{}}
\newcommand*\printprocitems{\the\@procitems}
\newcommand{\step}[1]{%
\addtocounter{procstep}{10}%
\edef\temp{\theprocstep}%
\expandafter\addprocitems\expandafter{\temp & #1 & \\}%
}
\NewEnviron{procedure}{%
\par
\vspace{0.1in}%
\setcounter{procstep}{0}% reset the counter
\BODY % build the table body
\begin{tabularx}{\textwidth}{|p{1cm}|X|p{1.5cm}|}
\hline
\textbf{Step} & \textbf{Instructions} & \textbf{Check} \\
\endhead
\printprocitems % deliver the table body
\hline
\end{tabularx}
}
\makeatother
\begin{document}
\begin{procedure}
\step{Hello}
\step{How are you}
\end{procedure}
\end{document}
xparse
为了完整性,我添加了带有和 的不同版本expl3
。
由于表格主体是在排版表格之前构建的,因此无需使用全局变量。我还添加了一个可选参数\step
,以防万一。
\documentclass{article}
\usepackage{tabularx,ltablex,environ,xparse}
\ExplSyntaxOn
\int_new:N \l_rossw_procedure_step_int
\tl_new:N \l_rossw_procedure_body_tl
\NewDocumentCommand{\step}{O{10}m}
{
\int_add:Nn \l_rossw_procedure_step_int { #1 }
\rossw_procedure_add_step:fn
{ \int_to_arabic:n { \l_rossw_procedure_step_int } }
{ #2 }
}
\cs_new_protected:Nn \rossw_procedure_add_step:nn
{
\tl_put_right:Nn \l_rossw_procedure_body_tl { #1 & #2 & \\ }
}
\cs_generate_variant:Nn \rossw_procedure_add_step:nn { f }
\NewEnviron{procedure}
{
\par
\vspace{0.1in}
\BODY % build the table body
\begin{tabularx}{\textwidth}{|p{1cm}|X|p{1.5cm}|}
\hline
\textbf{Step} & \textbf{Instructions} & \textbf{Check} \\
\endhead
\tl_use:N \l_rossw_procedure_body_tl % deliver the table body
\hline
\end{tabularx}
}
\ExplSyntaxOff
\begin{document}
\begin{procedure}
\step{Hello}
\step{How are you}
\step[5]{Half}
\end{procedure}
\end{document}