可选参数和 &

可选参数和 &

我定义了一个简单的图表环境

\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}

编译失败,上面的图表代码需要更改为才能{}&再次工作。因此,大概只要图表以 & 符号开头,就应用此更改可以解决我的问题,但我想知道

  1. 为什么会发生这种情况,以便我将来可以避免类似的问题

并且看到

\begin{tikzcd}
    &
\end{tikzcd}

工作正常,并且 tikzcd 也接受可选参数,

  1. 除了在大量图表中添加多余的括号之外,有没有更好的方法来解决这个问题?

答案1

当允许使用可选参数时,LaTeX 会向前扫描以查找[,并忽略其中的空格。在

\begin{diagram}
& x
\end{diagram}

它停止扫描&,这就是问题所在:令牌&被放回去再次读取,但tikz-cd想要重新定义&它的目的,并且它无法对已经读取的令牌执行任何操作。

解决方案:使用\NewDocumentEnvironmentxparse扫描向前[ 没有忽略空格。警告:将成为非法行为;和\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}

相关内容