我的代码的哪一部分导致第一列错位?额外的空间似乎随着行数的增加而增加。(我的部分代码来自构建表时,如何在 foreach 或条件(或其他组/环境)中使用与号 (&)?)
代码:
\documentclass{article}
\makeatletter
\newtoks\@tabtoks
\newcommand\addtabtoks[1]{\global\@tabtoks\expandafter{\the\@tabtoks#1}}
\newcommand\eaddtabtoks[1]{\edef\mytmp{#1}\expandafter\addtabtoks\expandafter{\mytmp}}
\newcommand*\resettabtoks{\global\@tabtoks{}}
\newcommand*\printtabtoks{\the\@tabtoks}
\makeatother
\newcommand{\topic}[2]{%
\eaddtabtoks{Col 1 & Col 2 & Col 3 & #1 & #2}
\addtabtoks{\\}
}
\newenvironment{mytabular}{%
\resettabtoks
\tabular{llrrl}
}{%
\printtabtoks
\endtabular
}
\begin{document}
\begin{mytabular}
\topic{1.1}{LaTeX}
\topic{1.2}{causes}
\topic{1.3}{me}
\topic{1.4}{lots}
\topic{1.5}{of}
\topic{1.6}{frustration}
\end{mytabular}
\end{document}
输出:
答案1
通常情况下,罪魁祸首是行尾引入的杂散空格。由于标记列表的性质(在tabular
流程结束时添加到),所有这些杂散空格都会在标记列表被转储之前添加,这意味着所有杂散空格都会作为单元格 (1,1) 的前导填充添加。
在这种情况下,修复不仅意味着%
在宏定义中的行尾添加一些,而且还意味着合并\ignorespaces
到的定义中\topic
,因为每次调用时\topic
,杂散空格也会作为输入流的一部分引入。
我还概括地mytabular
将格式作为一个参数。
\documentclass{article}
\usepackage[T1]{fontenc}
\makeatletter
\newtoks\@tabtoks
\newcommand\addtabtoks[1]{\global\@tabtoks\expandafter{\the\@tabtoks#1}}
\newcommand\eaddtabtoks[1]{\edef\mytmp{#1}\expandafter\addtabtoks\expandafter{\mytmp}}
\newcommand*\resettabtoks{\global\@tabtoks{}}
\newcommand*\printtabtoks{\the\@tabtoks}
\newcommand{\topic}[2]{%
\eaddtabtoks{Col 1 & Col 2 & Col 3 & #1 & #2}%
\addtabtoks{\\}%
\ignorespaces
}
\newenvironment{mytabular}[1]{%
\resettabtoks
\noindent
\begin{tabular}{#1}%
}{%
\printtabtoks
\end{tabular}
}
\makeatother
\begin{document}
\begin{mytabular}{llrrl}
\topic{1.1}{LaTeX}
\topic{1.2}{causes}
\topic{1.3}{me}
\topic{1.4}{lots}
\topic{1.5}{of}
\topic{1.6}{frustration}
\end{mytabular}
\end{document}