我原本以为这与对齐环境有关,但我发现它是 的一个特性\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}