![如何忽略文档环境中的所有内容?](https://linux22.com/image/286165/%E5%A6%82%E4%BD%95%E5%BF%BD%E7%95%A5%E6%96%87%E6%A1%A3%E7%8E%AF%E5%A2%83%E4%B8%AD%E7%9A%84%E6%89%80%E6%9C%89%E5%86%85%E5%AE%B9%EF%BC%9F.png)
是的,您没有看错标题!
我想忽略一切那是在\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}
并更早停止(但如果你这样做,只需不输入文件就会更容易)