使用 mdframed 包的多个左边距条

使用 mdframed 包的多个左边距条

如何使用mdframed包获取多个左边距条?我可以使用例如获取单个左边距条

\documentclass{article}
\usepackage{mdframed}
\begin{document}
\begin{mdframed}[linewidth=1,topline=false,rightline=false,bottomline=false]
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed sed orci quis urna volutpat tincidunt. Praesent ultrices commodo auctor. Nunc vel nulla sed arcu aliquet faucibus quis nec ante. Nam elementum neque vitae sem fringilla a euismod eros malesuada. Duis orci eros, tincidunt et venenatis at, tristique in tortor
\end{mdframed}
\end{document}

带输出

在此处输入图片描述

这个问题的目的是用 LaTeX 格式化电子邮件通信。因此,如果一封电子邮件引用了之前的电子邮件,而之前的电子邮件又引用了之前的电子邮件,则需要两个左栏。为了实现这一点,可以尝试嵌套环境mdframed以获得类似

在此处输入图片描述

后者的问题是,mdframed环境不允许嵌套环境分页。这意味着如果引用的文本超过一页,它就会崩溃。如果环境不是嵌套的,它允许分页。

更具体地说,对于一般情况,我希望有一个环境,比如myframe采用一个整数参数来指定要使用的左栏数量。例如,我可以这样写

\documentclass{article}
\usepackage{mdframed,lipsum}
\begin{document}
\def\numbars{3}
\begin{myframe}{\numbars}
  \lipsum[1-10]
\end{myframe}
\end{document}

答案1

以下解决方案可以作为起点。

让我从一些新钥匙开始。

该示例定义了一些新的键mdframed

  1. quotelinewidth-- 设置报价线的线宽
  2. quoteleveldistance-- 如果使用超过 1 级引号,则设置引号行之间的距离
  3. quotelevel-- 设置引用级别

一致tikzstyle quoteline被定义,指定 的样式。默认使用quoteline键的颜色。middlelinecolor

下面是分页符正常工作的示例。

在此处输入图片描述

\documentclass{article}
%\usepackage{showframe}
\usepackage[framemethod=tikz]{mdframed}%load xparse

\makeatletter
\mdf@dolist{\mdf@do@lengthoption}{%
   {quotelinewidth==1pt},%
   {quoteleveldistance==5pt},%
}
\newcounter{quotelevel}
\define@key{mdf}{quotelevel}[1]{%
  \setcounter{quotelevel}{#1}%
}%

\tikzset{quoteline/.style={}}%

\tikzset{quoteline/.append style={%
  draw=\mdf@middlelinecolor,%
  line width=\mdf@quotelinewidth@length%
}}%



\newcommand\computequotelines{%
 \wlog{MDF-INFO: quotelevel \the\value{quotelevel}}%
 \ifcase\value{quotelevel}%level 0
      \mdfsetup{hidealllines=true}%
 \or%level 1
     \wlog{quotelinewidth=\the\mdf@quotelinewidth@length and quoteleveldistance=\the\mdf@quoteleveldistance@length}%
     \setlength{\mdf@middlelinewidth@length}{\mdf@quotelinewidth@length}%
     \mdfsetup{innerleftmargin=\mdf@quoteleveldistance@length}%
 \else%more than 1 level
     \wlog{quotelinewidth=\the\mdf@quotelinewidth@length and quoteleveldistance=\the\mdf@quoteleveldistance@length}%
      \setlength{\mdf@middlelinewidth@length}{%
          \dimexpr \value{quotelevel}\mdf@quotelinewidth@length
            + \numexpr\value{quotelevel}-1\relax\mdf@quoteleveldistance@length
        }%
     \mdfsetup{innerleftmargin=\mdf@quoteleveldistance@length}%
 \fi
 \renewrobustcmd*\mdf@tikzbox@otl[2]{%one or two borders
    \clip(0,0)rectangle(\mdfboundingboxwidth,\mdfboundingboxheight);%
    \foreach \x in {1,...,\value{quotelevel}} {%
       \path[transform canvas={%
             xshift=   (\x-1)*\mdf@quoteleveldistance@length
                          -0.5\mdf@middlelinewidth@length
                          +0.5\mdf@quotelinewidth@length,},
         quoteline,mdfcorners,]##1;%
    }
 }%
}
\makeatother
\mdfdefinestyle{quotestyle}{%
    middlelinecolor=blue,quotelinewidth=2pt,
    hidealllines=true,leftline=true,%only leftline
    skipabove=11pt,skipbelow=11pt,
    innerleftmargin=0pt,innerrightmargin=0pt,
    settings=\computequotelines,}
\newmdenv[style=quotestyle]{myframe}
\usepackage{lipsum}
\begin{document}

\begin{myframe}[quotelevel=1]
  \lipsum[3]
\end{myframe}

\begin{myframe}[quotelevel=2]
  \lipsum[2]
\end{myframe}

\begin{myframe}[quotelevel=3]
  \lipsum[1]
\end{myframe}
\end{document}

相关内容