重新扫描:在对齐中评估两次

重新扫描:在对齐中评估两次

为了&在里面使用,align我应用了这个很棒的答案https://tex.stackexchange.com/a/619983/116348,基本上设置&为使用:

\ExplSyntaxOn
\NewDocumentCommand{\zx}{O{}+m}{%
  \tl_rescan:nn { \char_set_catcode_active:N \& } { \begin{mytikzcd}[#1] #2 \end{mytikzcd} }
}
\ExplSyntaxOff

不幸的是,我不知道为什么,但是当此代码被包装到对齐中时,它会被评估两次(并且如果 tikz 图片需要花费大量时间来评估……那么两次会乘以 2)。

我知道这align可能会解析两次令牌,但令我惊讶的是令牌实际上被评估了两次。有没有什么想法可以只评估一次,或者这是否是一个根本问题?

平均能量损失

$ pdflatex twice.tex | grep XXX
XXX No align:
XXX>>Called...
XXX With align:
XXX>>Called...
XXX>>Called...
XXX End
\documentclass[]{article}
\usepackage{amsmath}
\usepackage{tikz-cd}

\usepackage{lipsum}

\ExplSyntaxOn
\NewDocumentCommand{\zx}{O{}+m}{%
  \message{XXX >> Called...^^J}%
  \tl_rescan:nn { \char_set_catcode_active:N \& } { \begin{tikzcd}[#1] #2 \end{tikzcd} }
}
\ExplSyntaxOff

\begin{document}

\message{^^JXXX No align:^^J}
\zx{A}

\message{XXX With align:^^J}
In align:
\begin{align}
\zx{A}
\end{align}

\message{XXX End^^J}
\end{document}

答案1

align总是被评估两次,(其他环境可能tabularx会被评估多次)如果你有一个昂贵的构造,你可以将它保存在一个盒子里,这样它只执行一次:

\documentclass[]{article}
\usepackage{amsmath}
\usepackage{tikz-cd}

\usepackage{lipsum}
\newbox\zz
\ExplSyntaxOn
\NewDocumentCommand{\zx}{O{}+m}{%
  \message{XXX >> Called...^^J}%
  \tl_rescan:nn { \char_set_catcode_active:N \& } { \begin{tikzcd}[#1] #2 \end{tikzcd} }
}
\ExplSyntaxOff

\begin{document}

\message{^^JXXX No align:^^J}
\zx{A}

\message{XXX With align:^^J}
\sbox\zz{\zx{A}}
In align:
\begin{align}
\usebox\zz
\end{align}

\message{XXX End^^J}
\end{document}

生成日志:

XXX No align:
XXX>>Called...
XXX With align:
XXX>>Called...
XXX End

相关内容