在对表格进行后处理的实验中,我遇到了与 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}