将渐近线环境纳入宏

将渐近线环境纳入宏

我正在尝试编写一个宏(理想情况下是一个环境,但命令也可以),它获取一段 Asymptote 代码,将其显示在环境中verbatim,然后在asy环境中运行它。不幸的是,我对后者的每次尝试似乎都失败了。这是一个 MWE:

\documentclass{article}
\usepackage{asymptote}
\newcommand{\asycode}[1]{\begin{asy}
#1
\end{asy}}
\begin{document}
\asycode{label("$x^2 = x \cdot x$");}
\end{document}

如果我尝试编译它,我会得到以下内容:

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

? 

我在这里做错了什么?可以以任何合理的方式修复它吗?

[注:我尝试了多种不同的换行位置等排列方式,但似乎都不起作用。]

答案1

问题在于asy环境逐行写入输出文件;每行都使用行尾作为分隔符。通过将环境隐藏在宏中,无法进行所需的类别代码更改。当读取宏的参数时,将分配类别代码,因此无法再更改它们。特别是,依赖的换行符信息将无可挽回地asy丢失

您可以通过模拟asy环境的工作来实现。

\documentclass{article}
\usepackage{asymptote}

\makeatletter
\newcommand\asycode[2][]{%
  \stepcounter{asy}%
  \setkeys{ASYkeys}{#1}%
  \ifASYattach
    \ASYinlinefalse
  \fi
  \ifx\asydir\empty\else
    \def\ASYprefix{\asydir/}%
  \fi
  \immediate\write\AsyPreStream{%
    \noexpand\InputIfFileExists{%
      \ASYprefix\noexpand\jobname-\the\[email protected]}{}{}%
  }
  \asy@write@graphic@header
  \immediate\write\AsyStream{\detokenize{#2}}% here asy does the writing
  \asy@finalise@stream
  \asy@input@graphic
}
\makeatother

\begin{document}
\asycode{label("$x^2 = x \cdot x$");}
\end{document}

相关内容