对于我的文档,我需要创建几个“listof”页面,所有页面都必须以统一的方式格式化。因此,listings 包中的标准功能支持不足。因此,我使用 document 类memoir
并使用其功能newlistof
, newfloat
& newlistentry
。到目前为止一切顺利,但请考虑以下代码:
\begin{ftlisting} %the float to be shown in my listoflistings
\lstinputlisting{code.file}
\caption{Code}
\label{lst:code}
\end{ftlisting}
此模板可以完美编译并运行,除非\lstinputlisting{}
命令包含需要拆分成多页的文件。突然,编译失败或文件未拆分成多页。我发现这个问题源于浮动不能跨越多页。当我\lstinputlisting
单独使用该命令时,它会将文件正确地拆分成几页。我知道存在一个部分解决方案,即通过将 firstline/lastline 选项传递给命令来手动剪切文件,\lstinputlisting
但此解决方案仅适用于 listings 包。有没有更好的解决方法?更完整的 MWE:
\documentclass{memoir}
\usepackage{listings}
\lstset{language=Java,nolol}
\newlistof{listoflistings}{lol}{List of \lstlistingname{}s}
\newfloat[chapter]{ftlisting}{lol}{\lstlistingname}
\newlistentry[chapter]{ftlisting}{lol}{0}
\begin{document}
\begin{ftlisting}
\lstinputlisting{code.java}
\caption{Code}
\label{lst:code}
\end{ftlisting}
\end{document}
答案1
浮动对象不允许分页符。您可以使用memoir
's\newfixedcaption
定义一个字幕命令,用于浮动环境之外的列表;定义一个辅助(非浮动)环境来包含应允许分页符的列表,并在此环境内使用新的字幕命令来提供字幕。在下面的示例中,myenv
是这个包含环境(使用 定义list
,因此允许分页符)。
\documentclass[a5paper]{memoir}
\usepackage[T1]{fontenc}
\usepackage{listings}
\usepackage{beramono}
\usepackage{filecontents}
\lstset{
basicstyle=\ttfamily,
breaklines=true,
columns=fullflexible
}
\begin{filecontents*}{code.java}
This is pdfTeX, Version 3.1415926-2.5-1.40.14 (TeX Live 2013)
restricted \write18 enabled.
entering extended mode
(./2014-01-30.tex
LaTeX2e <2011/06/27>
Babel <3.9f> and hyphenation patterns for 78 languages loaded.
(/usr/local/texlive/2013/texmf-dist/tex/latex/base/article.cls
Document Class: article 2007/10/19 v1.4h Standard LaTeX document class
(/usr/local/texlive/2013/texmf-dist/tex/latex/base/size10.clo))
No file 2014-01-30.aux.
[1{/usr/local/texlive/2013/texmf-var/fonts/map/pdftex/updmap/pdftex.map}]
(./2014-01-30.aux) )</usr/local/texlive/2013/texmf-dist/fonts/type1/public/amsf
onts/cm/cmr10.pfb>
Output written on 2014-01-30.pdf (1 page, 8170 bytes).
SyncTeX written on 2014-01-30.synctex.gz.
Transcript written on 2014-01-30.log.
\end{filecontents*}
\lstset{language=Java,nolol}
\newlistof{listoflistings}{lol}{List of \lstlistingname{}s}
\newfloat[chapter]{ftlisting}{lol}{\lstlistingname}
\newlistentry[chapter]{ftlisting}{lol}{0}
\newfixedcaption{\lstcaption}{ftlisting}
\newenvironment{myenv}
{\list{}{%
\leftmargin=0pt
\topsep=6pt
\listparindent=\parindent
\itemindent=\parindent
}\item\relax}
{\endlist}
\begin{document}
\listoflistings
\begin{ftlisting}[!ht]
\begin{lstlisting}
This is pdfTeX, Version 3.1415926-2.5-1.40.14 (TeX Live 2013)
restricted \write18 enabled.
entering extended mode
(./2014-01-30.tex
LaTeX2e <2011/06/27>
\end{lstlisting}
\caption{Code in a floating environment}
\label{lst:fcode}
\end{ftlisting}
\begin{myenv}
\lstinputlisting{code.java}
\lstcaption{Code in a non floating environment}
\label{lst:nfcode}
\end{myenv}
\end{document}
该filecontents
包和环境仅用于示例,以便于使用file code.java
;该a5paper
选项再次仅用于示例;这些设置对于解决方案而言并非必不可少。