如何针对未定义的控制序列生成警告

如何针对未定义的控制序列生成警告

我定义了一些 setter 和 getter 命令,以方便将复杂内容输入到我的文档中。基本定义如下:

\newcommand\aeset[3]{\expandafter\newcommand\csname ae@#1@#2\endcsname{#3}}
\newcommand\aeget[2]{\csname ae@#1@#2\endcsname}

我遇到的问题是,如果定义以下内容

\aeset{this}{is}{an experiment}

然后尝试用

\aeget{that}{is}

该命令只是扩展为,\relax而不会发出警告

\ae@that@is

不是定义的控制序列。有没有一种简单的方法可以解决这个问题,而不必手动将所有测试参数写入我的 getter?

答案1

您可以使用\ifcsname...\endcsname,它测试未定义或\relax控制序列:

\documentclass{article}

\makeatletter
\newcommand\aeset[3]{\expandafter\newcommand\csname ae@#1@#2\endcsname{#3}}
\newcommand\aeget[2]{%
  \ifcsname ae@#1@#2\endcsname
    \csname ae@#1@#2\endcsname
  \else
    \@latex@warning{`\string\ae{#1}{#2}' does not exist}%
  \fi
}
\makeatother

\begin{document}

\aeset{this}{is}{an experiment}%

get:\aeget{that}{is}

\end{document}

以上产生警告

LaTeX 警告:输入行 18 中不存在‘\ae{that}{is}’。

答案2

\documentclass{article}
\makeatletter
\newcommand\aeset[3]{\@namedef{ae@#1@#2}{#3}}
\newcommand*\aeget[2]{%
  \ifcsname ae@#1@#2\endcsname\@nameuse{ae@#1@#2}
    \else\@latex@warning{`\string\ae{#1}{#2}' does not exist} undefined!!!\fi}
\makeatother

\begin{document}    
    \aeset{this}{is}{an experiment} 

    get: \aeget{this}{is} 

    get: \aeget{that}{is}   
\end{document}

在此处输入图片描述

相关内容