![如何创建其中包含列表的自定义环境?](https://linux22.com/image/307181/%E5%A6%82%E4%BD%95%E5%88%9B%E5%BB%BA%E5%85%B6%E4%B8%AD%E5%8C%85%E5%90%AB%E5%88%97%E8%A1%A8%E7%9A%84%E8%87%AA%E5%AE%9A%E4%B9%89%E7%8E%AF%E5%A2%83%EF%BC%9F.png)
考虑下面的代码:
\documentclass[a4, oneside,openleft]{book}
\usepackage{listings}
\begin{document}
\begin{flushright}\begin{minipage}{0.9\textwidth}\begin{lstlisting}
for (i) {
hello world i;
}
\end{lstlisting}\end{minipage}\end{flushright}
\end{document}
现在我希望将其作为单一环境“代码箱”。所以我尝试了(简化的):
\documentclass[a4, oneside,openleft]{book}
\usepackage{listings}
\lstnewenvironment{codebox}{\begin{flushright}}{\end{flushright}}
\begin{document}
\begin{codebox}
for (i) {
hello world i;
}
\end{codebox}
\end{document}
但是这会返回以下错误:
段落中第 59-61 行的 \hbox 过满(宽 3190.24414pt) [][ ... ][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][] )
那么如何解决这个问题?
答案1
listings
定义新代码环境的方法是
\lstnewenvironment{codebox}
{\lstset{language = C,linewidth=0.9\linewidth}}
{}
指定语言的位置。要像第一个代码一样向右刷新,您可以xleftmargin
使用\lstset
\documentclass[a4, oneside,openleft]{book}
\usepackage{showframe} %% just for demo
\usepackage{listings}
\lstnewenvironment{codebox}
{\lstset{language = C,linewidth=0.9\linewidth,xleftmargin=0.1\linewidth}}
{}
\begin{document}
\begin{codebox}
for (i) {
hello world i;
}
\end{codebox}
\end{document}
答案2
第二个代码片段的问题实际上不是框过满(这是一个警告,而不是错误),而是flushright
在
\lstnewenvironment{codebox}
{\begin{flushright}}
{\end{flushright}}
导致 LaTeX 引发错误(job aborted, no legal \end found)
。您可以使用\raggedleft
代替flushright
环境来解决该错误,如下所示:
\lstnewenvironment{codebox}
{\raggedleft}
{}
但这仍然不会影响列表的垂直对齐。有关解决方法,请参见下文。
顺便说一句,a4
和openleft
不是 的有效选项book
。您指的是a4paper
和 吗openany
?
\documentclass[a4paper, oneside, openany]{book}
\usepackage{listings}
\usepackage{lipsum}
\lstnewenvironment{codebox}{%
\lstset{frame=single}%
\vspace{\baselineskip}
\hfill%
\minipage{.9\textwidth}%
}{%
\endminipage%
}
\begin{document}
\begin{codebox}
for (i) {
hello world i;
}
\end{codebox}
\lipsum[2]
\end{document}