定义具有条件的新环境

定义具有条件的新环境

我想在模板文件中定义一个带有条件的新环境。我的环境由一排标题组成(在参数中给出),然后在下一行中提供 \begin{...} 和 \end{...} 之间的文本主体

更具体地说,我希望在给定环境参数的情况下,将标题 + 正文放入表格中以处理其位置。该参数是一个数字,如果数字等于 0,则通常定义标题 + 正文。另一方面,如果数字不为 0,则将标题 + 正文定义为包含两者的唯一单元格的表格。

下面是一个确实有效的解决方案,但我遇到了错误消息(虽然它可以编译):

\newenvironment{test}[2][0]
{\noindent\ifthenelse{ \equal{#1}{0} }{
{#2}
    
}{

\begin{tabular}{|p{0.9\textwidth}}
{#2}\\
}}
{ 
\\
\end{tabular} 
}

我使用了该包如果那么,我认为这是唯一需要的。

以下是一些使用案例:

\begin{test}[0]{Title}
Body of the text without tabular\\
\end{test}

\begin{test}[1]{Title}
Body of the text with tabular\\
\end{test}

该代码的输出如下:

在此处输入图片描述

因此,此处的代码确实有效,但我遇到了几个错误,例如“额外 } 或忘记了 \endgroup。”我想知道是否有人可以在这里找到我的错误?

注意:从这个例子中您可能明白,我最终会尝试在文本左侧放置一定数量的垂直边线。如果您有比我选择的方法更好的方法,我欢迎任何建议!

答案1

最大的问题是,\end{tabular}即使代码在开始部分没有使用制表符,您也总是会使用。您可以定义一个辅助宏来存储是否应该使用\end{tabular},如下所示。另外请注意,您的代码确实包含许多不需要的空格。确保%在行末放置一个以抑制那里的空格,例如,使用{%而不是仅{\ifthenelse块中。

您可以使用可选参数来定义应放置多少条规则tabular,下面使用*{<num>}{<toks>}表格序言的语法进行定义。

我还改变了您的一些\\使用\par,确保环境始终从自己的行开始(通过放在\par之前\noindent),使用抑制环境主体中第一行的缩进\@afterindentfalse\@afterheading(LaTeX 为其章节标题定义的机制),并使用抑制环境后面段落的缩进\@endpetrue,这样,如果您在\end{test}和以下文本之间放置一个空白行,则段落将被缩进,如果您不在那里放置空白行,则文本将不会缩进(这由 LaTeX 的列表使用)。

请注意,代码不会根据您使用的垂直规则数量动态更改表格的宽度,因此,如果您使用过多的规则,您可能会收到水平盒溢出警告。如果您希望更改这一点,请给我留言。

以下是代码:

\documentclass[]{article}

\usepackage{ifthen}

\makeatletter
\newcommand*\testEND{} % initialise the macro to check that it doesn't conflict
\newenvironment{test}[2][0]
  {%
    \par
    \noindent
    \ifthenelse{\equal{#1}{0}}
      {%
        \def\testEND{}%
        #2\par
        \@afterindentfalse\@afterheading
      }
      {%
        \def\testEND{\end{tabular}}%
        \begin{tabular}[t]{*{#1}{|}p{.9\linewidth}@{}}%
        #2\\%
      }%
  }
  {%
    \testEND
    \par\@endpetrue
  }
\makeatother

\begin{document}
\begin{test}{Something important}
  Body of the text without tabular.
\end{test}
Text outside the environment
\begin{test}[1]{Something important}
  Body of the text with tabular.
\end{test}

\begin{test}[2]{Something important}
  Body of the text with tabular and two lines.
\end{test}

\begin{test}[20]{Something important}
  Body of the text with tabular and two lines.
\end{test}

Text outside the environment
\end{document}

在此处输入图片描述

相关内容