在环境中包装 for 循环

在环境中包装 for 循环

我正在尝试创建一个包装 for 循环的环境:

\documentclass{article}
\usepackage[utf8]{inputenc}

\title{Testing}
\author{This is a Name}
\date{June 2022}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
\begin{document}

\maketitle

\newenvironment{fora}{
  \pgfplotsforeachungrouped \i in {0,1,...,5}  {
} {
  }
}
\begin{fora}
\textit{meow}
\end{fora}

\end{document}

我在 overleaf 的 \end{fora} 处收到此错误:

Missing \endcsname inserted.
TeX capacity exceeded, sorry [input stack size=5000].

我的目标是打印 5 次“meow”。您知道哪里出了问题吗?我猜是与嵌套花括号有关的问题。

答案1

你似乎正在尝试类似

\newcommand{\mycommand}[1]{something with #1}

\newenvironment{fora}
  {\mycommand{}% begin part
  {}}% end part

其中{开始部分的应该与}结束部分的相匹配。

抱歉,不行,它不能工作:像这样的“开始部分”会有不匹配的括号,实际上,TeX 会以一种你可能会感到惊讶的方式匹配它们,但事实并非如此。

您可能想要的是获取环境内容并将其传递给宏。

\documentclass{article}
\usepackage{pgfplots}

\pgfplotsset{compat=1.18}

\NewDocumentEnvironment{fora}{+b}
  {\pgfplotsforeachungrouped \i in {0,1,...,5}  {#1}}
  {}

\begin{document}

\begin{fora}
\textit{meow}
\end{fora}

\end{document}

参数类型b大致表示“使其#1成为环境的全部内容,去掉前导和尾随空格”;前缀+表示环境中允许有空行。

在此处输入图片描述

其他一些评论:

  1. inputenc如果输入文件是 UTF-8,则不再需要

  2. 首先加载包,然后进行声明。声明\title在前面\usepackage{pgfplots}会使文档维护时难以找到内容

  3. 在序言中声明你的命令和环境,而不是在之后\begin{document}

答案2

为了理解错误,缩进输入有助于更好地显示结构

你会得到同样的错误

\documentclass{article}
\usepackage[utf8]{inputenc}

\title{Testing}
\author{This is a Name}
\date{June 2022}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
\begin{document}

\maketitle

\newenvironment{fora}
  {\pgfplotsforeachungrouped \i in {0,1,...,5}  {} {}}
  \begin
{fora}

\textit{meow}
\end{fora}

\end{document}

可以简化为

\documentclass{article}

\begin{document}

\newenvironment{fora}
  {}
  \begin

\end{fora}

\end{document}

因此,环境的开始代码是一个带有空体的循环(但这从未被调用,因此我在这里演示了一个空的开始代码)

环境的结束代码是\begin

因此\end 从插入开始\begin,您会得到一个不需要的扩展的内部循环。

相关内容