我想在模板文件中定义一个带有条件的新环境。我的环境由一排标题组成(在参数中给出),然后在下一行中提供 \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}