
Да, вы правильно прочитали название!
Я хочу игнорироватьвсето есть между \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}`
поэтому файл останавливается в этой точке, или, возможно, упс (я не совсем понял ваш вариант использования
\def\documentclass[#1]#2{\endinput}
и остановитесь еще раньше (но если вы это делаете, то было бы проще не вводить файл)