fancyvrb 中的最后一行有奇怪的间距

fancyvrb 中的最后一行有奇怪的间距

我仍在尝试创建一个 Jupyter 环境(参见Jupyter 输入和输出风格)。

这是一个最小的工作示例:

\documentclass[english,twoside,a4paper]{scrartcl}

%-------
%   Typography
%-------

\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{textcomp}
\usepackage{dsfont}
\usepackage{microtype}
\usepackage[onehalfspacing]{setspace}

%-------
%   Notebook Styling
%-------

\usepackage{listings}
\usepackage{fancyvrb}

\lstdefinestyle{NBoutput}{
    basicstyle={\linespread{1}\small\ttfamily},
    fancyvrb=true,
    basewidth=0.5em,
}

\usepackage[breakable]{tcolorbox}
\tcbset{nobeforeafter} % prevents tcolorboxes being placing in paragraphs

\definecolor{outcolor}{HTML}{D84315}

% prompt
\newcommand{\prompt}[4]{
    \llap{{\small\texttt{\color{#2}#1[#3]:#4}}}\vspace{-1em}
}

\newcounter{NBin}

\newenvironment{NotebookOut}{\refstepcounter{NBin}
    \VerbatimEnvironment
    \begin{tcolorbox}[breakable, boxrule=.5pt, size=fbox, pad at break*=1mm, opacityfill=0]
    \prompt{}{outcolor}{\theNBin}{\hspace{5.5pt}}
    \lstset{style=NBoutput}
    \begin{Verbatim}
}{
    \end{Verbatim}
    \end{tcolorbox}
}

\begin{document}

\begin{NotebookOut}
Hello World!
Hello World!
Hello World!
\end{NotebookOut}

\end{document}

不知为何,最后一行总是被跳过一点,这当然是我们不希望看到的。

另外,我也尝试过其他软件包,比如 minted 或 listing,但它们似乎由于其他原因而不起作用。

除此之外,我很欣赏代码的任何改进。

提前致谢! :)

答案1

我认为这个虚假空间是由于使用了listings和 而导致fancyvrb的,这在某种程度上与此发生冲突。你为什么不直接使用listings软件包自带的库tcolorbox呢?(虽然你上面的例子并没有真正展示出来,但我知道你使用了其他需要背景和颜色的框tcolorbox,这就是我在这里提出这个解决方案的原因。)

因此,一个可能的解决方案tcolorbox是:

\documentclass[twoside,a4paper]{scrartcl}

%-------
%   Typography
%-------

\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{textcomp}
\usepackage{dsfont}
\usepackage{microtype}
\usepackage[onehalfspacing]{setspace}

%-------
%   Notebook Styling
%-------

\usepackage[breakable]{tcolorbox}
\tcbuselibrary{listings}
\tcbset{nobeforeafter} 

\definecolor{outcolor}{HTML}{D84315}

\newcommand{\prompt}[4]{%
    \makebox[0pt][r]{\texttt{\color{#2}#1[#3]:#4}}\vspace{-\baselineskip}%
}

\newcounter{NBin}

\newtcblisting{NotebookOut}{
    breakable,
    boxrule=.5pt, 
    size=fbox, 
    pad at break*=1mm, 
    opacityfill=1,
    phantom=\refstepcounter{NBin},
    title=\prompt{}{outcolor}{\theNBin}{\hspace{5.5pt}},
    fonttitle=\linespread{1}\small,
    attach title to upper,
    listing only,
    listing options={
        language=python,
        basicstyle=\linespread{1}\small\ttfamily,
        basewidth=.5em,
        aboveskip=0pt,
        belowskip=0pt,
        showstringspaces=false,
    }
}

\begin{document}

\begin{NotebookOut}
echo "Hello World!";
echo "Hello World!";
\end{NotebookOut}

\end{document}

结果:

在此处输入图片描述

答案2

您定义并使用 fancyvrb 环境的变体Verbatim

您还可以使用 listings-package 的界面来 fancyvrb。(那个fancyvrb=true东西。)

根据 listings-package 的手册,这意味着幻想VRB-package 用于阅读.tex 文件/源代码中的代码列表以及列表-package 用于排版代码清单。

似乎当 lisitings-package 的内部排版列表的最后一行时,由于计算的 baselineskipbasicstyle={\linespread{1}\small\ttfamily}不再有效。

\usepackage[onehalfspacing]{setspace}相反,由于\normalfont/导致的基线跳过错误地\normalsize生效了。

这可能是 listings-package 与 fancyvrb 接口中的一个错误。

您可以通过修补宏来在打印最后一行之前恢复基本样式来测试这一点\FV@ListProcessLastLine

\documentclass[english,twoside,a4paper]{scrartcl}

%-------
%   Typography
%-------

\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{textcomp}
%\usepackage{dsfont}
\usepackage{microtype}
\usepackage[onehalfspacing]{setspace}

%-------
%   Notebook Styling
%-------

\usepackage{listings}
\usepackage{fancyvrb}

\lstdefinestyle{NBoutput}{
    basicstyle={\linespread{1}\small\ttfamily},
    fancyvrb=true,
    basewidth=0.5em,
}

\usepackage[breakable]{tcolorbox}
\tcbset{nobeforeafter} % prevents tcolorboxes being placing in paragraphs

\definecolor{outcolor}{HTML}{D84315}

% prompt
\newcommand{\prompt}[4]{%
    \llap{{\small\texttt{\color{#2}#1[#3]:#4}}}\vspace{-1em}%
}

\newcounter{NBin}

\newenvironment{NotebookOut}{\refstepcounter{NBin}%
    \VerbatimEnvironment%
    \lstset{style=NBoutput}%
    \begin{tcolorbox}[breakable, boxrule=.5pt, size=fbox, pad at break*=1mm, opacityfill=0]%
    \prompt{}{outcolor}{\theNBin}{\hspace{5.5pt}}%
    \begin{Verbatim}%
}{%
    \end{Verbatim}\end{tcolorbox}%
}%

% For testing-purposes patch \FV@ListProcessLastLine to restore NBoutput's basicstyle:
\makeatletter
\def\FV@ListProcessLastLine{%
  \begingroup
  % Here the patching:
  \linespread{1}\small\ttfamily
  %
  \ifx\FV@ProcessLine\FV@ListProcessLine@iv
    {\advance\interlinepenalty\widowpenalty
     \penalty\interlinepenalty}%
    \box\@tempboxa
  \else
    \ifx\FV@ProcessLine\FV@ListProcessLine@iii
      {\advance\interlinepenalty\widowpenalty
       \advance\interlinepenalty\clubpenalty
       \penalty\interlinepenalty}%
      \box\@tempboxa 
    \else
      \ifx\FV@ProcessLine\FV@ListProcessLine@i
        \FV@Error{Empty verbatim environment}{}\FV@ProcessLine{}%
      \fi
    \fi
  \fi
  \endgroup
}%
\makeatother

\begin{document}

\begin{NotebookOut}
Hello World!
Hello World!
Hello World!
\end{NotebookOut}

\end{document}

在此处输入图片描述

您还可以通过\linespread{1}\small\ttfamily在您的环境范围内使其有效来测试这一点,无论\lstset-settings 是否有效:

\documentclass[english,twoside,a4paper]{scrartcl}

%-------
%   Typography
%-------

\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{textcomp}
%\usepackage{dsfont}
\usepackage{microtype}
\usepackage[onehalfspacing]{setspace}

%-------
%   Notebook Styling
%-------

\usepackage{listings}
\usepackage{fancyvrb}

\lstdefinestyle{NBoutput}{
    basicstyle={\linespread{1}\small\ttfamily},
    fancyvrb=true,
    basewidth=0.5em,
}

\usepackage[breakable]{tcolorbox}
\tcbset{nobeforeafter} % prevents tcolorboxes being placing in paragraphs

\definecolor{outcolor}{HTML}{D84315}

% prompt
\newcommand{\prompt}[4]{%
    \llap{{\small\texttt{\color{#2}#1[#3]:#4}}}\vspace{-1em}%
}

\newcounter{NBin}

\newenvironment{NotebookOut}{\refstepcounter{NBin}%
    \VerbatimEnvironment%
    % Make \linespread{1}\small\ttfamily effective no matter if \lstset-settings are in effect or not:
    \begingroup
    \linespread{1}\small\ttfamily
    \lstset{style=NBoutput}%
    \begin{tcolorbox}[breakable, boxrule=.5pt, size=fbox, pad at break*=1mm, opacityfill=0]%
    \prompt{}{outcolor}{\theNBin}{\hspace{5.5pt}}%
    \begin{Verbatim}%
}{%
    \end{Verbatim}\end{tcolorbox}%
    \endgroup
}%

\begin{document}

\begin{NotebookOut}
Hello World!
Hello World!
Hello World!
\end{NotebookOut}

\end{document}

在此处输入图片描述

相关内容