我定义了一个简单的图表环境
\usepackage{tikz-cd}
\newenvironment{diagram}
{ \begin{equation}\begin{tikzcd} }
{ \end{tikzcd}\end{equation} }
并且运行良好。特别是这个编译:
\documentclass{article}
\usepackage{tikz-cd}
\newenvironment{diagram}
{ \begin{equation}\begin{tikzcd} }
{ \end{tikzcd}\end{equation} }
\begin{document}
\begin{diagram}
&
\end{diagram}
\end{document}
后来我意识到我需要在多个地方用不同的参数调用 tikzcd,所以我改变了环境定义以包含一个可选参数,但现在
\documentclass{article}
\usepackage{tikz-cd}
\newenvironment{diagram}[1][]
{ \begin{equation}\begin{tikzcd}[#1] }
{ \end{tikzcd}\end{equation} }
\begin{document}
\begin{diagram}
&
\end{diagram}
\end{document}
编译失败,上面的图表代码需要更改为才能{}&
再次工作。因此,大概只要图表以 & 符号开头,就应用此更改可以解决我的问题,但我想知道
- 为什么会发生这种情况,以便我将来可以避免类似的问题
并且看到
\begin{tikzcd}
&
\end{tikzcd}
工作正常,并且 tikzcd 也接受可选参数,
- 除了在大量图表中添加多余的括号之外,有没有更好的方法来解决这个问题?
答案1
当允许使用可选参数时,LaTeX 会向前扫描以查找[
,并忽略其中的空格。在
\begin{diagram}
& x
\end{diagram}
它停止扫描&
,这就是问题所在:令牌&
被放回去再次读取,但tikz-cd
想要重新定义&
它的目的,并且它无法对已经读取的令牌执行任何操作。
解决方案:使用\NewDocumentEnvironment
该xparse
扫描向前[
没有忽略空格。警告:将成为非法行为;和\begin{diagram} [<option>]
之间不应有空格。}
[
\documentclass{article}
\usepackage{tikz-cd,xparse}
\NewDocumentEnvironment{diagram}{O{}} % an optional argument, empty default
{\begin{equation}\begin{tikzcd}[#1]}
{\end{tikzcd}\end{equation}}
\begin{document}
\begin{diagram}
& x
\end{diagram}
\end{document}