我正在尝试创建一个包装 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
成为环境的全部内容,去掉前导和尾随空格”;前缀+
表示环境中允许有空行。
其他一些评论:
inputenc
如果输入文件是 UTF-8,则不再需要首先加载包,然后进行声明。声明
\title
在前面\usepackage{pgfplots}
会使文档维护时难以找到内容在序言中声明你的命令和环境,而不是在之后
\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
,您会得到一个不需要的扩展的内部循环。