我希望能够构建一个条件,如果条件编译成功,则执行一组代码,如果代码生成错误,则执行另一组代码。以失败的以下代码块为例:
\documentclass[•]{article}
\edef\temptwo{\tempone}
\def\tempone{test}
\edef\temptwo{\tempone}
\begin{document}
\temptwo
\end{document}
上述代码块失败是因为原始 \edef\temptwo 尝试扩展参数,该参数查找尚未定义的 \tempone。我知道我可以通过条件使用 \ifcsname \endcsname 类型来修复这个特定示例。我的问题是,是否有一种通用的方法来制作一个命令,比如 \iferror,它将解析参数中的任何类型的 pdflatex 错误,而不仅仅是检查 csname 是否已定义?简而言之,我想要类似下面的伪代码:
\documentclass[•]{article}
\newcommand{\iferror}[2]{
\ifthisworks{#1} % \ifthisworks will execute only if #1 is executable code
\else % If it's not executable code, execute #2
#2
\fi
\iferror{\edef\temptwo{\tempone}}{\def\tempone{test}}
\iferror{\edef\temptwo{\tempone}}{\def\tempone{test}}
\begin{document}
\temptwo
\end{document}
在上面的代码中,理想情况下,第一个 \iferror 将看到第一个参数由于未定义的控制序列而出错,从而执行第二个参数,定义 \tempone。然后第二次调用 \iferror 将正确定义 \temptwo。
不过,我希望 \iferror 能够灵活,例如:
\documentclass[•]{article}
\newcommand{\iferror}[2]{
\ifthisworks{#1} % \ifthisworks will execute only if #1 is executable code
\else % If it's not executable code, execute #2
#2
\fi
\begin{document}
\iferror{{}foo}{foome} % This should execute "{}foo".
\iferror{\if foo}{foome}% This should execute "foome" as the \if fails to close.
\iferror{\frac{1}{2}}{foome}% This should execute "foome" because of no mathmode.
$\iferror{\frac{1}{2}}{foome}$% This should execute "\frac{1}{2}" because we are in mathmode.
\end{document}
有这么普遍的东西吗,还是我只能进行情境检查?我对可以检查是否存在环境冲突的东西特别感兴趣。例如,如果您需要处于数学模式才能执行代码,但您没有,则执行参数 2。如果您不需要处于数学模式,但您处于数学模式,则执行参数 2。否则执行参数 1。