我正在关注接受这个问题的答案将列表扩展到多个页面。效果很好,但是如果我的标题太长,则连续标题不会换行,这是一个问题,因为我必须使用 2 列格式。
例如,如果我有:
Listing 1: Excerpted implementation of sorting application.
第一个标题看起来正确,如下所示:
Listing 1: Excerpted implementation of
sorting application.
但是当跨越多页时,后续页面上的标题不会换行,而是写入第二列。
作为参考,这里是初始定义:
\usepackage{listings}
\usepackage{caption}
\usepackage[framemethod=tikz]{mdframed}
\lstset{
breaklines=true,
breakatwhitespace=false,
frame=single,
}
\newcommand\mylstcaption{}
\surroundwithmdframed[
hidealllines=true,
middleextra={
\node[anchor=west] at (O|-P)
{\lstlistingname~\thelstlisting\ (Cont.):~\mylstcaption};},
secondextra={
\node[anchor=west] at (O|-P)
{\lstlistingname~\thelstlisting\ (Cont.):~\mylstcaption};},
splittopskip=2\baselineskip
]{lstlisting}
以及一个示例实现:
\renewcommand\mylstcaption{Excerpted C implementation of legacy sorting application.}
\begin{lstlisting}[language=C, caption=\mylstcaption, label=l:sort1]
...
\end{lstlisting}
答案1
您可以为 s的键提供一个合理的值(\columnwidth
例如):text width
\node
\documentclass[12pt,a4paper,twocolumn]{article}
\usepackage[utf8x]{inputenc}
\usepackage{listings}
\usepackage{caption}
\usepackage[framemethod=tikz]{mdframed}
\lstset{
breaklines=true,
breakatwhitespace=false,
xleftmargin=1em,
frame=single,
numbers=left,
numbersep=5pt,
}
\newcommand\mylstcaption{}
\surroundwithmdframed[
hidealllines=true,
middleextra={
\node[anchor=south west,text width=\columnwidth] at (O|-P)
{\lstlistingname~\thelstlisting\ (Cont.):~\mylstcaption};},
secondextra={
\node[anchor=south west,text width=\columnwidth] at (O|-P)
{\lstlistingname~\thelstlisting\ (Cont.):~\mylstcaption};},
splittopskip=2\baselineskip
]{lstlisting}
\begin{document}
\renewcommand\mylstcaption{Example listing of code with a long caption spanning several lines in a two-column document. this is just a test for the example.}
\begin{lstlisting}[language=C, caption=\mylstcaption, label=lst:c1]
struct safe_buffer {
struct list_head node;
/* original request */
void *ptr;
size_t size;
int direction;
/* safe buffer info */
struct dmabounce_pool *pool;
void *safe;
dma_addr_t safe_dma_addr;
};
struct dmabounce_pool {
unsigned long size;
struct dma_pool *pool;
#ifdef STATS
unsigned long allocs;
#endif
};
struct dmabounce_device_info {
struct device *dev;
struct list_head safe_buffers;
#ifdef STATS
unsigned long total_allocs;
unsigned long map_op_count;
unsigned long bounce_count;
int attr_res;
#endif
struct dmabounce_pool small;
struct dmabounce_pool large;
rwlock_t lock;
int (*needs_bounce)(struct device *, dma_addr_t, size_t);
};
#ifdef STATS
static ssize_t dmabounce_show(struct device *dev, struct device_attribute *attr,
char *buf)
{
struct dmabounce_device_info *device_info = dev->archdata.dmabounce;
return sprintf(buf, "%lu %lu %lu %lu %lu %lu\n",
device_info->small.allocs,
device_info->large.allocs,
device_info->total_allocs - device_info->small.allocs -
device_info->large.allocs,
device_info->total_allocs,
device_info->map_op_count,
device_info->bounce_count);
}
static DEVICE_ATTR(dmabounce_stats, 0400, dmabounce_show, NULL);
#endif
\end{lstlisting}
\end{document}
只是为了完整性,这里有同样的想法,但是使用tcolorbox
及其与以下的相互作用listings
:
\documentclass[12pt,a4paper]{article}
\usepackage[utf8x]{inputenc}
\usepackage[many]{tcolorbox}
\tcbuselibrary{listings}
\lstset{
breaklines=true,
breakatwhitespace=false,
xleftmargin=1em,
frame=single,
numbers=left,
numbersep=5pt,
}
\newtcblisting{TCBlisting}[1][]{
breakable,
enhanced,
arc=0pt,
outer arc=0pt,
boxrule=0pt,
colback=white,
listing only,
listing remove caption=false,
listing options={#1},
overlay middle and last={
\node[anchor=south west,text width=\columnwidth] at (frame.north west)
{\lstlistingname~\thelstlisting\ (Cont.):~\mylstcaption};
}
}
\newcommand\mylstcaption{}
\begin{document}
\renewcommand\mylstcaption{Example listing of code with a long caption spanning several lines in a two-column document. this is just a test for the example.}
\begin{TCBlisting}[language=C,caption={\mylstcaption}]
struct safe_buffer {
struct list_head node;
/* original request */
void *ptr;
size_t size;
int direction;
/* safe buffer info */
struct dmabounce_pool *pool;
void *safe;
dma_addr_t safe_dma_addr;
};
struct dmabounce_pool {
unsigned long size;
struct dma_pool *pool;
#ifdef STATS
unsigned long allocs;
#endif
};
struct dmabounce_device_info {
struct device *dev;
struct list_head safe_buffers;
#ifdef STATS
unsigned long total_allocs;
unsigned long map_op_count;
unsigned long bounce_count;
int attr_res;
#endif
struct dmabounce_pool small;
struct dmabounce_pool large;
rwlock_t lock;
int (*needs_bounce)(struct device *, dma_addr_t, size_t);
};
#ifdef STATS
static ssize_t dmabounce_show(struct device *dev, struct device_attribute *attr,
char *buf)
{
struct dmabounce_device_info *device_info = dev->archdata.dmabounce;
return sprintf(buf, "%lu %lu %lu %lu %lu %lu\n",
device_info->small.allocs,
device_info->large.allocs,
device_info->total_allocs - device_info->small.allocs -
device_info->large.allocs,
device_info->total_allocs,
device_info->map_op_count,
device_info->bounce_count);
}
static DEVICE_ATTR(dmabounce_stats, 0400, dmabounce_show, NULL);
#endif
\end{TCBlisting}
\end{document}
\begin{lstlisting}[language=C, caption=\mylstcaption, label=lst:c1]
struct safe_buffer {
struct list_head node;
/* original request */
void *ptr;
size_t size;
int direction;
/* safe buffer info */
struct dmabounce_pool *pool;
void *safe;
dma_addr_t safe_dma_addr;
};
struct dmabounce_pool {
unsigned long size;
struct dma_pool *pool;
#ifdef STATS
unsigned long allocs;
#endif
};
struct dmabounce_device_info {
struct device *dev;
struct list_head safe_buffers;
#ifdef STATS
unsigned long total_allocs;
unsigned long map_op_count;
unsigned long bounce_count;
int attr_res;
#endif
struct dmabounce_pool small;
struct dmabounce_pool large;
rwlock_t lock;
int (*needs_bounce)(struct device *, dma_addr_t, size_t);
};
#ifdef STATS
static ssize_t dmabounce_show(struct device *dev, struct device_attribute *attr,
char *buf)
{
struct dmabounce_device_info *device_info = dev->archdata.dmabounce;
return sprintf(buf, "%lu %lu %lu %lu %lu %lu\n",
device_info->small.allocs,
device_info->large.allocs,
device_info->total_allocs - device_info->small.allocs -
device_info->large.allocs,
device_info->total_allocs,
device_info->map_op_count,
device_info->bounce_count);
}
static DEVICE_ATTR(dmabounce_stats, 0400, dmabounce_show, NULL);
#endif
\end{lstlisting}
\end{document}