为我的 \newcommand 寻找更好的代码

为我的 \newcommand 寻找更好的代码

在准备讲义时,我决定创建一个命令(可能是一个新的环境),用于突出显示我展示的示例。我想出了以下代码。该代码确实满足了我的一般用途及其目的,但我正在寻找一个可能更好的代码,其中包括以下内容:

  1. 环境应使用整个文本宽度,并在添加文本时垂直扩展。表格有点实现了此功能,因为它会在您添加文本时垂直扩展。如果您注意到我的代码中我强制了表格的文本宽度,以便它看起来更适合页面。我仍在努力。

  2. 环境可能会扩展到下一页,其中“示例 1”是“续示例 1”。我希望这不太难弄清楚。

我强制 tikzpicture 与表格边框对齐,但我知道这不是最好的方法。如能得到任何帮助,我将不胜感激。

    \documentclass[letterpaper]{article}
    \usepackage{fullpage,color}
    \usepackage{array,tikz}
    \parindent0pt
    \definecolor{mblue}{rgb}{0,0.6,0.8}
    \newcounter{mEgnum}
    \newcommand{\eg}[1]{%
    \par\vspace*{0.5cm}\stepcounter{mEgnum}
    \begin{tabular}{p{15cm}l|}
    \hline\setlength\parindent{-2.17mm}
    \begin{tikzpicture}
    \draw [color=mblue,fill=mblue](0,0) rectangle (0.25,0.75);
    \draw [color=mblue!20,fill=mblue!20](0.25,0) rectangle (3.5,0.75);
    \draw (0.5,0.375) node [right] {\large\textbf{ Example \arabic{mEgnum}}};
    \end{tikzpicture}
    & \tabularnewline
    #1
    &\tabularnewline\cline{2-2}
    \end{tabular}\par\vspace{0.5cm}\noindent%
    }

    \begin{document}
    \eg{Solve the following inequalities and represent the solution set in Set-Builder, Interval Notations and on the Number Line.&\tabularnewline}
    \end{document} 

样本

答案1

事实上,你的环境将不是如果示例长度超过一页,则无法正常工作。因此,为了解决您的第一个问题,我建议使用包裹mdframed它至少可以处理跨越页面边界的情况。

在此处输入图片描述

如果您希望它看起来像这样,那么问题的第 2 部分会更难解决:

在此处输入图片描述

我尝试使用repeatframetitle最新版本中提供的选项,但无法使其工作(发布如下)。看来软件包作者已经意识到了这一点,因为它在他们的待办事项列表中:

改善分页符。

进一步增强(请参阅下面不起作用的解决方案):

  • 处理如上所述的后续示例
  • 我必须调整tikz代码以继续示例图像。这其实没有必要,因此可能也可以改进。

代码:

\documentclass[letterpaper]{article}
\usepackage{fullpage,color}
\usepackage{tikz}
\usepackage{mdframed}

\usepackage{lipsum}% for dummy text
%\usepackage{showframe}% to see page frame

\parindent0pt
\definecolor{mblue}{rgb}{0,0.6,0.8}
\newcounter{mEgnum}

\newcommand{\eg}[1]{%
  \topskip=0pt% otherwise there is a space above
  \stepcounter{mEgnum}%
  \begin{mdframed}[
      leftline=false,
      innerleftmargin=0pt,
      skipabove=0pt,
      innertopmargin=0pt,
  ]
  %\setlength\parindent{-2.17mm}% only if you want header to be bleed into margin
  \begin{tikzpicture}
    \draw [color=mblue,fill=mblue](0,0) rectangle (0.25,0.75);
    \draw [color=mblue!20,fill=mblue!20](0.25,0) rectangle (3.5,0.75);
    \draw (0.5,0.375) node [right] {\large\textbf{Example \arabic{mEgnum}}};
  \end{tikzpicture}
  \par\noindent
  #1
  \end{mdframed}
}

\begin{document}
   \eg{\lipsum[1-10]}
\end{document} 

增强解决方案(但尚未完全发挥作用):

这是我尝试使用最新版本的mdframed在顶部重复标题,并且如果不是第一页,还会调整此标题。但由于某种原因,这不起作用,我不知道为什么。文档中关于该repeatframetitle选项有一条注释:

该功能目前尚未很好实现!!!

所以不确定这是否是第二页上框架标题不调整的原因

\documentclass[letterpaper]{article}
\usepackage{fullpage,color}
\usepackage{tikz}
\usepackage{mdframed}

\usepackage{lipsum}% for dummy text
%\usepackage{showframe}% to see pageframe
  
\parindent0pt
\definecolor{mblue}{rgb}{0,0.6,0.8}
\newcounter{mEgnum}

\newlength{\YShift}
\newlength{\InnerSep}
\newcommand*{\MyHeight}{0.75cm}%
\pgfmathsetlength{\YShift}{\MyHeight/2}%
\pgfmathsetlength{\InnerSep}{1.27ex}% should be computed
\newcommand*{\TitlePrefix}{Example}%
\newcommand{\MyFrameTitle}[1]{% Define a macro for this
   \begin{tikzpicture}
     \draw [color=mblue,fill=mblue](0,0) 
            rectangle (0.25,\MyHeight) 
            node [
                rectangle, right,fill=mblue!20, 
                inner sep=\InnerSep, yshift=-\YShift
             ] 
                {\large\textbf{\TitlePrefix #1}};
  \end{tikzpicture}
}
\newcommand{\eg}[1]{%
  \topskip=0pt% otherwise there is a space above
  \stepcounter{mEgnum}%
  \global\renewcommand{\TitlePrefix}{Example}% Initial title
  \begin{mdframed}[
      leftline=false,
      innerleftmargin=0pt,
      skipabove=0pt,
      innertopmargin=0pt,
      frametitle={\MyFrameTitle{\arabic{mEgnum}}},
      repeatframetitle=true,
  ]
  \par\noindent%
  \global\renewcommand{\TitlePrefix}{Contd Example}% Subsequent Titles
  #1
  \end{mdframed}
}

\begin{document}
   \eg{\lipsum[1-10]}
\end{document} 

相关内容