我使用三个包(在 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}
在这种情况下,不进行检查。