我正在尝试编写一个宏(理想情况下是一个环境,但命令也可以),它获取一段 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}