我想在 beamercolumns
环境中使用程序列表,如果需要,稍微改变列表的宽度。在另一列中,会出现一些解释。下面的代码展示了我的尝试。如果breaklines=true
,那么长线当然会在绿色框的边界处换行。如果breaklines=false
,那么长线会超出绿色框,但\maxsizebox
会考虑绿色框的宽度,即长线与右列重叠。在任何一种情况下,绿色框都不会填满列宽。看起来该选项会linewidth
增加绿色框的宽度,但它并没有最大化
\maxsizebox
。
我如何知道绿色框填满了可用的列宽(即在本例中为 0.4\columnwidth)并且最长的行没有超出绿色框?
\documentclass{beamer}
\usepackage{graphicx}
\usepackage{listings}
\usepackage{adjustbox}
\begin{document}
\newsavebox\listingboxname
\begin{columns}
\column{0.4\columnwidth}
\lstset{ %breaklines=true,
linewidth=1.2\textwidth,
backgroundcolor=\color{green}}
\begin{lrbox}{\listingboxname}
\begin{lstlisting}
int sumvec(int v[N])
{
int i, sum = 0;
for (i = 0; i < N; i++)
sum += v[i];
return sum;
}
\end{lstlisting}
\end{lrbox}
\maxsizebox{\columnwidth}{\textheight}
{\usebox\listingboxname}
\column{0.6\textwidth}
Just some text
\end{columns}
\end{document}
答案1
对于小于列宽的列表,使用背景颜色的解决方案非常有效(参见示例中的第二帧)。
对于较宽的列表,您可以使用adjustbox
来调整其大小以适应列宽。为了添加背景颜色,我使用了\colorbox
,但由于列表对于 来说有问题,因此\colorbox
我通过将列表存储在 中来隐藏它lrbox
。
\documentclass{beamer}
\usepackage{listings}
\usepackage{adjustbox}
\newsavebox\listingboxname
\begin{document}
\begin{frame}[fragile]
\begin{columns}[onlytextwidth]
\begin{column}{0.4\textwidth}
\begin{lrbox}{\listingboxname}
\begin{adjustbox}{max width=\linewidth, margin=0pt}
\begin{lstlisting}
int sumvec(int v[N])
{
int i, sum = 0;
for (i = 0; i < N; i++) longer line to test
sum += v[i];
return sum;
}
\end{lstlisting}
\end{adjustbox}
\end{lrbox}
\colorbox{cyan}{\usebox\listingboxname}
\end{column}
\begin{column}{0.5\textwidth}
Just some text
\end{column}
\end{columns}
\end{frame}
\begin{frame}[fragile]
\begin{columns}[onlytextwidth]
\begin{column}{0.4\textwidth}
\begin{lstlisting}[linewidth=\textwidth,
backgroundcolor=\color{cyan}]
int
{
}
\end{lstlisting}
\end{column}
\begin{column}{0.5\textwidth}
Just some text
\end{column}
\end{columns}
\end{frame}
\end{document}
答案2
据我所知,没有规定自动将列表的宽度设置为最宽的行。
将列表设置为适合最长行的宽度,然后调整框的大小。
\documentclass{beamer}
\usepackage{listings}
\newsavebox\listingboxname
\begin{document}
\begin{frame}[fragile]
\begin{columns}
\column{.4\textwidth}
\lstset{
%breaklines=true,
backgroundcolor=\color{green},
linewidth=1.5\columnwidth, % maybe it fits
}
\begin{lrbox}{\listingboxname}
\begin{lstlisting}
int sumvec(int v[N])
{
int i, sum = 0;
for (i = 0; i < N; i++)
sum += v[i];
return sum;
}
\end{lstlisting}
\end{lrbox}
\resizebox{\columnwidth}{!}{\usebox{\listingboxname}}
\column{.6\textwidth}
Just some text
\end{columns}
\end{frame}
\end{document}