
ДляЧастичные команды/среда компиляции?, я хотел бы добавить \begin{comment}
или \comment
в начале документа (чтобы я мог отключить его в другом месте кода).
Итак, даже если в более широком смысле это бесполезно, в этом MWE, в качестве упражнения, я бы хотел, чтобы весь текст был очищен, по сути, условно через командную строку (результатом была бы пустая страница или даже отсутствие PDF-файла).
EDIT: Однако я хотел бы сделать это таким образом, чтобы я мог произвольно добавлять \end{comment}
/ \begin{comment}
позже в документ и иметьтолькоэтот фрагмент скомпилирован.
\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}
Идея состоит в том, что документ будет «очищен», если Latex вызывается в командной строке через
pdflatex "\let\doskip\relax\input{test.tex}"
... однако, очевидно, что есть некоторые ошибки группировки; в противном случае, без вмешательства, простое использование pdflatex test.tex
, работает нормально.
Есть идеи, как это можно реализовать?
EDIT2: ближе, но еще не там: я видел вkpsewhich comment.sty
"Другие среды 'comment' определяются ... \excludecoment{versionb} ; Эти среды используются как \begin{versiona} ... \end{versiona} с командами открытия и закрытия снова на собственной строке. Это не среда LaTeX: для включенного комментария строки \begin и \end действуют так, как будто они не существуют. В частности, они не подразумевают группировку ..."
Итак, в приведенном ниже примере, в котором используется \excludecomment{versionb}
, begin{document} успешно переопределяется, первая часть пропускается, затем комментарий прерывается, \lipsum[5]
набирается, и документ компилируется без ошибок, но после этого очень сложно правильно закрыть как непрерываемый (полностью пустой документ), так и продолжить очистку после того, как он был прерван:
\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
\typeout
К этому макросу можно добавить A comment.sty
:
\gdef\ProcessCommentLine#1^^M{\def\test{#1}
\typeout{test: \meaning\test, \meaning\expandafter \csname End\CurrentComment Test\endcsname}
\end{versionb}
... поэтому, если перед нет \lipsum[5]
, мы можем видеть, что проблема возникает из-за попытки прочитать строки за пределами конца файла:
...
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}
Итак, мне все еще нужна помощь в том, как заставить этот код работать при любых обстоятельствах...
решение1
Вы можете использовать следующий код где-нибудь в преамбуле после \documentclass
.
\def\doskipA{\begin{document}\end{document}}
\ifx\doskip\relax \expandafter\doskipA\fi
решение2
Хорошо, я наконец-то добился чего-то, хотя, возможно, и не идеального. Нижеприведенный MWE ведет себя так:
Если скомпилировать с помощью
pdflatex test.tex
, то этотcomment
материал игнорируется, и документ компилируется полностью; но в журнале будут сгенерированы два следующих предупреждения (не знаю, как это исправить):(\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...
Если скомпилировано с
pdflatex "\let\doskip\relax\input{test.tex}"
; то есть\excludecomment
определенный, называемыйSKIPLINES
, и\begin{document}
запускает его автоматически; код компилируется без предупреждений, и только сегмент между\end{SKIPLINES}
и\begin{SKIPLINES}
(обратите внимание на порядок), который здесь есть,\lipsum[5]
будет набран. Также на терминал будут выводиться такие сообщения:... test: macro:->, macro:->\end{SKIPLINES} noend macro:-> macro:->\end{document} test: macro:->\end{document}, macro:->\end{SKIPLINES} yesend
Я полагаю, это требуется, \excludecomment
чтобы избежать дополнительной (?) группировки. Однако все еще есть некоторые хаки, которые необходимы, и поэтому код включает измененные версии {comment}
's \excludecomment
и \ProcessCommentLine
. В частности, как заметил @UlrikeFischer, если случится так, что Latex находится в "режиме комментариев" при чтении \end{document}
, он будет пропущен, что приведет к ошибкам; поэтому переопределение \ProcessCommentLine
дополнительно проверяет \end{document}
как токен для остановки режима комментариев, а затем повторно выполняет правильное, \end{document}
если встречается это условие.
Это означает, что можно иметь возможность в \doskip
режиме добавлять \end{SKIPLINES}
и \begin{SKIPLINES}
по желанию определять части компилируемых регионов, не беспокоясь о том, закрыты ли они должным образом для \end{document}
: одна пара \end{SKIPLINES}
и \begin{SKIPLINES}
должна работать так же хорошо, как и документ без них (или с дополнительным \end{SKIPLINES}
).
Очевидно, что это не совсем правильное решение (оно не работает с \input
файлами TED), поэтому я надеюсь, что в конечном итоге появится более эрудированный ответ; но на данный момент вот MWE (и извините за беспорядок):
\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