newcommand 问题

newcommand 问题

我正在使用 \newcommand 和 \ifdefined。我对以下代码有疑问,因为它会产生错误,但我不知道哪里出了问题:

\documentclass[a4paper,11pt,english]{report}

\usepackage{longtable}
 \usepackage{multirow}
 \usepackage{graphicx}
 \usepackage[table,xcdraw]{xcolor}

\begin{document}

\newcommand{\FailedReq}{
Nour
}

\newcommand{\ReqOpenIssues}{}

%\newcommand{\NoOpenIssues}{}

\newcommand{\OpenIssues}[1]{\ifcsname#1OpenIssues\endcsname \Failed#1 \else \ifdefined\NoOpenIssues NA \fi \fi 
}

\OpenIssues{Req}

\end{document}

有什么帮助吗?

答案1

这和你之前的问题完全一样,你尝试过

\ifdefined\#1OpenIssues

希望当宏的参数为时\#1OpenIssues成为。\ReqOpenIssuesReq

抱歉,但 TeX 使用的是在定义时形成的标记。在替换文本中,标记是

\ifdefined•\#•1•O•p•e•n•I•s•s•u•e•s

(项目符号只是为了清晰起见将标记分开)。特别是替换文本的那部分从来没有#•1标记参数替换的位置。

同样地

\Failed#1

是三个 token

\Failed•#•1

并且参数 replacement 得出

\Failed•R•e•q

(四个令牌)。

原语\ifcsname使用匹配的标记形成一个控制序列名称\endcsname;然后它测试该控制序列是否已定义。

对于手头的问题,你必须使用形成控制序列并执行它的相应原语,所以

\csname Failed#1\endcsname

\csname 和 \endcsname 到底起什么作用?

答案2

如果#1req,则 \Failed#1 与相同,并给出未定义\Failed req的错误。\Failed

您打算执行\FailedReq以便生成该命令名称,您应该将其替换\Failed#1\csname Failed#1\endcsname

相关内容