尝试增加表中的计数器

尝试增加表中的计数器

我有一张表,我试图在每增加一步时将第一列增加 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}

enter image description here

答案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}

enter image description here

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}

enter image description here

相关内容