etoolbox:布尔表达式的问题

etoolbox:布尔表达式的问题

我是制作宏的新手,正在构建一个包来制作课程大纲。我希望用户输入房间/日期/时间信息,如下所示(其中所有内容都已简化为仅使用房间)

\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命令,而不是使用。\csdefetoolbox

以下是完整的 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}

相关内容