使用 tabularx 定义自定义环境

使用 tabularx 定义自定义环境

我使用这个代码:

\begin{tabularx}{\textwidth}{c|X} 
  \emph{17:49} & Very long text...
\end{tabularx}

为了得到这个(我想使用 LaTeX 来保存个人日记,笔记应该是这样的): 这就是我想使用自定义环境获得的结果

我试图定义一个自定义环境(#1是写下注释的时间):

\newenvironment{note}[1]
{
\begin{tabularx}{\textwidth}{c|X} 
  \emph{#1} & 
}
{
\end{tabularx} 
}

但它不起作用。以下是日志文件告诉我的内容:

Runaway argument?

! File ended while scanning use of \TX@get@body.
<inserted text> 
                \par 
<*> test.tex

答案1

文档tabularx指出

这种抓取环境主体的机制确实存在缺点(与 AMS 对齐环境相同),即您无法通过以下代码创建扩展环境

\newenvironment{foo}{\begin{tabularx}{XX}}{\end{tabularx}}

因为代码正在寻找字符串 \end{tabularx} 来停止扫描。从 2.02 版开始,可以通过在定义中直接使用 \tabularx 和 \endtabularx 来避免此问题:

\newenvironment{foo}{\tabularx{XX}}{\endtabularx}

扫描仪现在寻找当前环境的结束(本例中为 foo)。这种用法有一些限制,主要的是 \endtabularx 不能位于任何 { } 对内,以便 \endtabularx 之前的代码可以被提取并添加到表体中(在 2.09 版本之前,\endtabularx 必须是环境“结束代码”的第一个标记)。

因此,你可以将环境定义为

\newenvironment{note}[1]{%
    \par\noindent
    \tabularx{\textwidth}{c|X}%
    \emph{#1}   &%
}{%
    \endtabularx%
}

我添加\par\noindent了定义。\par结束上一段并\noindent确保条目没有缩进\parindent(这会导致过度\hbox)。

答案2

使用\NewEnviron而不是\newenvironment

\NewEnviron{note}[1]{
  \begin{tabularx}{\textwidth}{c|X} 
    \emph{#1} & \BODY
  \end{tabularx} 
}

完整示例:

\documentclass{article}
\usepackage{tabularx}
\usepackage{environ}

\NewEnviron{note}[1]{
  \begin{tabularx}{\textwidth}{c|X} 
    \emph{#1} & \BODY
  \end{tabularx} 
}

\begin{document}
\begin{note}{text}
  more text
\end{note}
\end{document}

相关内容