答案1
您可以使用tikzmark
来自 TikZ 的库(编译两次以便线条到达其最终位置):
代码:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{tikzmark}
\newcommand\JoinUp[4][10pt]{
\draw
([shift={#2}]pic cs:start#4) -- ++(0pt,#1) -| ([shift={(#3)}]pic cs:end#4);
}
\newcommand\JoinDown[4][10pt]{
\draw
([shift={#2}]pic cs:start#4) -- ++(0pt,-#1) -| ([shift={(#3)}]pic cs:end#4);
}
\begin{document}
\[
(a+b)(a+b)-(a+b)(a-b)=
\tikzmark{starta}aa+\tikzmark{startc}ab+\tikzmark{endc}ba+
\tikzmark{startd}bb-(\tikzmark{enda}aa-\tikzmark{startb}ab+
\tikzmark{endb}ba-\tikzmark{endd}bb)=2ab+2bb.
\]
\begin{tikzpicture}[remember picture,overlay,line width=1.5pt]
\JoinUp{(6pt,10pt)}{(6pt,10pt)}{a}
\JoinUp{(5pt,10pt)}{(5pt,10pt)}{b}
\JoinDown{(5pt,-2pt)}{(5pt,-2pt)}{c}
\JoinDown{(5pt,-2pt)}{(5pt,-2pt)}{d}
\end{tikzpicture}
\end{document}
答案2
一个小补充贡萨洛的回答。
为了减少打字量,并使整个内容与文档的字体大小相匹配,我认为最好将答案合并到获取当前字体大小作为长度并使每个尺寸相应缩放:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{tikzmark}
\newlength{\mytextsize}
\makeatletter
\setlength{\mytextsize}{\f@size pt}
\makeatother
\newcommand{\JoinUp}[5]{\begin{tikzpicture}[remember picture,overlay,line width=0.05\mytextsize]
\draw([shift={(#1\mytextsize,#2\mytextsize)}]pic cs:start#5) -- ++(0pt,0.7\mytextsize) -| ([shift={(#3\mytextsize,#4\mytextsize)}]pic cs:end#5);
\end{tikzpicture}}
\newcommand{\JoinDown}[5]{\begin{tikzpicture}[remember picture,overlay,line width=0.05\mytextsize]
\draw([shift={(#1\mytextsize,#2\mytextsize)}]pic cs:start#5) -- ++(0pt,-0.7\mytextsize) -| ([shift={(#3\mytextsize,#4\mytextsize)}]pic cs:end#5);
\end{tikzpicture}}
\begin{document}
\[(a+b)(a+b)-(a+b)(a-b)=\tikzmark{starta}aa+\tikzmark{startc}ab+\tikzmark{endc}ba+\tikzmark{startd}bb-(\tikzmark{enda}aa-\tikzmark{startb}ab+\tikzmark{endb}ba-\tikzmark{endd}bb)=2ab+2bb.\]
\JoinUp{0.5}{1}{0.5}{1}{a}
\JoinUp{0.5}{1}{0.5}{1}{b}
\JoinDown{0.5}{-0.4}{0.5}{-0.4}{c}
\JoinDown{0.5}{-0.4}{0.5}{-0.4}{d}
\end{document}
这稍微改变了\JoinUp
和\JoinDown
命令,因为位移现在是根据字体大小给出的。
笔记:\mytextsize
由于长度是在前言中定义的,因此这不会随着本地字体大小而缩放。