我想测试 是否\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}