为了&
在里面使用,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