我正在尝试创建一个水平枚举环境,每行有 3 个项目。如示例中所示,\ifferstitem
条件似乎毫无理由地从 FALSE 变为 TRUE(至少对我来说)。我怀疑存在一个有关条件值的深奥程序,但我在通常的 TEX 书籍中没有找到任何内容。
A。我的代码有什么问题?
B.由于我不熟练使用宏,有没有更好的方法来实现这个?(例如,我觉得\taband
可以避免使用命令)
\documentclass[11pt]{article}
\begin{document}
\newcounter{tabi}\stepcounter{tabi}
\newcounter{tabirow}
\newif \iffirstitem
\firstitemtrue
\newcommand{\taband}{&}
\newcommand{\addand}{\iffirstitem \firstitemfalse TruetoFalse
\else\taband \& Added
\fi}
%If 3 items in the row then change row and reset tabirow
\newcommand{\hitem}{\ifnum \thetabirow<3
\addand
\hbox to 3em{\hfil \roman{tabi}) \thetabirow}
\stepcounter{tabi}
\stepcounter{tabirow}
\else
\\[2ex]
\firstitemtrue
\setcounter{tabirow}{0}
\addand
\hbox to 3em{\hfil \roman{tabi}) \thetabirow}
\stepcounter{tabi}
\stepcounter{tabirow}
\fi
}
\newenvironment{henumerate}[1]
{ \setcounter{tabi}{1}
\setcounter{tabirow}{0}
\begin{tabular}{| l | l | l |}
\hline
}
{\\\hline
\end{tabular}
}
\begin{henumerate}{5}
\hitem First
\hitem Second
\hitem Wrong
\hitem D
\hitem E
\hitem F
\hitem G
\hitem H
\end{henumerate}
\\
\end{document}
答案1
您正在更改表格单元格内的条件值。TeX 中的表格单元格是组,因此其中的本地赋值仅在&
(或\\
)之前有效。
您可以通过进行分配来更改此设置。只需在每个and之前\global
添加:\global
\firstitemtrue
\firstitemfalse
\documentclass[11pt]{article}
\begin{document}
\newcounter{tabi}\stepcounter{tabi}
\newcounter{tabirow}
\newif \iffirstitem
\global\firstitemtrue
\newcommand{\taband}{&}
\newcommand{\addand}{\iffirstitem \global\firstitemfalse TruetoFalse
\else\taband \& Added
\fi}
%If 3 items in the row then change row and reset tabirow
\newcommand{\hitem}{\ifnum \thetabirow<3
\addand
\hbox to 3em{\hfil \roman{tabi}) \thetabirow}
\stepcounter{tabi}
\stepcounter{tabirow}
\else
\\[2ex]
\global\firstitemtrue
\setcounter{tabirow}{0}
\addand
\hbox to 3em{\hfil \roman{tabi}) \thetabirow}
\stepcounter{tabi}
\stepcounter{tabirow}
\fi
}
\newenvironment{henumerate}[1]
{ \setcounter{tabi}{1}
\setcounter{tabirow}{0}
\begin{tabular}{| l | l | l |}
\hline
}
{\\\hline
\end{tabular}
}
\begin{henumerate}{5}
\hitem First
\hitem Second
\hitem Wrong
\hitem D
\hitem E
\hitem F
\hitem G
\hitem H
\end{henumerate}
\\
\end{document}
导致您使用的问题\taband
在处理 TeX 条件时很常见:对于哪些代码可以出现在 then 和 else 块中有一些限制。这可以通过改用bool
s from 来避免etoolbox
:
\documentclass[11pt]{article}
\usepackage{etoolbox}
\begin{document}
\newcounter{tabi}\stepcounter{tabi}
\newcounter{tabirow}
\newbool{firstitem}
\global\booltrue{firstitem}
\newcommand{\addand}{%
\ifbool{firstitem}%
{\global\boolfalse{firstitem}TruetoFalse}%
{&\& Added}%
}
%If 3 items in the row then change row and reset tabirow
\newcommand{\hitem}{\ifnum \thetabirow<3
\addand
\hbox to 3em{\hfil \roman{tabi}) \thetabirow}
\stepcounter{tabi}
\stepcounter{tabirow}
\else
\\[2ex]
\global\booltrue{firstitem}
\setcounter{tabirow}{0}
\addand
\hbox to 3em{\hfil \roman{tabi}) \thetabirow}
\stepcounter{tabi}
\stepcounter{tabirow}
\fi
}
\newenvironment{henumerate}[1]
{ \setcounter{tabi}{1}
\setcounter{tabirow}{0}
\begin{tabular}{| l | l | l |}
\hline
}
{\\\hline
\end{tabular}
}
\begin{henumerate}{5}
\hitem First
\hitem Second
\hitem Wrong
\hitem D
\hitem E
\hitem F
\hitem G
\hitem H
\end{henumerate}
\\
\end{document}