解决方案 0

解决方案 0

基于 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 示例输出

为什么 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 非常相似,它们仅在如何捕捉数学内容方面有所不同:

  1. 使用以 分隔的可选最后一个参数{ }

    如果有最后一个参数(#5在代码中),则用于确定其高度和深度。这些将添加到矩形中。

  2. 使用结尾\tikzmarkend来查找数学内容。始终遵循相同的程序(高度、深度……)。如果嵌套hf-tikzs,这将严重中断。

这让我想到了“无用”的优点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}

结果:

在此处输入图片描述

相关内容