乳胶使用其他环境的新环境,编译器找不到\ end

时间:2009-11-18 08:16:42

标签: latex

我正在为我的乳胶文档设置一个新环境以获得一致的表格。它看起来像这样:

\newenvironment{defaultTable}[2] {
    \begin{table}[h]
    \noindent
    \tabularx{\textwidth}{#1}
    \specialrule{0.5pt}{10pt}{0pt} \rowcolor[gray]{.9}
} {
    \bottomrule 
    \endtabularx
    \caption{#2}
    \end{table}
}

它似乎没有找到\ end {table}:

! LaTeX错误:输入行23上的\ begin {table}以\ end {document}结束。

有没有办法避免这种情况?

4 个答案:

答案 0 :(得分:4)

如果使用xparse机制,最后可以使用#2:

\usepackage{xparse}
\NewDocumentEnvironment{defaultTable}{+m+m}{%
    \begin{table}[h]
    \noindent
    \tabularx{\textwidth}{#1}
    \specialrule{0.5pt}{10pt}{0pt} \rowcolor[gray]{.9}
} {%
    \bottomrule 
    \endtabularx
    \caption{#2}
    \end{table}
}

答案 1 :(得分:4)

\begin{table}替换为\@float{table},并将\end{table}替换为\end@float

\@float\end@float是LaTeX用于启动和结束浮动环境的内部命令。

您还需要遵循Alexey关于#2参数的建议。将其存储在环境的第一部分(\gdef\mycaption{#2})中,然后在第二部分中稍后再回忆\caption{\mycaption}。将\def\mycaption{\relax}放在\begin{defaultTable}行之前。

此外,由于\@float\end@float中有@个符号,如果此代码位于文档文件的前导中(而不是.sty个文件),您需要在\makeatletter之前加\begin{defaultTable},在\makeatother之后加\end{defaultTable}

答案 2 :(得分:3)

您不能在#2宏的最后一个参数中使用\newenvironment。你应该只在第二个参数中使用#1 ..#9。

#2保存到\tempa(或任何宏)。并在标题中使用\tempa

\newenvironment{defaultTable}[2]{
  \begin{table}[h]
  \def\tempa{#2}
  \noindent    
  \tabularx{\textwidth}{#1}    \specialrule{0.5pt}{10pt}{0pt} \rowcolor[gray]{.9}
}{    
 \bottomrule     
 \endtabularx    
 \caption{\tempa}
 \end{table}
}

答案 3 :(得分:2)

我遇到了同样的问题,这是因为“\ end {tabularx}”。解决方案是:

  

\ newenvironment {defaultTable} [3] {
      \开始{表}并[h]
      的 \字幕{#2}
      \ noindent,会
      \开始{tabularx} {\文本宽度} {#1}
      \ specialrule {0.5pt} {10pt} {0pt} \ rowcolor [gray] {。9}
      的#3
      \ bottomrule
      \ end {tabularx}
} {
      \ end {table}}

因此,您将行定义为参数。

此致 埃里克