如何创建仅生成表格行的一部分的宏?

如何创建仅生成表格行的一部分的宏?

因此,我正在从事的项目涉及词汇表。现在,我已经知道如何排版,但我还想以良好的 LaTeX 风格抽象出布局的细节。词汇表将采用基本的两列布局。以下是可运行的代码,它至少可以生成所需的输出:

\documentclass[hidelinks,draft]{article}
\usepackage[inner=4cm,outer=2cm]{geometry}
\usepackage{booktabs}
\usepackage{array}

\newcommand{\GlossaryEntry}[3]{#1 & #2 & #3}

\begin{document}
\begin{tabular}
{>{\bfseries}l>{\itshape}c<{.}l >{\bfseries}l>{\itshape}c<{.}l}
\toprule
\GlossaryEntry{foo}{n}{lorem ipsum dolor sit} & 
\GlossaryEntry{qux}{adj}{consectetur adipiscing elit} \\
\GlossaryEntry{bar}{v}{sed do eiusmod tempor} &
\GlossaryEntry{baz}{prep}{incididunt ut labore et dolore} \\
\bottomrule
\end{tabular}

\end{document}

在此处输入图片描述

现在,这是可行的,但请注意,我仍然需要担心我在哪一列,并根据需要插入&\\。我想要的是这样的:

\documentclass[hidelinks,draft]{article}
\usepackage[inner=4cm,outer=2cm]{geometry}
\usepackage{booktabs}
\usepackage{array}
\usepackage{xifthen}

\newboolean{TabRowStart}
\setboolean{TabRowStart}{true}


\newcommand{\GlossaryEntry}[3]{
\ifthenelse{\boolean{TabRowStart}}
    {\setboolean{TabRowStart}{false}#1 & #2 & #3 &}
    {\setboolean{TabRowStart}{true}#1 & #2 & #3 \\}
}


\begin{document}
\begin{tabular}{>{\bfseries}l>{\itshape}c<{.}l >{\bfseries}l>{\itshape}c<{.}l}
\toprule
\GlossaryEntry{foo}{n}{lorem ipsum dolor sit}
\GlossaryEntry{qux}{adj}{consectetur adipiscing elit}
\GlossaryEntry{bar}{v}{sed do eiusmod tempor}
\GlossaryEntry{baz}{prep}{incididunt ut labore et dolore}
\bottomrule
\end{tabular}

\end{document}

我有一个布尔值,用于检查我是在每行的第一部分还是第二部分,然后采取相应的行动

不幸的是,此代码无法编译。当我尝试编译它时,出现以下错误:

! Extra alignment tab has been changed to \cr.
<recently read> \endtemplate 

l.22 ...Entry{qux}{adj}{consectetur adipiscing elit}

\\我最初的想法是,这与命令中的使用有关。然而,奇怪的是,这段代码运行正常:

...
\newcommand{\GlossaryEntryDouble}[6]{%
#1 & #2 & #3 & #4 & #5 & #6 \\
}

\begin{document}
\begin{tabular}{>{\bfseries}l>{\itshape}c<{.}l >{\bfseries}l>{\itshape}c<{.}l}
\toprule
\GlossaryEntryDouble{foo}{n}{lorem ipsum dolor sit}{qux}{adj}{consectetur adipiscing elit} 
\GlossaryEntryDouble{bar}{v}{sed do eiusmod tempor}{baz}{prep}{incididunt ut labore et dolore}
\bottomrule
\end{tabular}
...

因此看起来并不是由于其\\本身的存在导致了这个问题。

答案1

布尔值应该全局设置,因为单元格形成组。

但是,如果条目数是奇数,您就会遇到麻烦,因此必须使用可扩展测试。

\documentclass[draft]{article}
\usepackage[inner=4cm,outer=2cm]{geometry}
\usepackage{booktabs}
\usepackage{array}
\usepackage{etoolbox}

\newtoggle{TabRowStart}
\toggletrue{TabRowStart}


\newcommand{\GlossaryEntry}[3]{%
  \iftoggle{TabRowStart}
    {\global\togglefalse{TabRowStart}#1 & #2 & #3 &}
    {\global\toggletrue{TabRowStart}#1 & #2 & #3 \\}%
}
\newcommand{\xbottomrule}{%
  \iftoggle{TabRowStart}{\bottomrule}{\\\bottomrule}%
}

\begin{document}
\begin{tabular}{>{\bfseries}l>{\itshape}c<{.}l >{\bfseries}l>{\itshape}c<{.}l}
\toprule
\GlossaryEntry{foo}{n}{lorem ipsum dolor sit}
\GlossaryEntry{qux}{adj}{consectetur adipiscing elit}
\GlossaryEntry{bar}{v}{sed do eiusmod tempor}
\GlossaryEntry{baz}{prep}{incididunt ut labore et dolore}
\xbottomrule
\end{tabular}

\bigskip

\begin{tabular}{>{\bfseries}l>{\itshape}c<{.}l >{\bfseries}l>{\itshape}c<{.}l}
\toprule
\GlossaryEntry{foo}{n}{lorem ipsum dolor sit}
\GlossaryEntry{qux}{adj}{consectetur adipiscing elit}
\GlossaryEntry{bar}{v}{sed do eiusmod tempor}
\GlossaryEntry{baz}{prep}{incididunt ut labore et dolore}
\GlossaryEntry{baz}{prep}{incididunt ut labore et dolore}
\xbottomrule
\end{tabular}

\end{document}

请注意,您必须使用\xbottomrule,它将查看切换是真还是假,并根据结果采取行动。

在此处输入图片描述

相关内容