枚举中的非缩进列表代码块?

枚举中的非缩进列表代码块?

我想在枚举列表中插入一个代码块,但我不希望枚举与代码块自然缩进。例如,

\begin{enumerate}
    \item Primitive Version
    \begin{enumerate}
        \item Implementation
        \paragraph{} The key segment of code is:
\begin{lstlisting}[style=ccode]
int main()
{
    cout << "hello world" << endl;
}
\end{lstlisting}
    \end{enumerate}
\end{enumerate}

我已经检查了几个解决方案,例如itemize 中的非 item 没有缩进lstlisting但由于我无法将其用作参数,因此所有这些都导致了错误。

! Illegal parameter number in definition of \lst@insertargs.

我该如何实现这个目标?提前致谢。

答案1

lstlisting您可以使用键值调整左边距xleftmargin。将其设置为各个级别列表深度的组合(对于第一级,第二级的-\leftmargini附加深度,-\leftmarginii-\leftmarginiii第三级等),您可以将列表推回到文本的原始左边距,就像设置的那样没有列表缩进:

在此处输入图片描述

\documentclass{article}

\usepackage{listings}

\begin{document}

\noindent
X \dotfill X

\begin{enumerate}
  \item Y \dotfill Y
  \begin{enumerate}
    \item Z \dotfill Z

\begin{lstlisting}[language=C,xleftmargin=\dimexpr-\leftmarginii-\leftmargini]
int main()
{
    cout << "hello world" << endl;
}
\end{lstlisting}

    \item Z\dotfill Z
  \end{enumerate}

\begin{lstlisting}[language=C,xleftmargin=-\leftmargini]
int main()
{
    cout << "hello world" << endl;
}
\end{lstlisting}
  \item Y \dotfill Y
\end{enumerate}

\noindent
X \dotfill X

\end{document}

任意深度的总左边距为\@totalleftmargin。我们可以通过xleftmargin以下方式调整来利用它:

<list above>

\begin{lstlisting}[language=C,xleftmargin=\dimexpr-\csname @totalleftmargin\endcsname]
  <code>
\end{lstlisting}

<list below>

答案2

一种替代方法,不需要根据当前列表深度进行手动调整。

在此处输入图片描述

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{listings}

\makeatletter
% command \NOINDENT to be used in a group   
\newcommand*\NOINDENT{\@@par   % clear parshape parameters
% fool list-awareness code (as supposedly in lstlisting, not checked)
      \@totalleftmargin\z@ \@listdepth\z@ \rightmargin\z@
}
\makeatother

\begin{document}

\noindent
X \dotfill X

\begin{enumerate}
  \item Y \dotfill Y
  \begin{enumerate}
    \item Z \dotfill Z

{\NOINDENT\begin{lstlisting}[language=C]
int main()
{
    cout << "hello world" << endl;
}
\end{lstlisting}}
% the whole \NOINDENT\begin...\end must be enclosed in braces!
    \item Z\dotfill Z
      \begin{enumerate}
      \item W\dotfill W

{\NOINDENT\begin{lstlisting}[language=C]
int main()
{
    cout << "hello world" << endl;
}
\end{lstlisting}}

      \end{enumerate}
  \end{enumerate}

  \item Y \dotfill Y

{\NOINDENT\begin{lstlisting}[language=C]
int main()
{
    cout << "hello world" << endl;
}
\end{lstlisting}}
\end{enumerate}

\noindent
X \dotfill X

\end{document}

相关内容