![复杂示例中 pgffor 的计数器值](https://linux22.com/image/338176/%E5%A4%8D%E6%9D%82%E7%A4%BA%E4%BE%8B%E4%B8%AD%20pgffor%20%E7%9A%84%E8%AE%A1%E6%95%B0%E5%99%A8%E5%80%BC.png)
从这个答案我学习了如何使用 pgffor 将行打印到 1 列表中:
| 1 |
| 2 |
| 3 |
代码如下:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{pgffor}
\makeatletter
\newtoks\@tabtoks
\newcommand\addtabtoks[1]{\global\@tabtoks\expandafter{\the\@tabtoks#1}}
\newcommand*\resettabtoks{\global\@tabtoks{}}
\newcommand*\printtabtoks{\the\@tabtoks}
\makeatother
\begin{document}
\resettabtoks
\foreach \i in {1,...,3} {%
\expandafter\addtabtoks\expandafter{\i \\\hline}%
}
\begin{tabular}{ | c | }
\hline
\printtabtoks
\end{tabular}
\end{document}
然后我想改进它并得到一个有两列的表格:
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
使用宏和简单扩展,我创建了以下代码:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{pgffor}
\newcommand{\myline}[1]{
#1 & #1\\ \hline
}
\makeatletter
\newtoks\@tabtoks
\newcommand\addtabtoks[1]{\global\@tabtoks\expandafter{\the\@tabtoks#1}}
\newcommand*\resettabtoks{\global\@tabtoks{}}
\newcommand*\printtabtoks{\the\@tabtoks}
\makeatother
\begin{document}
%1-st attempt
\resettabtoks
\foreach \i in {1,...,3} {%
\expandafter\addtabtoks\expandafter{\i & \i\\\hline}
}
\begin{tabular}{ | c | c | }
\hline
\printtabtoks
\end{tabular}
%2-nd attempt
\resettabtoks
\foreach \i in {1,...,3} {%
\expandafter\addtabtoks\expandafter{\myline{\i}}
}
\begin{tabular}{ | c | c | }
\hline
\printtabtoks
\end{tabular}
\end{document}
第一次尝试得到:
| 1 | l |
| 2 | l |
| 3 | l |
第二次尝试得到:
| l | l |
| l | l |
| l | l |
为什么显示的是“l”而不是 \i 值?如何解决?
答案1
使用更新后的代码https://tex.stackexchange.com/a/165149/4035你可以做
\documentclass[10pt,a4paper]{article}
\usepackage{pgffor}
\makeatletter
\newtoks\@tabtoks
%%% assignments to \@tabtoks must be global, because they are done in \foreach
\newcommand\addtabtoks[2][]{%
\if\relax\detokenize{#1}\relax
% no index, just append the second argument
\global\@tabtoks\expandafter{\the\@tabtoks#2}%
\else
% we assume the second argument is a one parameter macro
\global\@tabtoks\expandafter{\the\expandafter\@tabtoks\expandafter#2\expandafter{#1}}%
\fi
}
%%% variable should always be operated on always locally or always globally
\newcommand*\resettabtoks{\global\@tabtoks{}}
\newcommand*\printtabtoks{\the\@tabtoks}
\makeatother
\newcommand{\myline}[1]{%
#1 & #1 \\
}
\begin{document}
\resettabtoks
\foreach \i in {1,2,...,5}{%
\addtabtoks[\i]{\myline}%
}
\begin{tabular}{ | c | c | }
\hline
\printtabtoks
\hline
\end{tabular}
\end{document}
答案2
\expandafter\addtabtoks\expandafter{\i & \i\\\hline}
仅扩展第一个,\i
因此您要添加1&\i
然后第二列在每次迭代时都会获得相同的值。2&\i
3&\i
你可以使用
\edef\x{\noexpand\addtabtoks{\i & \i\noexpand\\ \noexpand\hline}}
\x
\i
在添加到令牌寄存器之前,充分扩展这两个实例。