将 halign 主体的一部分作为参数传递给宏(以前是 AMS align 及其组)

将 halign 主体的一部分作为参数传递给宏(以前是 AMS align 及其组)

我原本以为这与对齐环境有关,但我发现它是 的一个特性\halign,因此进行了重大编辑。

在表格环境或简单的 halign 中,我需要能够将其部分内容(跨越多列和多行)传递给宏,该宏将对其进行处理并将其放回原位(举一个简单的例子,在内容的右侧和左侧放置一些分隔符)。除非在宏之前有排版的内容,否则它可以正常工作相同的单元格。以下是 MWE:

\documentclass{article}

\def\foo#1\bar{$\rightarrow$ #1 $\leftarrow$}

\begin{document}

\halign{ # & # \cr
  \foo foo & bar \bar \cr
%
  \foo foo & bar \cr
  foo & bar \bar \cr
%
  foo \foo foo \bar & \foo bar \bar \cr
%  foo \foo foo  & bar \bar \cr % error 'Forbidden control sequence found while scanning use of \foo'
}

\end{document}

使用非分隔宏(例如,\def\foo#1{ whathever #1}我无法跨越多行)(即使我将其定义为,也无法将其传递给 \cr \long)。我可以使用环境实现我想要的功能吗?如果可以的话——怎么做?

PS 我想做的是找到一个灵活的解决方案,将方程的某些部分放在 ams 对齐环境中,然后我决定按照@Marco Daniel 的示例在 TikZ 中编写自己的解决方案如何在 align* 内框住两行。最后,我需要抓取框架的全部内容(可能从单元格内的任何位置开始,并跨越多个单元格和行),这样我才能正确计算它的高度和深度。

答案1

我不知道你在做什么,所以这可能没什么用。但你可以用它tikzmark来标记数学或文本中的点,然后在 TikZ 中叠加注释。例如,一些简单的框架:

\documentclass{article}
\usepackage{mathtools}
\usepackage{tikz}
\usetikzlibrary{tikzmark,fit,calc}
\def\bmarkeq#1\emarkeq{#1}

\begin{document}
\begin{align}
  \bmarkeq\tikzmark{a1} \underbrace{foobar}_{barbaz} & & foobar \tikzmark{a2}\emarkeq \\
  \bmarkeq\tikzmark{b1} \underbrace{foobar}_{barbaz\tikzmark{b3}} & & foobar \tikzmark{b2}\emarkeq foo \\
  foo & & \bmarkeq\tikzmark{c1} \underbrace{foobar}_{barbaz\tikzmark{c3}} & & foobar \tikzmark{c2}\emarkeq \\
  % typing any text BEFORE \bmarkeq in the SAME group/column fails
  % foo \bmarkeq \underbrace{foobar}_{barbaz} & & foobar \emarkeq \\
\end{align}
\begin{tikzpicture}[overlay,remember picture]
  \foreach \i in {a1,a2,b1,b2,b3,c1,c2,c3} \coordinate (\i) at ({pic cs:\i});
  \node (a) [fit=(a1) (a2) (b1) (b2) (b3), draw=blue, inner xsep=5pt, inner ysep=7.5pt, yshift=5pt] {};
  \draw [magenta, inner sep=5pt] ($(c1)!1/2!(c1 |- b3)$) rectangle (c2 |- c3);
  \node (c) [fit=(a) (c1) (c2) (c3), draw=green, thick, rounded corners] {};
\end{tikzpicture}
\end{document}

简单框架

相关内容