在建立名称后测试名称是否已定义

在建立名称后测试名称是否已定义

我想测试 是否\solflag已定义或 是否\profflag已定义。我想使用一个宏来实现这一点,该宏的参数可以是“sol”或“prof”(或其他词)。

我对此的“最小(非)工作示例”尝试是

\documentclass{article}
\RequirePackage{ifthen}
\newcommand{\solflag}{}
\newcommand{\mytest}[1]
   {\ifthenelse{\isundefined{\#1flag}} {UNDEFINED}{DEFINED}}

\begin{document}

Sol test: \mytest{sol}

Bar test: \mytest{bar}

2nd bar test: \ifthenelse{\isundefined{\barflag}} {UNDEFINED}{DEFINED}

\end{document}

但结果是这样的:

Sol test: DEFINED
Bar test: DEFINED
2nd bar test: UNDEFINED

我的猜测是,第一个“Bar”测试正在检查是否\bar已定义,即宏中的\#1和的连接flag没有发生或者其他情况。

我怀疑我需要的答案就在 LaTeX-Fu 的某个地方这个答案,但我实在想不通。

我可以实现我希望做的事吗?

答案1

这个etoolbox包里有很多好东西,适用于这些和其他低级的东西。

\documentclass{article}
\RequirePackage{etoolbox}
\newcommand{\solflag}{}
\newcommand{\mytest}[1]{\ifcsdef{#1flag}{DEFINED}{UNDEFINED}}
\begin{document}
Sol test: \mytest{sol}

Bar test: \mytest{bar}
\end{document}

在此处输入图片描述

该软件包提供的其他类似测试包括\ifdef、、、等等。\ifundef\ifcsundef\ifdefmacro\ifcsmacro

答案2

当你写作时

\#1flag

你有六个代币

\# • 1 • f • l • a • g

(我使用易读性来区分标记)。你可能更适合使用

\documentclass{article}
\usepackage{ifthen}
\newcommand{\solflag}{}
\newcommand{\mytest}[1]{%
  \ifthenelse{\expandafter\isundefined\expandafter{\csname #1flag\endcsname}}
    {UNDEFINED}{DEFINED}% 
}

\begin{document}

Sol test: \mytest{sol}

Bar test: \mytest{bar}

2nd bar test: \ifthenelse{\isundefined{\barflag}} {UNDEFINED}{DEFINED}

\end{document}

\barflag在进行评估之前准备好令牌\ifthenelse

在此处输入图片描述

LaTeX 内核已经有一个用于此的宏:

\documentclass{article}
\usepackage{ifthen}
\newcommand{\solflag}{}

\makeatletter
\newcommand{\mytest}[1]{%
  \@ifundefined{#1flag}{UNDEFINED}{DEFINED}%
}
\makeatother

\begin{document}

Sol test: \mytest{sol}

Bar test: \mytest{bar}

2nd bar test: \ifthenelse{\isundefined{\barflag}} {UNDEFINED}{DEFINED}

\end{document}

然而,这会导致以下基于的测试\isundefined返回 true。

如果你计划同时使用这两种测试,请使用

\documentclass{article}
\usepackage{ifthen}
\newcommand{\solflag}{}
\makeatletter
\newcommand{\mytest}[1]{%
  \begingroup
  \@ifundefined{#1flag}{\endgroup\@firstoftwo}{\endgroup\@secondoftwo}%
  {UNDEFINED}%
  {DEFINED}%
}
\makeatother

\begin{document}

Sol test: \mytest{sol}

Bar test: \mytest{bar}

2nd bar test: \ifthenelse{\isundefined{\barflag}} {UNDEFINED}{DEFINED}

\end{document}

在现代 TeX 系统上,LaTeX 使用 e-TeX,因此你可以这样做

\newcommand{\mytest}[1]{%
  \ifcsname #1flag\endcsname
    DEFINED%
  \else
    UNDEFINED%
  \fi
}

答案3

我不会为此使用ifthen它,但如果你这样做,那么你需要使用它#1来构造要测试的 csname。请注意,\#生成#它的命令不是对参数的引用,因此你的定义根本不使用它的参数。

\documentclass{article}

\usepackage{ifthen}


\newcommand{\solflag}{}
\newcommand{\mytest}[1]{%
  \ifthenelse{\expandafter\isundefined\csname#1flag\endcsname}{UNDEFINED}{DEFINED}}

\begin{document}

Sol test: \mytest{sol}

Bar test: \mytest{bar}

2nd bar test: \ifthenelse{\isundefined{\barflag}} {UNDEFINED}{DEFINED}

\end{document}

相关内容