Как игнорировать все в среде документов?

Как игнорировать все в среде документов?

Да, вы правильно прочитали название!

Я хочу игнорироватьвсето есть между \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}

и остановитесь еще раньше (но если вы это делаете, то было бы проще не вводить файл)

Связанный контент