动态打开和关闭 foreach 构造的环境

动态打开和关闭 foreach 构造的环境

我正在尝试遍历数据列表。数据中的各部分混合在项目之间。

当出现一个部分时,我需要用 对其进行排版\section,然后我需要创建一个itemize环境来保存下一组项目。然而,这就是事情出错的地方。出于某种原因,我无法在列表编译过程中创建环境。我尝试使用\begin{itemize}\end{itemize},以及\itemize\enditemize。但我得到了关于项目的错误。

\documentclass{article}
\usepackage{pgffor,pgfkeys}

\def\myenvir{document}
\pgfkeys{/test/.cd,
  section/.code = {%
    \def\tempa{document}% if current_environment=document
    \ifx\tempa\myenvir%
      \section{#1}\gdef\myenvir{itemize}\itemize%
    \else%
      \enditemize\section{#1}\itemize%
    \fi%
  },
  question/.code = {%
    \item #1
  },
  style/.estyle={#1}
}

\def\questions{
  section = section 1,
  question=question 1,
  question=question 2,
  section = section 2,
  question=question 1,
  question=question 2,
  section = section 3
}

\pagestyle{empty}
\begin{document}

%\itemize
\foreach \x in \questions {\pgfkeys{/test/.cd,style/.expanded=\x}}
\enditemize

\end{document}

解决这个问题的正确方法是什么?我以为我可以随时关闭和打开环境,但似乎不可能。另外,有没有办法检查下一个项目是否是一个部分,然后关闭它?但这可能会导致同样的问题,即没有明确的打开和关闭。

答案1

这不是一个正确的答案,但我认为这是错误自动化的一个例子。这里的主要问题是 foreach 首先通过围绕 foreach 代码主体创建一个组来旋转。因此每次组关闭时,堆栈都会丢失(恢复到其之前的状态,这是不必要的精确)。第二个问题是,你打开了\begin{itemize},如果之前没有其他事情发生,\end{itemize}你将得到一个missing \item错误,这将是 TeX 历史上第一次出现这样的错误,原因是正确的。

例如,一个不应该工作的代码(但确实工作了):在这里,我手动破解了 foreach body group 打开和关闭宏以停用

\documentclass{article}
\usepackage{pgffor,pgfkeys}
\def\myenvir{document}
\pgfkeys{
  /test/section/.code = {%
    \def\tempa{document}% if current_environment=document
    \ifx\tempa\myenvir%
      \section{#1}\gdef\myenvir{itemize}\begin{itemize}%
    \else%
      \end{itemize}\section{#1}\begin{itemize}%
    \fi%
  },
  /test/question/.code = {\item #1},
}

\def\questions{section = section 1,question=question 1,question=question 2,
  section = section 2,question=question 1,question=question 2,section = section 3
}
\makeatletter
\def\deactgroup{%
\let\pgffor@begingroup=\relax%
\let\pgffor@endgroup=\relax}
\def\reactgroup{%
\let\pgffor@begingroup=\pgffor@default@begingroup%
\let\pgffor@endgroup=\pgffor@default@endgroup%
}
\makeatother
\begin{document}

%Notice that there is no terminating \end{itemize}
\deactgroup%
\foreach\x in \questions{\edef\temp{\noexpand\pgfkeys{/test/\x}}\temp}%\end{itemize}
\reactgroup%

\end{document}

我建议您以不同的方式实现自动化,这样环境创建就由 key 指向的内容完成。否则,您必须破解 foreach 宏。已经有一个非常好的宏可以pgfplots删除分组(如果我们添加空的\item):

\documentclass{article}
\usepackage{pgfplots}

\def\myenvir{document}
\pgfkeys{
  /test/section/.code = {%
    \def\tempa{document}% if current_environment=document
    \ifx\tempa\myenvir%
      \section{#1}\gdef\myenvir{itemize}\begin{itemize}%
    \else%
      \end{itemize}\section{#1}\begin{itemize}%
    \fi%
  },
  /test/question/.code = {\item #1},
}

\begin{document}
\pgfplotsforeachungrouped\x in{  
  section = section 1,
  question=question 1,
  question=question 2,
  section = section 2,
  question=question 1,
  question=question 2,
  section = section 3
}{\edef\temp{\noexpand\pgfkeys{/test/\x}}\temp}
\item{}
\end{itemize}

\end{document}

效果还不错。但它也有自己的局限性,比如参数解析不够灵活等等。

相关内容