包裹在另一个环境中的 Asymptote 环境不起作用

包裹在另一个环境中的 Asymptote 环境不起作用

我正在尝试创建一个环境,该环境本质上是中心化的,并根据图表的代码创建一个渐近线图。这是一个最小的工作示例:

\documentclass{article}

\usepackage{asymptote}
\newenvironment{diagram}{\begin{center}\begin{asy}}{\end{asy}\end{center}}

\begin{document}

\begin{diagram}
    draw((0, 0) -- (1, 1));
\end{diagram}

\end{document}

上面的代码给出了Runaway argument? File ended while scanning use of \next错误。这似乎也是 Asymptote 特有的错误;如果我用其他东西替换\begin{asy}\end{asy},它就可以正常工作。这类似于问题,但按照那里的答案却不起作用。有解决方法吗?

答案1

asy环境属于逐字环境,因此要求文字字符串\end{asy}出现在环境末尾。由于您将其隐藏在里面,因此diagram它找不到\end并扫描文件中太远的地方,最终到达其末尾,然后您会收到文件已结束的错误:

Runaway argument?
! File ended while scanning use of \next.
<inserted text> 
                \par 
<*> test.tex
            
?

asy幸运的是,将寻找的结束环境的字符串更改为您自己的环境的字符串相当容易。这里有一个补丁,它定义了\asyenv{<name>},这样\begin{asy}就会寻找\end{<name>}结束逐字环境。对于您的情况,您必须说\asyenv{diagram}

\documentclass{article}

\usepackage{asymptote}

\usepackage{xpatch}
\makeatletter
\xpatchcmd\asy
  {\ProcessAsymptote{asy}}
  {\expandafter\ProcessAsymptote\expandafter{\asy@outer@env}}
  {}{\errmessage{Failed to patch asy}}
\def\asyenv#1{\def\asy@outer@env{#1}}%

\newenvironment{diagram}{%
  \begin{center}%
  \asyenv{diagram}%
  \begin{asy}%
}{%
  \end{asy}\end{center}%
}

\begin{document}

\begin{diagram}
    draw((0, 0) -- (1, 1));
\end{diagram}

\end{document}

相关内容