
Sim, você leu o título corretamente!
eu quero ignorartudoisso é entre \begin{document}
e \end{document}
quando eu \input
um arquivo. Achei que seria muito simples, basta usaro environ
pacote:
\RenewEnviron{document}{}
Mas acabou não sendo tão fácil. O MWE abaixo produz os resultados corretos:
mas apenas com os comentários intactos. Se você descomentar as linhas comentadas, terminará com:
Erro LaTeX: \env@document@save@env indefinido
Curiosamente, ignorando esse erro, é possível continuar além disso e ainda obter os resultados corretos. :-)
Notas:
- Sei que pode haver outras coisas no preâmbulo, portanto esta não é de forma alguma uma solução geral. Para os locais onde preciso desta funcionalidade, o preâmbuloapenashas
\documentclass
e dois\input
/\usepackage
que carregam todos os.sty
arquivos necessários, então isso será suficiente para minhas necessidades.
Código:
\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}
Responder1
Este é um problema comum comenviron
, e a maneira de contornar isso é definir os comandos com os quais há problemas:
\makeatletter
\providecommand{\env@document@save@env}{}% To keep environ happy
\providecommand{\env@document@process}{}%
\RenewEnviron{document}{}% Ignore everything within the "document" environment.
\makeatother
Uma maneira rápida e suja de conseguir o que você procura é usar
\renewcommand{\document}{\endgroup\endinput}
que encerra a leitura do \input
documento assim que chega \begin{document}
.
Responder2
Eu definiria (localmente)
\def\begin#1{\endinput}`
então o arquivo para nesse ponto, ou talvez (eu realmente não entendi seu caso de uso
\def\documentclass[#1]#2{\endinput}
e pare ainda mais cedo (mas se você estiver fazendo isso, seria mais fácil não inserir o arquivo)