如何创建其中包含列表的自定义环境?

如何创建其中包含列表的自定义环境?

考虑下面的代码:

\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}
  {}

但这仍然不会影响列表的垂直对齐。有关解决方法,请参见下文。

顺便说一句,a4openleft不是 的有效选项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}

相关内容