我正在尝试使用这个答案把我的列表环境内部蒂克兹节点。因此我想定义一个新的 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}