我正在尝试重新定义图形环境,这通常可以正常工作。但是,如果要替换的图形环境的主体包含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
)。+
前缀表示环境中允许有空行。