Wie ignoriere ich alles in der Dokumentumgebung?

Wie ignoriere ich alles in der Dokumentumgebung?

Ja, Sie haben den Titel richtig gelesen!

Ich möchte ignorierenallesdas ist zwischen \begin{document}und \end{document}wenn ich \inputeine Datei. Ich dachte, das wäre sehr einfach, verwenden Sie einfachDas environPaket:

\RenewEnviron{document}{}

Aber es stellte sich heraus, dass es nicht so einfach war. Der folgende MWE liefert die richtigen Ergebnisse:

Bildbeschreibung hier eingeben

aber nur mit intakten Kommentaren. Wenn Sie die kommentierten Zeilen auskommentieren, erhalten Sie:

LaTeX-Fehler: \env@document@save@env undefiniert

Interessanterweise kann man, wenn man diesen Fehler ignoriert, weitermachen und trotzdem die richtigen Ergebnisse erhalten. :-)

Anmerkungen:

  • Mir ist klar, dass in der Präambel noch andere Dinge stehen können, daher ist dies keinesfalls eine allgemeine Lösung. Für die Stellen, an denen ich diese Funktionalität benötige, die Präambelnurhat \documentclassund zwei \input/ \usepackage, das alle .stybenötigten Dateien lädt, also wird das für meine Bedürfnisse ausreichen.

Code:

\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}

Antwort1

Dies ist ein häufiges Problem beienviron, und ich umgehe das Problem, indem ich die Befehle definiere, bei denen es ein Problem gibt:

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

Eine schnelle und einfache Möglichkeit, Ihr Ziel zu erreichen, ist die Verwendung von

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

wodurch das Lesen des \inputDokuments beendet wird, sobald es erreicht \begin{document}.

Antwort2

Ich würde (lokal) definieren

\def\begin#1{\endinput}`

so dass die Datei an diesem Punkt stoppt, oder vielleicht (ich habe Ihren Anwendungsfall nicht wirklich verstanden

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

und hören Sie sogar noch früher auf (wenn Sie das tun, wäre es aber einfacher, die Datei nicht einzugeben)

verwandte Informationen