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

发布于 2024-08-11 07:56:46 字数 412 浏览 4 评论 0原文

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

\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} 结尾。

有办法避免这种情况吗?

I'm setting up a new environment for my latex document for consistent tables. It looks like this:

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

It doesn't seem to find the \end{table} though:

! LaTeX Error: \begin{table} on input line 23 ended by \end{document}.

Is there a way to avoid this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

锦上情书 2024-08-18 07:56:46

\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}之前\end{defaultTable} 之后的 >\makeatother

Replace \begin{table} with \@float{table} and replace \end{table} with \end@float.

The \@float and \end@float are LaTeX's internal commands for starting and ending the float environment.

You'll also want to follow Alexey's advice on the #2 parameter. Store it in the first part of your environment (\gdef\mycaption{#2}) and then recall it later \caption{\mycaption} in the second part. Put \def\mycaption{\relax} just before the \begin{defaultTable} line.

Also, since \@float and \end@float have @ signs in them, if this code is in the preamble of your document file (instead of say, a .sty file), you'll need to put \makeatletter before your \begin{defaultTable} and also \makeatother after \end{defaultTable}.

千纸鹤带着心事 2024-08-18 07:56:46

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

You can use #2 in the end if you use the xparse mechanism:

\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}
}
倚栏听风 2024-08-18 07:56:46

您不能在 \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}
}

You can not use #2 in the last argument of the \newenvironment macros. You should use #1..#9 in the second argument only.

Save your #2 to \tempa (or any macros). And use \tempa in the caption.

\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}
}
黑白记忆 2024-08-18 07:56:46

我也有同样的问题,这是因为“\end{tabularx}”。解决办法是:

\newenvironment{defaultTable}[3] {
\begin{表}[h]
\caption{#2}
\无缩进
\begin{tabularx}{\textwidth}{#1}
\specialrule{0.5pt}{10pt}{0pt} \rowcolor[灰色]{.9}
#3
\底部规则
\end{tabularx}
} {
\end{表} }

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

问候,
埃里克

I've has the same problem, and it is because of the "\end{tabularx}". The solution is:

\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} }

So you define the rows as a parameter.

Regards,
Eric

羞稚 2024-08-18 07:56:46

您也可以只使用类似于 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}

输入图片description here

这将避免您的问题(缺少 \end{table} 以及在关闭代码的环境中引用参数时的错误),而不会产生太多麻烦。

事实上,我也喜欢将表设计与表数据分开的想法。特别是当您创建多个需要看起来相等的表时。

You could also just use a \newcommand similar to Eric's solution.

\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

This will avoid both your problems (the missing \end{table} and the error when referencing arguments in the environments closing code) without much hassle.

In fact I also like the idea of separating the table design from the table data. Especially if you create multiple tables that need to look equal.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文