使用其他环境创建LaTeX新环境时,编译器找不到\end命令

5

我正在为我的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}结束。

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

5个回答

5
如果您使用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}
}

5
\@float{table}替换\begin{table},用\end@float替换\end{table}\@float\end@float是LaTeX内部命令,用于启动和结束浮动环境。
您还需要遵循Alexey关于#2参数的建议。将其存储在环境的第一部分中(\gdef\mycaption{#2}),然后在第二部分中稍后调用\caption{\mycaption}。在\begin{defaultTable}行之前放置\def\mycaption{\relax}
此外,由于\@float\end@float中有@符号,因此如果此代码位于文档文件的导言部分(而不是例如.sty文件),则需要在\begin{defaultTable}之前放置\makeatletter,并且在\end{defaultTable}之后放置\makeatother

4

\newenvironment宏的最后一个参数中,您不能使用#2。您只能在第二个参数中使用#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}
}

谢谢你的提示,但它并没有解决问题。我仍然收到错误消息:\begin{table} 被 \end{document} 结束。 - arsenbonbon
请在您的文件中编写完整版本,包括前言。 - Alexey Malistov

1

我曾经遇到过同样的问题,原因是 "\end{tabularx}"。解决方法如下:

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

所以你需要将行定义为参数。

祝好, Eric


-1
您也可以使用类似Eric解决方案的\newcommand
\documentclass{article}

\usepackage{tabularx}

% The table design.
\newcommand{\defaultTable}[2]{
    \begin{table}[h]
        \begin{tabularx}{\textwidth}{cc}
        Column A & Column B \\
        #2
        \end{tabularx}
        \caption{#1}
    \end{table}
}
\newcommand{\defaultTableRow}[2]{#1 & #2 \\}

\begin{document}

% The creation of a table.
\defaultTable{Example}{
  \defaultTableRow{bla}{0815}
  \defaultTableRow{blup}{0815}
}

\end{document}

enter image description here

这样做可以避免你的两个问题(缺少\end{table}和在环境关闭代码中引用参数时出错),而且不需要太多麻烦。

事实上,我也喜欢将表格设计与表格数据分离的想法。特别是如果你创建了多个需要看起来相同的表格。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接