mdframed 标签多次定义 (带列表和 paracol)

mdframed 标签多次定义 (带列表和 paracol)

我使用三个包(在 Latex“书”文档中)来并排显示源文件(不仅是 tex,有时还从外部文件加载)及其输出(有时从外部文件加载)。

  • 语法高亮列表
  • paracol 并排显示
  • mdframed 定制外观

我的问题是,这会导致多重定义标签的警告(我认为是在 mdframed 内部的某个地方):

WARNING: Label 'mdf@pagelabel-1' multiply defined
WARNING: There were multiply defined labels

我已经想尽办法解决了,但对我的解决方案并不满意……有没有更好的方法?

这是我最简化的“使用警告”示例。我的 hack 已被注释掉(要使用它们,请在 \switchcolumn 命令上切换注释)。

\documentclass[]{book}

\usepackage{listings}
\usepackage{mdframed}
\usepackage{paracol}

\lstnewenvironment{insertcode}{\mdframed}{\endmdframed}

%-------------------------------------------------------
%\newcounter{mdfzrefhack}
%\setcounter{mdfzrefhack}{1}
%\newcommand{\swcsafe}{
%\switchcolumn
%\setcounter{mdf@zref@counter}{\value{mdfzrefhack}}
%\addtocounter{mdfzrefhack}{1}
%}
%=======================================================

%-------------------------------------------------------

\begin{document}

\begin{paracol}{2}
\begin{insertcode}
x
\end{insertcode}

%-------------------------------------------------------
%\swcsafe
%=======================================================
\switchcolumn
%-------------------------------------------------------

\begin{insertcode}
y
\end{insertcode}
\end{paracol}

\end{document}

下面的每个修改(在某些情况下会产生神奇的效果)都会使警告消失:

  • 不使用 mdframed
  • 将文档类型从书籍更改为最简(例如)
  • 将其中一个列表稍微往下移动一点,在列中将一些文本放在其上方

编辑:简化示例,删除 PS(感谢埃格尔

更新:我刚刚已提交这个在 的 github 上mdframed

答案1

您必须使用 中的“内部”命令\lstnewenvironment,而不是\begin{mdframed}\end{mdframed}。这似乎有效:

\documentclass[]{book}

\usepackage{listings}
\usepackage{mdframed}
\usepackage{paracol}

\lstnewenvironment{insertcode}{\mdframed}{\endmdframed}

\newcounter{mdfzrefhack}
\setcounter{mdfzrefhack}{1}
\newcommand{\swcsafe}{\switchcolumn
  \setcounter{mdf@zref@counter}{\value{mdfzrefhack}}%
  \addtocounter{mdfzrefhack}{1}%
}

\begin{document}

\begin{paracol}{2}
\begin{insertcode}
x
\end{insertcode}

\swcsafe

\begin{insertcode}
y
\end{insertcode}
\end{paracol}

\end{document}

在此处输入图片描述

我可能会说

\lstnewenvironment{insertcode}[1][]
  {\lstset{#1}\mdframed}
  {\endmdframed}

以便可以设置附加listings选项。insertcode

答案2

官方的mdframed软件包作者和维护者的回答:

在您的问题中,您指出了正确的问题。我认为最简单的方法是使用以下选项usetwoside=false

\lstnewenvironment{insertcode}{\mdframed[usetwoside=false]}{\endmdframed}

在这种情况下,不进行检查。

相关内容