如何忽略文档环境中的所有内容?

如何忽略文档环境中的所有内容?

是的,您没有看错标题!

我想忽略一切那是在\begin{document}和之间,\end{document}当我有\input一个文件时。我认为这会非常简单,只需使用包裹environ

\RenewEnviron{document}{}

但事实证明并非那么容易。下面的 MWE 产生了正确的结果:

在此处输入图片描述

但注释必须完整。如果你取消注释注释行,则结果为:

LaTeX 错误:\env@document@save@env 未定义

有趣的是,忽略这个错误可以继续执行,并且仍然得到正确的结果。:-)

笔记:

  • 我意识到序言中可能还有其他内容,因此这绝不是一个通用的解决方案。对于我需要此功能的地方,序言仅有的\documentclass两个\input/\usepackage加载所有.sty需要的文件,因此足以满足我的需要。

代码:

\documentclass{article}
\usepackage{environ}
\usepackage{standalone}

\newtoks{\MyToken}

\usepackage{filecontents}
\begin{filecontents*}{foo.tex}
    \documentclass{standalone}
    \usepackage{MyStandardPackages}

    \MyToken={foo}

%   \begin{document}
%       lots of text here
%
%       \SetSomeVarable{\SomeVar}{Some Value}
%       
%       \begin{SomeEnvironment}
%           lots more stuff here as well
%       \end{SomeEnvironment}
%   \end{document}
\end{filecontents*}

\MyToken={XXX}


\newcommand{\DisablePreamble}{%
    \renewcommand{\documentclass}[2][]{}%  remove def'n of \documentclass
    \renewcommand{\usepackage}[2][]{}%     ignore any \usepackage{}
%   \RenewEnviron{document}{}% Ignore everything within the "document" environment.
}%

\newcommand*{\ExtractMyToken}[1]{%
    \begingroup% What happens in the group stays in the group!
        \DisablePreamble%
        \input{#1}%
        \global\MyToken=\expandafter{\the\MyToken}%
    \endgroup%
}%

\begin{document}
MyToken=\the\MyToken

\ExtractMyToken{foo}

MyToken=\the\MyToken
\end{document}

答案1

这是一个常见的问题environ,我解决这个问题的方法是定义那些有问题的命令:

\makeatletter
\providecommand{\env@document@save@env}{}% To keep environ happy
\providecommand{\env@document@process}{}%
\RenewEnviron{document}{}% Ignore everything within the "document" environment.
\makeatother

实现目标的一个快速而简单的方法是使用

\renewcommand{\document}{\endgroup\endinput}

\input一旦到达,就会终止文档的读取\begin{document}

答案2

我会(在本地)定义

\def\begin#1{\endinput}`

所以文件在该点停止,或者 perhaops (我真的不明白你的用例

 \def\documentclass[#1]#2{\endinput}

并更早停止(但如果你这样做,只需不输入文件就会更容易)

相关内容