在基于 TikZ 的 \boxed 构造导致 pdflatex 挂起建议使用 hf-tikz,而不是手动使用 tikz。文档指出,此包不适用于 \frac{} 等高公式。果然,它不行,如下所示:
\documentclass{article}
\usepackage{hf-tikz}
\begin{document}
\[\tikzmarkin{a}x + y = 400\tikzmarkend{a}\]
\[
\tikzmarkin{z2}
\int_{
E - \frac{\Delta}{2} \le H \le E + \frac{\Delta}{2} \le H
}
d^{3N} x d^{3N} p
=
\left( \frac{2 \pi \Delta}{\omega} \right)^{3N}
\tikzmarkend{z2}
\]
\end{document}
这看起来像
为什么 hf-tikz 建议手动偏移,而简单用户\boxed
就能确定要使用的尺寸?如何实现盒子尺寸的自动化?
答案1
在轮到Claudio Fiandrino(的作者hf-tikz
)之前,让我提出四个解决方案。
解决方案 0
当然,有一个解决方案可以解决此问题:只需使用一个绘制和填充的节点:
\NewDocumentCommand{\tikzmarksolo}{O{} O{} m}{% needs hf-tikz (uses same style, no beamer)
\tikz[remember picture]
\node[line width=1pt,rectangle,fill=\fcol,#1,draw=\bcol, anchor=base]
(pic cs:#2) {$\displaystyle #3$};% #2 shouldn’t be optional,
% either drop (pic cs:#2) if #2 is empty
% or make it mandatory
}
解决方案 1 和 2
解决方案 1 和 2 非常相似,它们仅在如何捕捉数学内容方面有所不同:
使用以 分隔的可选最后一个参数
{ }
。如果有最后一个参数(
#5
在代码中),则用于确定其高度和深度。这些将添加到矩形中。使用结尾
\tikzmarkend
来查找数学内容。始终遵循相同的程序(高度、深度……)。如果嵌套hf-tikz
s,这将严重中断。
这让我想到了“无用”的优点hf-tikz
:它可以跨环境&
的对齐和换行符工作amsmath
,甚至可以嵌套。
解决方案 3
折衷方案:解决方案的工作方式与原始解决方案类似,但不必指定高度和深度的数量,而是根据作为可选参数给出的数学内容来确定高度和深度。
代码/输出
代码 1(可选{ }
参数)
\documentclass{article}
\usepackage{hf-tikz}
\newsavebox\qrrTikzmarkBox
\RenewDocumentCommand{\tikzmarkin}{O{} m D(){0.1,-0.18} D(){-0.1,0.35} G{}}{%
\if\relax\detokenize{#5}\relax
\dp\qrrTikzmarkBox=0pt\relax
\ht\qrrTikzmarkBox=0pt\relax
\else
\sbox\qrrTikzmarkBox{$\displaystyle#5$}
\fi
\tikz[remember picture,overlay]
\draw[line width=1pt,rectangle,fill=\fcol,#1,draw=\bcol]
(pic cs:#2) ++([yshift=-\the\dp\qrrTikzmarkBox]#3) rectangle ([yshift=\the\ht\qrrTikzmarkBox]#4) node [anchor=text] (#2) {}
;
#5
}
\begin{document}
\[\tikzmarkin{a}x + y = 400\tikzmarkend{a}\]
\[
\tikzmarkin{z2}{
\int_{
E - \frac{\Delta}{2} \le H \le E + \frac{\Delta}{2} \le H
}
d^{3N} x d^{3N} p
=
\left( \frac{2 \pi \Delta}{\omega} \right)^{3N}}
\tikzmarkend{z2}
\]
\end{document}
输出 1
代码 2(捕获任何内容,直到\tikzmarkend
)
\documentclass{article}
\usepackage{hf-tikz}
\newsavebox\qrrTikzmarkBox
\RenewDocumentCommand{\tikzmarkin}{O{} m D(){0.1,-0.15} D(){-0.1,0.18} u{\tikzmarkend}}{%
\ifx\\#5\\
\dp\qrrTikzmarkBox=0pt\relax
\ht\qrrTikzmarkBox=0pt\relax
\else
\sbox\qrrTikzmarkBox{$\displaystyle#5$}
\fi
\tikz[remember picture,overlay]
\draw[line width=1pt,rectangle,fill=\fcol,#1,draw=\bcol]
(pic cs:#2) ++([yshift=-\the\dp\qrrTikzmarkBox]#3) rectangle ([yshift=\the\ht\qrrTikzmarkBox]#4) node [anchor=text] (#2) {}
;
#5
\tikzmarkend
}
\begin{document}
\[\tikzmarkin{a}x + y = 400\tikzmarkend{a}\]
\[
\tikzmarkin{z2}
\int_{
E - \frac{\Delta}{2} \le H \le E + \frac{\Delta}{2} \le H
}
d^{3N} x d^{3N} p
=
\left( \frac{2 \pi \Delta}{\omega} \right)^{3N}
\tikzmarkend{z2}
\]
\end{document}
输出 2
代码 3(具有数学内容的可选参数)
\documentclass{article}
\usepackage{hf-tikz}
\newsavebox\qrrTikzmarkBoxA
\newsavebox\qrrTikzmarkBoxB
\RenewDocumentCommand{\tikzmarkin}{O{} m O{} O{0}}{%
\if\relax\detokenize{#3}\relax
\dp\qrrTikzmarkBoxA=0pt\relax
\else
\sbox\qrrTikzmarkBoxA{$\displaystyle#3$}
\fi
\if\relax\detokenize{#4}\relax
\ht\qrrTikzmarkBoxB=0pt\relax
\else
\sbox\qrrTikzmarkBoxB{$\displaystyle#4$}
\fi
\tikz[remember picture,overlay]
\draw[line width=1pt,rectangle,fill=\fcol,#1,draw=\bcol]
(pic cs:#2) ++([yshift=-\the\dp\qrrTikzmarkBoxA] 0.1,-0.18) rectangle ([yshift=\the\ht\qrrTikzmarkBoxB] -0.1,0.15) node [anchor=text] (#2) {}
;
}
\begin{document}
\[\tikzmarkin{a}x + y = 400\tikzmarkend{a}\]
\[
\tikzmarkin{z2}[\int_{\frac{\Delta}{2}}][\left( \frac{2 \pi \Delta}{\omega} \right)^{3N}]
\int_{
E - \frac{\Delta}{2} \le H \le E + \frac{\Delta}{2} \le H
}
d^{3N} x d^{3N} p
=
\left( \frac{2 \pi \Delta}{\omega} \right)^{3N}
\tikzmarkend{z2}
\]
\end{document}
输出 3
答案2
该软件包的 0.3 版本修复了以下问题偏移量每次需要突出显示方程式时,插入一个。事实上,其中一个新颖之处是引入了一个可以自定义它们的密钥界面,当然,这与以前的机制兼容。
目前手册中没有提到的是,可以引入有助于在整个文档中应用偏移和颜色定制的样式(手册中没有解释,只是因为我今天想到了这一点 :)
)。
指定的键偏移量是above/below/left/right/ offset
和,above left/below right offset
它们设置了前面两个的组合。它们应该\tikzmarkin
在普通文档中作为第一个参数引入,在演示文稿中作为第二个参数引入(由于存在覆盖规范)。
当。。。的时候偏移量通过按键和坐标提供,即
\tikzmarkin[above left offset={...},below right offset={...}]{marker-id}(..,..)(..,..)
基于坐标的定义覆盖了基于键的定义。
一个例子:
\documentclass[a4paper,12pt]{article}
\usepackage{amsmath}
\usepackage[customcolors]{hf-tikz}
\tikzset{offset def/.style={
above left offset={-0.1,0.8},
below right offset={0.1,-0.65},
},
integral first/.style={
offset def,
},
integral second/.style={
offset def,
set fill color=green!50!lime!60,
set border color=green!40!black,
},
sums/.style={
offset def,
set fill color=blue!20!cyan!60,
set border color=blue!60!cyan,
}
}
\begin{document}
\[\tikzmarkin{x-a}x + y = 400\tikzmarkend{x-a}\]
\vspace*{3ex}
\[
\tikzmarkin[integral first]{z2}
\int_{
E - \frac{\Delta}{2} \le H \le E + \frac{\Delta}{2} \le H
}
d^{3N} x d^{3N} p
=
\left( \frac{2 \pi \Delta}{\omega} \right)^{3N}
\tikzmarkend{z2}
\]
\vspace*{3ex}
\[
\tikzmarkin[integral second]{z3}
\int_{
E - \frac{\Delta}{2} \le H \le E + \frac{\Delta}{2} \le H
}
d^{3N} x d^{3N} p
\tikzmarkend{z3}
=
\tikzmarkin[integral first,disable rounded corners=true]{z4}
\left( \frac{2 \pi \Delta}{\omega} \right)^{3N}
\tikzmarkend{z4}
\]
\vspace*{3ex}
\begin{equation}
\begin{split}
H_c&=\tikzmarkin[disable rounded corners=true,sums]{xb}\frac{1}{2n} \sum^n_{l=0}(-1)^{l}(n-{l})^{p-2}
\sum_{l _1+\dots+ l _p=l}\prod^p_{i=1} \binom{n_i}{l _i}\tikzmarkend{xb}\\
&\quad\cdot[(n-l )-(n_i-l _i)]^{n_i-l _i}\cdot
\tikzmarkin[sums]{xb1}(0.05,-0.6)(-0.05,0.75)
\Bigl[(n-l )^2-\sum^p_{j=1}(n_i-l _i)^2\Bigr].
\tikzmarkend{xb1}
\end{split}
\end{equation}
\vspace*{3ex}
\[
\tikzmarkin[below offset=-0.4,
above offset=0.55,
set fill color=magenta!60!purple!30]{bla bla}
x + \dfrac{y}{z} = 400
\tikzmarkend{bla bla}
\]
\end{document}
结果: