使用 lstlisting 时定理内的格式被破坏

使用 lstlisting 时定理内的格式被破坏

根据这里的其他答案(例如避免在 \lstlistings 中分页我如何确保列表不会被拆分?) 我已将所有列表放在一个迷你页面中,以避免不必要的分页符。总体而言,我实现了我想要的,但现在如果在定理中使用列表(我将使用自定义环境“代码”),我会遇到麻烦:

\documentclass{article}
\usepackage[usenames,dvipsnames,table]{xcolor}
\usepackage{amssymb}
\usepackage{amsthm}
\usepackage{thmtools}
\usepackage{listings}

\declaretheorem[qed=$\blacktriangle$]{example}

\lstnewenvironment{code}[1][]%
{%
\noindent%
\minipage{\linewidth}%
\vspace{0.5\baselineskip}%
\medskip%
\lstset{#1}}%
%\qedhere .. would be too easy
{\endminipage}

\begin{document}
\begin{example}
\begin{code}[frame=lines]
this is code
\end{code}
\end{example}
\end{document}

得出的结果是:

问题

我这里有两个问题:

  1. 如果我在开头没有文字(或者甚至需要一个段落),列表就会紧挨着“示例 1”文本,并且超出右页边距。
  2. qedhere 的位置不太好。(虽然对于应该如何放置还有争议)

谢谢你!

谨致问候,马库斯

答案1

您不必使用迷你页面来使代码牢不可破。您可以设置列表的布尔值。

\documentclass{article}
\usepackage[usenames,dvipsnames,table]{xcolor}
\usepackage{amssymb}
\usepackage{amsthm}
\usepackage{thmtools}
\usepackage{listings}

\declaretheorem[qed=$\blacktriangle$]{example}
\lstnewenvironment{code}[1][]%
{\mbox{}\endgraf\nopagebreak%
\csname lst@boxtrue\endcsname %make the listings a box
\lstset{boxpos=t,#1}}%
{}

\begin{document}
blblb
\vspace*{35\baselineskip}
\begin{example}
\begin{code}[frame=lines,linewidth=0.8\linewidth]
this is code
this is code
this is code
this is code
this is code
this is code
this is code
this is code
this is code
this is code
this is code
this is code
this is code
this is code
\end{code}
\end{example}
\end{document}

答案2

另外两个基于 的解决方案ntheorem。要么定义一个新的示例环境break,其样式为 ,与“正常”示例环境共享相同的计数器,以用于此类情况。要么使用正常的示例环境,但在开头添加命令以进行换行。

 \documentclass{article}
\usepackage[dvipsnames,table]{xcolor}
\usepackage{amsmath, amssymb}

\usepackage[thmmarks, amsmath]{ntheorem}
\usepackage{listings}

\theoremstyle{plain}
\theoremheaderfont{\upshape\bfseries}
\theoremseparator{.}
\theorembodyfont{\upshape}
\theoremsymbol{\raisebox{-0.45ex}{$\blacktriangle$}}
\newtheorem{example}{Example}
\theoremstyle{break}
\theoremseparator{.\medskip}
\newtheorem{brexample}[example]{Example}

\lstnewenvironment{code}[1][]%
{%
\noindent%
\minipage{\linewidth}%
\vspace{0.5\baselineskip}%
\medskip%
\lstset{#1}}%
{\endminipage}

\begin{document}
%
\begin{example}\NoEndMark\leavevmode\vspace{-1ex}\par
  \begin{code}[frame=lines]
    this is code
  \end{code} \llap{\exampleSymbol}
\end{example}

\begin{brexample}\NoEndMark
  \begin{code}[frame=lines]
    this is code
  \end{code} \llap{\exampleSymbol}
\end{brexample}

\end{document}

在此处输入图片描述

相关内容