我正在尝试遍历数据列表。数据中的各部分混合在项目之间。
当出现一个部分时,我需要用 对其进行排版\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}
效果还不错。但它也有自己的局限性,比如参数解析不够灵活等等。