使用 tikz 节点构建两列列表:“缺少 \item”错误?

使用 tikz 节点构建两列列表:“缺少 \item”错误?

我正在尝试使用这个答案把我的列表环境内部蒂克兹节点。因此我想定义一个新的 listings 环境,使用\lstnewenvironment

确切地说,我的最终目标是确保multicol使用该包生成的两列列表的正确框架multicols生成的两列列表具有正确的框架。之所以使用 Tikz,是因为使用 listings 的框架参数时,两列框架很丑陋,请参阅本 pdf 的结尾举个例子。

但我的文档中也有单列列表,我想用 tikz 来装饰,并且我希望有一个命令来排版双列和单列列表。幸运的是,清单手册暗示了一些事情:简单地复制命令内部新列表环境的可选参数lstset(第 41 页)。

这就是我尝试做的:

\documentclass{minimal}

\usepackage{listings}
\usepackage{tikz}
\usepackage{multicol}

\tikzstyle{sourcecodebox} = [
 fill=white, draw=black, inner sep=1em, rectangle
]

\makeatletter
\lstnewenvironment{lstfigurelisting}[1][]{%
  \lstset{frame=none,#1}%
  \setbox\@tempboxa=\hbox\bgroup\color@setgroup
}%
{%
    \color@endgroup\egroup
    \begin{tikzpicture}
        \node[sourcecodebox] (box)
            {\makebox[.75\linewidth][l]{\box\@tempboxa}};
    \end{tikzpicture}
}
\makeatother

\begin{document}

Some code here:
\begin{lstfigurelisting}[multicols=2]
  #!/usr/bin/env python
  def main():
  print "Hello, World!"
  if __name__ == '__main__':
  main()
\end{lstfigurelisting}

\end{document}

不幸的是,我得到了一个Something's wrong--perhaps a missing \item指向multicols=2

如果我删除该可选参数,或者将其更改为无害的内容(例如breaklines=true,一切正常(所以至少我得到了单列列表的框架)。我读过失踪人员常见问题解答\item缺失错误,但我不明白这在这里如何应用。我确实知道纯 TeX\setbox用于将整个环境内容保存在 TeX 框寄存器中,但我不明白多列环境具体如何在该框内插入列表。

有人知道发生了什么吗?还有其他替代方案可以建议实现我的最终目标(tiks 节点内的 1 和 2 列列表)吗?

答案1

listings我对or一无所知multicol,尤其不知道为什么他们抱怨被放在盒子里(大概与multicol它的魔力有关)。所以我回到了最初的规范:listings在 TikZ 节点内的列设置中获取列表。我想出了以下解决方案。关键似乎是要避免您的代码陷入的这种情况:某些东西提前读取列表,然后在其他地方重置它。我选择使用的几个命令都有“预读”版本,我发现如果我选择那个版本,代码就不起作用。例如,我必须使用 aminipage而不是 a \parbox

无论如何,我确信这需要进行调整 - 特别关于线宽 - 但它似乎确实完成了基本操作“在 TikZ 节点中放置 2 列列表”。

\documentclass{article}

\usepackage{listings}
\usepackage{tikz}
\usepackage{multicol}

\tikzstyle{sourcecodebox} = [
 fill=white, draw=black, inner sep=1em, rectangle
]

\makeatletter
\lstnewenvironment{lstfigurelisting}[1][]{%
  \tikzpicture
  \node[sourcecodebox] (box)
  \bgroup
  \minipage{.75\textwidth}
  \lstset{frame=none,#1}
}
{
\endminipage
\egroup;
\endtikzpicture
}
\makeatother

\begin{document}

Some code here:

\begin{lstfigurelisting}[multicols=2]
#!/usr/bin/env python
  def main():
  print "Hello, World!"
  if __name__ == '__main__':
  main()
\end{lstfigurelisting}
\end{document}

结果:

节点中的列表

答案2

您可以使用tcolorbox包来在大多数环境里制作一个盒子。

\documentclass{minimal}
\usepackage{listings}
\usepackage{multicol}
\usepackage{tcolorbox}
\begin{document}
\begin{tcolorbox}[sharp corners,colback=white]
\begin{lstlisting}[multicols=2]
 #!/usr/bin/env python
  def main():
  print "Hello, World!"
  if __name__ == '__main__':
  main()
\end{lstlisting}
\end{tcolorbox}
\end{document}

例子

相关内容