问题

问题

我的目标是创建一个具有以下属性的表。

  • 对于偶数个项目:

    在此处输入图片描述

  • 对于奇数个项目:

    在此处输入图片描述

最小工作示例如下。

\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}

相关内容