我定义了一些 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}