\comment oder \begin{comment} zu \AtBeginDocument hinzufügen?

\comment oder \begin{comment} zu \AtBeginDocument hinzufügen?

FürBefehle/Umgebung zur teilweisen Kompilierung?, ich möchte am Anfang des Dokuments \begin{comment}„oder“ hinzufügen \comment(damit ich es an einer anderen Stelle im Code ausschalten kann).

Also, auch wenn es im größeren Zusammenhang nutzlos ist – in diesem MWE möchte ich als Übung, dass der gesamte Text grundsätzlich bedingt über die Kommandozeile gelöscht wird (das Ergebnis wäre eine leere Seite oder gar kein PDF).

EDIT: Ich möchte es jedoch so machen, dass ich es später beliebig hinzufügen und \end{comment}dann\begin{comment}nurdieses Snippet wird kompiliert.

\documentclass[11pt]{book}
\usepackage{lipsum}

\ifx\doskip\relax
  \typeout{DOSKIP}
  \usepackage{etoolbox}
  \usepackage{comment}
  % https://tex.stackexchange.com/questions/14135/how-to-automatically-add-text-immediately-after-begindocument
  %\AtBeginDocument{\comment}         % ! Extra \endgroup.
  %\AtBeginDocument{\begin{comment}}  % Runaway argument? ! File ended while scanning use of \next.
  %\AfterEndPreamble{\comment}        % ! Extra \endgroup.
  %\AfterEndPreamble{\begin{comment}} % Runaway argument? ! File ended while scanning use of \next.
  %\AtEndDocument{\endcomment}%{\end{comment}}
  % desperate try (also fails w/ ! Extra \endgroup.):
  \protected\def\startcomment{\expandafter\comment}
  \AtEndPreamble{
\startcomment
  } % ! Extra \endgroup.
\fi

\begin{document}

\chapter{Some chapter}
\section{Section One}
\lipsum[1-3]

% later I might want to use here:
% \end{comment}
% \lipsum[5] % this would be typeset
% \begin{comment} % from this point on, again blanked

\end{document}

Die Idee ist, dass das Dokument „gelöscht“ wird, wenn Latex über … auf der Befehlszeile aufgerufen wird.
pdflatex "\let\doskip\relax\input{test.tex}"
Allerdings treten offensichtlich einige Gruppierungsfehler auf. Andernfalls pdflatex test.texfunktioniert es auch ohne diesen Eingriff und mit nur … einwandfrei.

Irgendwelche Ideen, wie dies umgesetzt werden könnte?


EDIT2: näher, aber noch nicht da: Ich habe in kpsewhich comment.sty"Andere 'Kommentar'-Umgebungen werden durch ... \excludecoment{versionb} definiert; Diese Umgebungen werden als \begin{versiona} ... \end{versiona} verwendet, wobei die öffnenden und schließenden Befehle wieder in einer eigenen Zeile stehen. Dies ist keine LaTeX-Umgebung: Bei einem eingeschlossenen Kommentar verhalten sich die Zeilen \begin und \end so, als ob sie nicht existieren würden. Insbesondere implizieren sie keine Gruppierung ..."

Im folgenden Beispiel, in dem verwendet wird \excludecomment{versionb}, wird begin{document} erfolgreich überschrieben, der erste Teil übersprungen, dann der Kommentar unterbrochen und \lipsum[5]gesetzt und das Dokument ohne Fehler kompiliert. Darüber hinaus ist es jedoch sehr schwierig, entweder ein nicht unterbrochenes (komplett gelöschtes Dokument) ordnungsgemäß zu schließen oder mit dem Löschen fortzufahren, nachdem es einmal unterbrochen wurde:

\documentclass[11pt]{book}
\usepackage{lipsum}
\usepackage{trace}

\ifx\doskip\relax
  \typeout{DOSKIP}
  \usepackage{etoolbox}
  \usepackage{comment}
  \excludecomment{versionb}
  %\AtEndPreamble{ % here causes ! LaTeX Error: Missing \begin{document}.
  \AtBeginDocument{%
    % \expandafter\begin{versionb}\relax
    \begin{versionb}
  } % 
  %\AtEndDocument{\end{versionb}} % ! LaTeX Error: \begin{document} ended by \end{versionb}.
\fi

% \traceon
\begin{document}

\chapter{Some chapter}
\section{Section One}
\lipsum[1-3]

\end{versionb}
\lipsum[5]
% \begin{versionb}

%% \end{versionb} % can this be implicit, as per \AtEndDocument?
\end{document}
%%ENNDDD

Zu diesem Makro kann \typeoutFolgendes hinzugefügt werden comment.sty:

 \gdef\ProcessCommentLine#1^^M{\def\test{#1}
      \typeout{test: \meaning\test, \meaning\expandafter \csname End\CurrentComment Test\endcsname}

\end{versionb}... wenn also vor dem kein steht \lipsum[5], können wir erkennen, dass das Problem auftritt, weil versucht wird, Zeilen über das Dateiende hinaus zu lesen:

...
test: macro:->\end{document}, \expandafter\end{versionb}
test: macro:->%%ENNDDD, \expandafter\end{versionb}
test: macro:->, \expandafter\end{versionb}
)
Runaway argument?
! File ended while scanning use of \next.
<inserted text> 
                \par 
<*> \let\doskip\relax\input{test.tex}

Ich brauche also immer noch Hilfe, wie ich diesen Code unter allen Umständen zum Laufen bringe ...

Antwort1

Sie können den folgenden Code irgendwo in der Präambel nach verwenden \documentclass.

\def\doskipA{\begin{document}\end{document}}
\ifx\doskip\relax \expandafter\doskipA\fi

Antwort2

Ok, ich bin endlich weitergekommen, auch wenn es vielleicht nicht ideal ist. Das folgende MWE verhält sich folgendermaßen:

  • Wenn mit kompiliert wird pdflatex test.tex, wird das commentZeug ignoriert und das Dokument vollständig kompiliert; im Protokoll werden jedoch diese beiden Warnungen generiert (ich weiß nicht, wie ich das beheben kann):

    (\end occurred inside a group at level 2)
    
    ### semi simple group (level 2) entered at line 86 (\begingroup)
    ### semi simple group (level 1) entered at line 86 (\begingroup)
    ### bottom level...
    
  • Wenn mit kompiliert wurde pdflatex "\let\doskip\relax\input{test.tex}", dann ist ein \excludecommentdefiniertes , aufgerufen SKIPLINESund \begin{document}startet es automatisch; der Code wird ohne Warnungen kompiliert und nur das Segment zwischen \end{SKIPLINES}und \begin{SKIPLINES}(beachten Sie die Reihenfolge), das hier ist, \lipsum[5]wird gesetzt. Außerdem werden Nachrichten wie diese an das Terminal ausgegeben:

    ...
    test: macro:->, macro:->\end{SKIPLINES}
    noend macro:-> macro:->\end{document}
    test: macro:->\end{document}, macro:->\end{SKIPLINES}
    yesend
    

Ich vermute, dies ist erforderlich, damit \excludecommentzusätzliche (?) Gruppierungen vermieden werden. Es sind jedoch noch einige Hacks erforderlich, und daher enthält der Code geänderte Versionen von {comment}und . Insbesondere wird, wie @UlrikeFischer bemerkte, wenn es vorkommt, dass Latex beim Lesen im „Kommentarmodus“ ist , dieser übersprungen, was zu Fehlern führt; daher prüft die Neudefinition zusätzlich auf als Token zum Stoppen des Kommentarmodus und führt dann die ordnungsgemäße Ausführung erneut aus, wenn diese Bedingung erfüllt ist.\excludecomment\ProcessCommentLine\end{document}\ProcessCommentLine\end{document}\end{document}

\doskipDies bedeutet, dass man im Modus nach Belieben \end{SKIPLINES}und hinzufügen können sollte \begin{SKIPLINES}, um Teile der kompilierbaren Bereiche zu definieren, ohne sich Gedanken darüber machen zu müssen, ob sie für die ordnungsgemäß geschlossen sind \end{document}: Ein einzelnes Paar von \end{SKIPLINES}und \begin{SKIPLINES}sollte genauso gut funktionieren wie ein Dokument ohne sie (oder mit einem zusätzlichen \end{SKIPLINES}).

Offensichtlich ist das keine wirklich richtige Lösung (diese funktioniert nicht mit \inputTED-Dateien), daher hoffe ich, dass irgendwann eine fundiertere Antwort auftaucht; aber hier ist erst einmal das MWE (und entschuldigen Sie die Unordnung):

\documentclass[11pt]{book}
\usepackage{lipsum}
\usepackage{trace}

\newif\ifSKIPLINESAct % if active
\ifx\doskip\relax
  \typeout{DOSKIP}
  \usepackage{etoolbox}
  \usepackage{comment}
  \usepackage{xstring}
  \def\excludecommentB
   #1{\message{Excluding comment '#1'}%
      %\csarg\newif{if#1Act}% declare globally; http://tex.stackexchange.com/questions/228994/handling-a-conditionally-defined-newif-nested-in-an-ifx-conditional
      \csarg\def{#1}{\endgroup \message{Excluding '#1' comment.}%
          \csname #1Acttrue\endcsname
          \begingroup
             \DefaultCutFileName \def\ProcessCutFile{}%
             \def\ThisComment####1{}\ProcessComment{#1}}%
      \csarg\def{After#1Comment}{%
        \global\csname #1Actfalse\endcsname% must globalize - inside a group here!
        \CloseAndInputCutFile \endgroup}
      \CommentEndDef{#1}}
  % redef this too:
  \csarg\xdef{EndDocTest}{\string\end\string{document\string}}
%   \showme\EndDocTest
  {\catcode`\^^M=12 \endlinechar=-1 %
   \gdef\xComment#1^^M{\ProcessCommentLine}
   \gdef\ProcessCommentLine#1^^M{\def\test{#1}
        \typeout{test: \meaning\test, \expandafter\meaning \csname End\CurrentComment Test\endcsname}
        \csarg\ifx{End\CurrentComment Test}\test
            \edef\next{\endgroup\noexpand\EndOfComment{\CurrentComment}}%
        \else \ThisComment{#1}\let\next\ProcessCommentLine
        \fi%
        % also add for end document; use \IfStrEq else catcodes could be a problem
        \IfStrEq*{\EndDocTest}{\test}{%
            %\traceon%
            \typeout{yesend}%
            \def\next{%\endgroup\noexpand\EndOfComment{\CurrentComment}%
            \endgroup\noexpand\EndOfComment{\noexpand\CurrentComment}% % must add \noexpand to \CurrentComment, else it leaks and gets typeset in the doc!
            %\SKIPLINESActfalse% no; use:
            \AfterSKIPLINESComment% % both sets false and ends group
            \enddocument%
            }%
        }{\typeout{noend \meaning\test\space\meaning\EndDocTest}%\ThisComment{#1}\let\next\ProcessCommentLine% don't execute here, just typeout
        }%
        \next}
  }
  \excludecommentB{SKIPLINES} % define, also \ifSKIPLINESAct
  %\AtEndPreamble{ % here causes ! LaTeX Error: Missing \begin{document}.
  \AtBeginDocument{%
    % \expandafter\begin{SKIPLINES}\relax
    \begin{SKIPLINES}
  } % ! Extra \endgroup.
  %\AtEndDocument{\end{SKIPLINES}} % ! LaTeX Error: \begin{document} ended by \end{SKIPLINES}. % redefine instead?
  %% no need for this:
  % \global\let\oldenddocument\enddocument
  % \gdef\enddocument{% redefine
  %   %\ifSKIPLINESAct\expandafter\end\expandafter{SKIPLINES}\fi
  %   \oldenddocument%
  % }
\else
  % still need this, when calling without \doskip:
  \makeatletter
  \newenvironment{SKIPLINES}{%
  \begingroup\def\@currenvir{document}%
  }{%
  % comment.sty: % sabotage LaTeX's environment testing \begingroup\def\@currenvir{#1}\end{#1}
  \begingroup\def\@currenvir{SKIPLINES}%\endgroup
  }
  % \def\endSKIPLINES{\begingroup\def\@currenvir{SKIPLINES}} % nope
  \makeatother
\fi

% \traceon
\begin{document}

\chapter{Some chapter}
\section{Section One}
\lipsum[1-3]

% \traceon
\end{SKIPLINES}
% \traceoff
\lipsum[5]
\begin{SKIPLINES} % will cause ### semi simple group (level 2) entered at line 90 if without \doskip and unclosed, but doc will compile

\lipsum[10]

% \end{SKIPLINES} % if this is uncommented when \doskip, it will allow the next typeout to execute (else they will be gobbled)

% these print to stdout only if \end{SKIPLINES} occured last previously:
\typeout{\meaning\endSKIPLINES}
\ifx\doskip\relax
  \ifSKIPLINESAct\typeout{SKIPLINES Active}\else\typeout{no SKIPLINES}\fi%
\else
\fi

\end{document}
%%ENNDDD

verwandte Informationen