使用 \newenvironment 中嵌套的 multicols 进行条件编译

使用 \newenvironment 中嵌套的 multicols 进行条件编译

我希望在章节末尾添加一个问题/解决方案库。我希望能够通过单个注释/取消注释操作来控制其打印。MWE 是一篇文章,但我的意图是制作一套包含 30 多个章节的书籍。所有书籍都共享一个通用的序言文件。

问题将打印为两列multicol。我使用条件编译,如 [如何轻松编写条件页面?] 我不敢说我​​理解它,但到目前为止它对我来说还是有用的。我遇到的唯一问题是将它嵌套在\newenvironment.

具体来说,我在这里面临两个问题(在 MWE 中用 PROB-1 和 PROB-2 标签表示)-

  1. multicol在新的环境中嵌套qbank会引发编译错误。但嵌套multicol在 a\newenvironment[quescol]和嵌套quescolqbank似乎有效。这让我很困惑。无论如何我都可以忍受,但仍然想知道真正的原因。
  2. \SelectPartsForCompilation{queb}条件编译方案无法按预期工作。MWE 可以正确编译,但我无法按预期注释掉。我无法将\DeclareCompilationNameOfBlock[queb]外部\begin{qbank}块原封不动地qbank放在数百个章节中(每个章节都在一个单独的文件中)。

实际上,在任何情况下嵌套此条件编译方案\newenvironment都会产生混乱。 PS:在我的实际文档中,除了之外还有几个编译标签queb

\documentclass{article}
\usepackage{multicol,pgffor,environ,exsheets}

%https://tex.stackexchange.com/questions/247379/how-to-easily-write-conditional-pages/249823#249823
\makeatletter
\newcommand{\pgfkeysgsetvalue}[2]{
    \pgfkeys@temptoks{#2}\expandafter\xdef\csname pgfk@#1\endcsname{\the\pgfkeys@temptoks}
}
\makeatother

\pgfkeys{/DeclareCompilationNameOfLine/.is family,/DeclareCompilationNameOfLine,
    set/.unknown/.code={
        \pgfkeysgsetvalue{/DeclareCompilationNameOfLine/\pgfkeyscurrentname}{1}
    },
    set/unset/.unknown/.code={
        \pgfkeysgsetvalue{/DeclareCompilationNameOfLine/\pgfkeyscurrentname}{0}
    }
}

\newif\ifPrintComment
\newcommand\SelectPartsForCompilation[1]{%
    \foreach \key in {#1}{\pgfkeys{/DeclareCompilationNameOfLine,set/\key} }
}
\newcommand\MakeSelection[1]{
    \PrintCommentfalse
    \foreach \key in {#1,all} {
        \pgfkeysifdefined{/DeclareCompilationNameOfLine/\key}%
        {\pgfkeysgetvalue{/DeclareCompilationNameOfLine/\key}{\temp}
            \ifnum\temp=1\global\PrintCommenttrue\fi% print if key=1
        }{}
    }
}

\newcommand\DeclareCompilationNameOfLine[2][]{\MakeSelection{#1}\ifPrintComment#2\fi}
\NewEnviron{DeclareCompilationNameOfBlock}[1][]{\MakeSelection{#1}\ifPrintComment\BODY\fi }

\setlength{\columnseprule}{0.4pt}
\newenvironment{quescol}{ % PORB-1 :: I am forced to use this clunky envirnoment
        \begin{multicols}{2}    
    } {
        \end{multicols}
        \hrule
}

\newenvironment{qbank}{
        \medskip
        \DeclareCompilationNameOfBlock[queb]
        \hrule
        \begin{center}
            \textbf{\textit{\LARGE Question Bank}}
        \end{center}
        \hrule
        \quescol % PROB-1 :: if I directly use \begin{multicols}{2}, i get compliation error
    } {
        \endquescol
        \endDeclareCompilationNameOfBlock
}

% PROB-2 :: If I comment out the follwing line, it throws up a compilation error
\SelectPartsForCompilation{queb} % comment this line for not including the question bank in PDF

\begin{document}
    \section{first} Text of first
    \section{second} Text of second
    \section{third} Text of third
    \begin{qbank}
        \begin{question}
            Transitive
        \end{question}
        \begin{question}
            Reflexive
        \end{question}
        \begin{question}
            Symmetric
        \end{question}
    \end{qbank}
\end{document}

相关内容