因此,我正在从事的项目涉及词汇表。现在,我已经知道如何排版,但我还想以良好的 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
,它将查看切换是真还是假,并根据结果采取行动。