为什么 docsvlist 在某个环境中不起作用?

为什么 docsvlist 在某个环境中不起作用?

在对表格进行后处理的实验中,我遇到了与 docsvlist 有关的差异。当直接在文档中调用时,相同的代码可以工作(显示带有 b... 的表格),但当嵌入到环境的 enddef 中时,则不行(显示带有 Γ Γ... 的表格)。

我几乎不敢问这是否是一个错误,因为 TeX 给初学者带来了太多惊喜。那么,我应该怎么做才能让它在 enddef 中工作。

\documentclass[12pt]{article}
\usepackage{expl3,xparse,ifthen,etoolbox}
\newcounter{Nr}

\NewDocumentEnvironment{Test}{s O{t}}{%
}{%
  \setcounter{Nr}{0}
  \renewcommand*{\do}[1]{%
    \ifnumequal{\value{Nr}}{2}{\\\setcounter{Nr}{0}}{}%
    \stepcounter{Nr}%
    #1
    \ifnumequal{\value{Nr}}{2}{}{&}%
  }%
  \begin{tabular}{cc}%
    \docsvlist{a,b,c,d,e,f,}
  \end{tabular}%
}%

\begin{document}
%
\begin{Test}
\end{Test}
\hspace{1cm}
\setcounter{Nr}{0}
  \renewcommand*{\do}[1]{%
    \ifnumequal{\value{Nr}}{2}{\\\setcounter{Nr}{0}}{}%
    \stepcounter{Nr}%
    #1%
    \ifnumequal{\value{Nr}}{2}{}{&}%
  }%
  \begin{tabular}{cc}%
    \docsvlist{a,b,c,d,e,f,}%
  \end{tabular}%
%
\end{document}

答案1

它确实在环境中起作用,但您必须使用##1,即的参数\do,而不是#1,它是环境的第一个参数test,意味着starred这里的参数,它将“始终”打印为 Γ。

在其他宏中定义命令需要将字符加倍#以访问“本地”参数,即##1##2等等。如果这个内部宏有进一步的宏定义,则最内层宏的字符##1将变成等等。####1

\documentclass[12pt]{article}
\usepackage{xparse,ifthen,etoolbox}
\newcounter{Nr}

\NewDocumentEnvironment{Test}{s O{t}}{%
}{%
  \setcounter{Nr}{0}
  \renewcommand*{\do}[1]{%
  \ifnumequal{\value{Nr}}{2}{\\\setcounter{Nr}{0}}{}%
    \stepcounter{Nr}%
    ##1%
    \ifnumequal{\value{Nr}}{2}{}{&}%
  }%
  \begin{tabular}{cc}%
    \docsvlist{a,b,c,d,e,f,}
  \end{tabular}%
}%

\begin{document}
%
\begin{Test}
\end{Test}
\hspace{1cm}
\setcounter{Nr}{0}
\renewcommand*{\do}[1]{%
  \ifnumequal{\value{Nr}}{2}{\\\setcounter{Nr}{0}}{}%
  \stepcounter{Nr}%
  #1%
  \ifnumequal{\value{Nr}}{2}{}{&}%
}%
\begin{tabular}{cc}%
  \docsvlist{a,b,c,d,e,f,}%
\end{tabular}%
%
\end{document}

在此处输入图片描述

ifthen无软件包的精简版本

\documentclass[12pt]{article}
\usepackage{xparse,etoolbox}
\newcounter{Nr}

\NewDocumentEnvironment{Test}{s O{t}}{%
}{%
  \setcounter{Nr}{0}%
  \renewcommand*{\do}[1]{%
    \ifnum2=\value{Nr}\relax%
    \\\setcounter{Nr}{0}%
    \fi
    \stepcounter{Nr}%
    ##1%
    \ifnum2=\value{Nr}\relax%
    \else \unexpanded{&} \fi
  }%
  \begin{tabular}{cc}%
    \docsvlist{a,b,c,d,e,f,}
  \end{tabular}%
}%

\begin{document}
%
\begin{Test}
\end{Test}
\end{document}

相关内容