我的目标是创建一个具有以下属性的表。
对于偶数个项目:
对于奇数个项目:
最小工作示例如下。
\documentclass[12pt]{article}
\usepackage{longtable,array}
\newcounter{counter}
\makeatletter
\newcolumntype\specifier{%
|
*2{>{\centering\stepcounter{counter}\thecounter}m{1cm}
|>{\centering}m{0.5\dimexpr\linewidth-2cm-8\tabcolsep-5\arrayrulewidth\relax}
|}
}
\def\row[#1]#2{%
& \parbox[c][0.2\dimexpr\textheight-6\arrayrulewidth-\topskip\relax][c]{\linewidth}{\centering #1 \par \vspace{15pt} #2}
\ifodd\value{counter}
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{&}{\tabularnewline\hline}
}
\let\oldendlongtable\endlongtable
\def\endlongtable{%
\ifodd\value{counter}\omit\tabularnewline\cline{1-2}\fi
\oldendlongtable}
\makeatother
\pagestyle{empty}
% option 1
%\AtBeginDocument{\topskip=0pt\relax\begin{longtable}{\specifier}\hline}
%\AtEndDocument{\end{longtable}}
\begin{document}
% option 2
\topskip=0pt\relax
\begin{longtable}{\specifier}\hline
\row[A]{B}
\row[C]{D}
\row[E]{F}
% option 2
\end{longtable}
\end{document}
问题
由于我不想在这里解释太多的原因,我想将两者都移到
% option 2
\topskip=0pt\relax
\begin{longtable}{\specifier}\hline
和
% option 2
\end{longtable}
到
% option 1
\AtBeginDocument{\topskip=0pt\relax\begin{longtable}{\specifier}\hline}
\AtEndDocument{\end{longtable}}
换句话说,我想禁用选项 2 并启用选项 1。如果我这样做,我会收到两种错误:
- 对于偶数个项目,代码完全不可编译。
- 对于奇数个项目,代码是可编译的,但输出是错误的。
为了简单起见,请大家自己尝试一下。那么,如何解决呢?
笔记:
上面的输入文件专门用于创建表格,因此正文仅包含行宏。当然不允许使用其他排版宏。
我不想重新定义,
\document
因为我有大量的输入文件使用我的包来定义夹在和之间的代码\makeatletter
,\makeatother
如上所示。
答案1
定义一个longtabledocument
环境。
\documentclass[12pt]{article}
\usepackage{longtable,array}
\newcounter{counter}
\makeatletter
\newcolumntype\specifier{%
|
*2{>{\centering\stepcounter{counter}\thecounter}m{1cm}
|>{\centering}m{0.5\dimexpr\linewidth-2cm-8\tabcolsep-5\arrayrulewidth\relax}
|}
}
\def\row[#1]#2{%
& \parbox[c][0.2\dimexpr\textheight-6\arrayrulewidth-\topskip\relax][c]{\linewidth}{\centering #1 \par \vspace{15pt} #2}
\ifodd\value{counter}
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{&}{\tabularnewline\hline}
}
\makeatother
\pagestyle{empty}
\newenvironment{longtabledocument}
{\document
\topskip=0pt
\begin{longtable}{\specifier}\hline}
{\ifodd\value{counter}\omit\tabularnewline\cline{1-2}\fi
\end{longtable}\enddocument}
\begin{longtabledocument}
\row[A]{B}
\row[C]{D}
\row[E]{F}
\end{longtabledocument}
或者,使用etoolbox
:
\documentclass[12pt]{article}
\usepackage{longtable,array,etoolbox}
\newcounter{counter}
\makeatletter
\newcolumntype\specifier{%
|
*2{>{\centering\stepcounter{counter}\thecounter}m{1cm}
|>{\centering}m{0.5\dimexpr\linewidth-2cm-8\tabcolsep-5\arrayrulewidth\relax}
|}
}
\def\row[#1]#2{%
& \parbox[c][0.2\dimexpr\textheight-6\arrayrulewidth-\topskip\relax][c]{\linewidth}{\centering #1 \par \vspace{15pt} #2}
\ifodd\value{counter}
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{&}{\tabularnewline\hline}
}
\makeatother
\pagestyle{empty}
\topskip=0pt
\AfterEndPreamble{%
\begin{longtable}{\specifier}\hline
}
\preto\enddocument{\ifodd\value{counter}\omit\tabularnewline\cline{1-2}\fi\end{longtable}}
\begin{document}
\row[A]{B}
\row[C]{D}
\row[E]{F}
\end{document}