我是制作宏的新手,正在构建一个包来制作课程大纲。我希望用户输入房间/日期/时间信息,如下所示(其中所有内容都已简化为仅使用房间)
\newcounter{RoomCount}
\NewDocumentCommand\Room{R(){TBA}}{%
\stepcounter{RoomCount}%
\expandafter\newcommand\csname Room\theRoomCount\endcsname{#1}%
}
此时,我想将这些信息输入到表格环境中,以格式化房间/日期/时间信息。为此,我想要一个宏,为输入的每个房间/日期/时间组合输出 1 行。然后,将在表格环境中执行此宏以构建表格。
\NewDocumentCommand\buildrows{}{%
\newbool{myBool}%
\booltrue{myBool}%
\newcounter{rownum}%
\whileboolexpr{myBool}{%
\stepcounter{rownum}%
\ifcsdef{Room\therownum}%
{\csname Room\therownum\endcsname\\}%
{\boolfalse{myBool}}%
}%
}
循环的目的是:检查用户是否输入了第二个房间,如果是,则为 tabular 写一行,如果没有,则将 myBool 设置为 false,以便退出循环。但是,以下代码会产生许多“package etoolbox error: invalid boolean expression”错误
\begin{document}
\Room(C244)
\begin{tabular}{l}
\buildrows{}
\end{tabular}
\end{document}
此时,我没有足够的“工具箱”来找出我做错的地方,因此任何帮助/建议都将不胜感激。谢谢! 附言。完整的示例如下:
\documentclass{report}
\usepackage{xparse}
\usepackage{etoolbox}
\newcounter{RoomCount}
\NewDocumentCommand\Room{+R(){TBA}}{%
\stepcounter{RoomCount}%
\expandafter\newcommand\csname Room\theRoomCount\endcsname{#1}%
}
\NewDocumentCommand\buildrows{}{%
\newbool{myBool}%
\booltrue{myBool}%
\newcounter{rownum}%
\whileboolexpr{myBool}{%
\stepcounter{rownum}%
\ifcsdef{Room\therownum}%
{\csname Room\therownum\endcsname}%
{\boolfalse{myBool}}%
}%
}
\begin{document}
\Room(C244)
\begin{tabular}{l}
\buildrows{}
\end{tabular}
\end{document}
答案1
你所犯过的一些小错误:
- 如果你在命令定义中设置了
\newbool{myBool}
和,那么每次调用命令时都会定义命令。所以必须事先进行定义。\newcounter{rownum}
\buildrows
\buildrows
- 该命令
\whileboolexpr
不接受单个布尔值。 的第一个参数whileboolexpr
计算第一个参数的值。 这在文档第 3.6.5 节。 - 这确实是一个提示:您可以使用提供的
\expandafter
命令,而不是使用。\csdef
etoolbox
以下是完整的 MWE
\documentclass{report}
\usepackage{xparse}
\usepackage{etoolbox}
\newcounter{RoomCount}
\NewDocumentCommand\Room{+R(){TBA}}{%
\stepcounter{RoomCount}%
\csdef{Room\theRoomCount}{#1}%
}
\newbool{myBool}%
\newcounter{rownum}%
\setcounter{rownum}{0}
\NewDocumentCommand\buildrows{}{%
\booltrue{myBool}%
\whileboolexpr{ bool {myBool} }{%
\stepcounter{rownum}%
\ifcsdef{Room\therownum}%
{\csname Room\therownum\endcsname}%
{\boolfalse{myBool}}%
}%
}
\begin{document}
\Room(C244)
\Room(C247)
\begin{tabular}{l}
\buildrows{}
\end{tabular}
\buildrows{}
\end{document}