为什么我在这个 MWE 中收到“不完整的 \ifx”?

为什么我在这个 MWE 中收到“不完整的 \ifx”?

我正在尝试重新定义图形环境,这通常可以正常工作。但是,如果要替换的图形环境的主体包含tabular条件表达式内的环境,我会收到错误

“不完整的 \ifx;第 11 行之后的所有文本均被忽略”

我觉得这很令人惊讶,因为我更新的环境甚至没有使用那个主体。它并不严格依赖于tabular,因此tikzpicture会引发相同的错误。此外,它也不依赖于\ifpdf,其他有效条件也会引发相同的错误。

这是我的代码:

\documentclass{article}
\usepackage{environ}
\RenewEnviron{figure}{It's gone!}

\usepackage{ifpdf}
\begin{document}
\begin{figure}
\ifpdf
    \begin{tabular}{l}
        This works without RenewEnviron, ifpdf or tabular!
    \end{tabular}
\else\fi
\end{figure}
\end{document}

答案1

有一次,该包未能保护其内部条件测试免受if..源中的杂散标记的影响。当它扫描到嵌套时,\begin它已经扫描了\ifpdf但尚未看到匹配的\fi。一个小的重新定义将收集的标记移出内部\ifx测试:


\documentclass{article}
\usepackage{environ}
\makeatletter
\long\def\Collect@@Body#1\end#2{%
  \edef\begin@stack{%
    \Push@Begins#1\begin\end\expandafter\@gobble\begin@stack}%
  \ifx\@empty\begin@stack
    \endgroup
    \@checkend{#2}%
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi
   {\Addto@Envbody{#1}}%
   {\Addto@Envbody{#1\end{#2}}}%
  \process@envbody}
\makeatother

\RenewEnviron{figure}{It's gone!}

\usepackage{ifpdf}
\begin{document}
\begin{figure}
\ifpdf
    \begin{tabular}{l}
        This works without RenewEnviron, ifpdf or tabular!
    \end{tabular}
\else\fi
\end{figure}
\end{document}

答案2

environ由于现在 LaTeX 内核允许\NewDocumentEnvironment\RenewDocumentEnvironment采用参数说明符b(代表“body”),因此该包可能被视为过时。

语法有点不同

\documentclass{article}
\usepackage{ifpdf}

\RenewDocumentEnvironment{figure}
  {+b}% argument specifiers
  {It's gone!}% begin part
  {}% end part

\begin{document}

\begin{figure}
\ifpdf
    \begin{tabular}{l}
        This works without RenewEnviron, ifpdf or tabular!
    \end{tabular}
\else\fi
\end{figure}

\end{document}

因为必须指定“结束部分”(不同于environ)。+前缀表示环境中允许有空行。

相关内容