我正在尝试使用从一组命令获得的值填充变量列表(在附加示例中以 开头\@addressone
)。第一个变量将获取我拥有的任何值中的第一个,第二个变量将获取第二个,依此类推,直到值用完,从那时起所有变量都将为空。我尝试使用嵌套的 if 语句来执行此操作:
\def \mystreet#1{\def\@mystreet{#1}} % Defines the \name command to set name
\def \mycity#1{\def\@mycity{#1}} % Defines the \name command to set name
\def \myphone#1{\def\@myphone{#1}} % Defines the \name command to set name
\def \myemail#1{\def\@myemail{#1}} % Defines the \name command to set name
\def \myurl#1{\def\@myurl{#1}} % Defines the \name command to set name
\let \@mystreet \relax
\let \@mycity \relax
\let \@myphone \relax
\let \@myemail \relax
\let \@myurl \relax
\ifdefined\@mystreet
\def \@addressone {\@mystreet}
\else
\ifdefined\@mycity
\def \@addressone {\@mycity}
\else
\ifdefined\@myphone
\def \@addressone {\@myphone}
\else
\ifdefined\@myemail
\def \@addressone {\@myemail}
\else
\ifdefined\@myurl
\def \@addressone {\@myurl}
\else
\def \@addressone {}
\fi
\fi
\fi
\fi
\fi
除了第一个 if 语句之外,所有这些似乎都被忽略了。如果\@mystreet
未定义,\@addressone
则为空,即使 say\@mycity
已定义。
评论:事实证明我的问题与嵌套语句无关\ifdefined
(它们的工作方式正如您期望的那样),而是与 LaTeX 如何以及何时决定使用此类的文件中的用户输入被视为已定义变量有关。
答案1
主要错误是\relax
未定义。此测试文件完整,可以通过 latex 运行,终端输出为
macro:->
macro:->streeeet
macro:->ciiity2222
我认为这就是您在这三种情况下想要的。
\makeatletter
\def \mystreet#1{\def\@mystreet{#1}} % Defines the \name command to set name
\def \mycity#1{\def\@mycity{#1}} % Defines the \name command to set name
\def \myphone#1{\def\@myphone{#1}} % Defines the \name command to set name
\def \myemail#1{\def\@myemail{#1}} % Defines the \name command to set name
\def \myurl#1{\def\@myurl{#1}} % Defines the \name command to set name
\def\test#1{%
\let \@mystreet \@undefined
\let \@mycity \@undefined
\let \@myphone \@undefined
\let \@myemail \@undefined
\let \@myurl \@undefined
#1%
\ifdefined\@mystreet
\let\@addressone\@mystreet
\else%
\ifdefined\@mycity
\let\@addressone\@mycity
\else%
\ifdefined\@myphone
\ley\@addressone\@myphone
\else%
\ifdefined\@myemail
\let\@addressone \@myemail
\else%
\ifdefined\@myurl
\let\@addressone\@myurl
\else
\let\@addressone\@empty
\fi
\fi
\fi
\fi
\fi}
\test{}
\typeout{\meaning\@addressone}
\test{\mystreet{streeeet}\mycity{ciiity}}
\typeout{\meaning\@addressone}
\test{\mycity{ciiity2222}}
\typeout{\meaning\@addressone}
\stop