我有一个通用方程,我想在其中“插入”一些东西,以便读者可以看到我在方程中插入了什么以及在哪个点插入了什么。
例如
\documentclass{plain}
\begin{document}
\[ f = < x | R y > \]
Insert $\int d^3 p |p> <p|$ = 1 before y.
\end{document}
我想象的是水平花括号,它延伸到等式下方,其尖端略微接触到 左侧的一个点$y$
,而括号中写着$\int d^3 p |p> <p|$
。它看起来有点像倒置的\underbrace{foo}_{bar}
,但我不知道如何实现这样的效果。
在 ASCII 艺术中,它可能看起来像这样:
f = <x | R y > (1)
__|__
____| |____
| Insert here! |
答案1
这是 Gonzalo 代码的一个变体,它使用\mathop{}\limits
而不是\raisebox
。输出几乎相同。
\documentclass{article}
\usepackage{mathtools}
\begin{document}
\[
f = \langle x | R\mathclap{\mathop{}\limits_{\overbrace{
\textstyle\int d^3 p |p\rangle \langle p|}}}y
\rangle
\]
\end{document}
如果您想要更灵活的方法,请使用\braceinsert
以下代码中的宏。它需要一个可选参数(括号应降低的量,默认为)和一个必需参数(您想要在括号下的内容)。此外,它还处理了被分隔符包围的0ex
情况,如下所示:\braceinsert
\left...\right
准确地说,你必须使用\bileft...\biright
而不是\left...\right
(如b
race i
nsert left 和 right)。在最外层之后\biright
,只有明确的上标可以工作,因此'
你必须使用^\prime
。(下标无法正常工作,但我不知道什么时候需要它。)
\documentclass{article}
\usepackage{mathtools}
\setlength{\textwidth}{11cm}
\makeatletter
\newcounter{left@right}
\newcommand*\bileft[1]{\left#1\stepcounter{left@right}}
\newcommand*\biright[1]{\right#1%
\@ifnextchar^{\with@superscript}{\without@superscript}}
\def\with@superscript^#1{^{#1}\without@superscript}
\def\without@superscript{%
\addtocounter{left@right}{-1}%
\ifnum\theleft@right=0
\vphantom{\brace@insert@strut}
\gdef\brace@insert@strut{}
\fi
}
\def\brace@insert@strut{}
\newcommand{\braceinsert}[2][0ex]{%
\def\insert@material{%
\mathop{\rule[-#1]{0pt}{0pt}}\limits_{\overbrace{#2}}%
}%
\expandafter\g@addto@macro\expandafter\brace@insert@strut
\expandafter{\insert@material}
\ifnum\theleft@right>0
\smash{\mathclap{\insert@material}}
\else
\mathclap{\insert@material}
\fi
}
\makeatother
\begin{document}
In the formula
\[
f = 5 \bileft( b^2 + \langle x | R
\braceinsert[0.2ex]{\textstyle\int d^3 p |p\rangle \langle p|}
y \rangle \biright)^2,
\]
the depth of the stuff under the brace is added only \emph{after}
\verb|\biright)^2|.
\end{document}
(也许这是韦伊太复杂?)
答案2
好吧,在人们好奇解决tikz
方案发生了什么之前,这里有一个替代方法,使用,嗯...... tikz
。 \tikzmark
用于命名您想要引用的方程式中的位置。然后将此名称\Insert
与各种选项一起提供给控制括号和连接它们的线的行为。
传递给的参数\Insert
为:
#1
. 应用于括号的垂直移位
#2
. 控制连接线行为的选项。
#3
. 方程式中的标记的名称。
#4
. 需要支撑的文本,即将插入。
笔记:
- 这确实需要两次运行。第一次确定位置,第二次进行绘图。
- 如果插入的文本不在第一行,则可能会出现问题,因为箭头可能会与其他文本重叠。
参考:
- 该支架改编自在正文旁边添加一个大括号
代码:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{decorations.pathreplacing}
\newcommand{\tikzmark}[1]{\tikz[overlay,remember picture] \node (#1) {};}
\newcommand*{\BraceAmplitude}{0.5em}%
\newcommand*{\Insert}[5][0.0ex]{%
\tikzmark{a}#5\tikzmark{b}%
\begin{tikzpicture}[overlay,remember picture]
\draw [decoration={brace,amplitude=\BraceAmplitude},decorate,ultra thick,blue,#2]
($(a.north)+(0,#1)$) -- ($(b.north)+(0,#1)$);
\draw [thick, blue, #3] ($(a.north)!0.5!(b.north)+(0,#1)+(0,\BraceAmplitude+2pt)$) to (#4);
\end{tikzpicture}%
}
\begin{document}
\[ f = < x | R \tikzmark{MyMarker} y > \]
\bigskip
In the above equation, we need to insert \Insert[1.5ex]{orange}{out=90, in=-90,->,shorten >=-1pt}{MyMarker}{$\int d^3 p |p> <p| = 1$} before $y$.
\[ f = < x | R \tikzmark{MyMarkerA} y \tikzmark{MyMarkerB}> \]
\bigskip
Insert \Insert[1.5ex]{blue}{out=90, in=-90,->,shorten >=-1pt,red}{MyMarkerA}{$\int d^3 p |p> <p| = 1$} before $y$, and some more
\Insert[1.0ex]{brown}{out=135, in=-70,->,shorten >=-2pt}{MyMarkerB}{\textbf{stuff}} after $y$.
\end{document}
答案3
这是一个可能的解决方案(在 LaTeX2e 中),使用\overbrace
and \mathclap
(来自mathtools
包);使用 调整垂直位置\raisebox
:
\documentclass{article}
\usepackage{mathtools}
\begin{document}
\[
f = < x | R\mathclap{\raisebox{-4ex}{$\overbrace{\textstyle\int d^3 p |p> <p|}$}} y >
\]
\end{document}
我还建议您使用\langle
,\rangle
而不是关系符号<
,>
a:
\documentclass{report}
\usepackage{mathtools}
\begin{document}
\[
f = \langle x | R\mathclap{\raisebox{-4ex}{$\overbrace{\textstyle\int d^3 p |p\rangle \langle p|}$}} y \rangle
\]
\end{document}