我想在枚举列表中插入一个代码块,但我不希望枚举与代码块自然缩进。例如,
\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}