如何使用 TikZ 突出显示方程的一部分,但不在突出显示的部分周围留出多余的空间?

如何使用 TikZ 突出显示方程的一部分,但不在突出显示的部分周围留出多余的空间?

我可以用来TikZ突出显示数学表达式中的一个或多个项/因子/指数/等。但是,当我连续突出显示两个实体时,会引入额外的空间,我想消除这些空间,即使这意味着突出显示会与周围的实体略有重叠。

以下 MWE 可以说明这一点。

% !TEX TS-program = lualatexmk
\documentclass[10pt]{article}
\usepackage{amsmath}
\usepackage{tikz}
\usetikzlibrary{shapes}

\NewDocumentCommand{\hilite}{ O{brown!60} m O{rectangle} }{%
  % See https://texample.net/tikz/examples/beamer-arrows/
  \tikz[baseline]{\node[fill=#1,#3,anchor=base]{\ensuremath{#2}};}% previous working version
}%

\begin{document}
\begin{align*}
  (\Delta s)^2 &= -(\Delta t)^2 + (\Delta x)^2 + (\Delta y)^2 + (\Delta z)^2 \\
  (\Delta s)^2 &= \hilite{-(\Delta t)^2 + (\Delta x)^2}[rounded rectangle] + (\Delta y)^2 + (\Delta z)^2 \\
  (\Delta s)^2 &= \hilite{-(\Delta t)^2 + (\Delta x)^2}[rectangle] + (\Delta y)^2 + (\Delta z)^2 \\
  (\Delta s)^2 &= \hilite{-(\Delta t)^2 + (\Delta x)^2}[ellipse] + (\Delta y)^2 + (\Delta z)^2 
\end{align*}
\begin{align*}
  \hilite[orange]{\Delta\mathbf{p}}[circle] &= \mathbf{F}_{\textnormal{net}}\,\Delta t \\
  \Delta\mathbf{p} &= \hilite[yellow!50]{\mathbf{F}_{\textnormal{net}}}[rounded rectangle]\,\Delta t \\
  \Delta\mathbf{p} &= \mathbf{F}_{\textnormal{net}}\,\hilite[olive!50]{\Delta t}[rectangle] \\
  \Delta\mathbf{p} &= \hilite[cyan!50]{\mathbf{F}_{\textnormal{net}}\,\Delta t}[ellipse] 
\end{align*}
\end{document}

这是结果。请注意引入的额外空格。我想消除它。

带有额外空格的示例

如果我将hilite命令改为

\NewDocumentCommand{\hilite}{ O{brown!60} m O{rectangle} }{%
  % See https://tex.stackexchange.com/a/406084/218142
  % See also https://tex.stackexchange.com/a/570789/218142
  % See also https://tex.stackexchange.com/a/79659/218142
  % See also https://tex.stackexchange.com/q/375032/218142
  \tikz[overlay,baseline=(n1.base)]{\node[fill=#1,draw,#3] (n1){\ensuremath{#2}};}%
}%

结果如下,

在此处输入图片描述

这会占用较少的空间,但显然不起作用。我试图理解这个overlay选项,我理解为什么它会导致这里的视图折叠。我认为解决方案可能在于使用,\tikzmark但我似乎无法理解这个概念。理想情况下,我希望能够在数学模式下突出显示任何数量、符号、运算符等。我能想到的唯一表达我认为突出显示应该是什么样子的方法是,它应该看起来像一个“聚光灯”,以我传递给命令的任何内容为中心,并且重叠到其他实体上是可以的。还可以指定“聚光灯”的形状和颜色。

答案1

从字面上回答这个问题并不太难。我转而使用,tikzmark因为这个库就是为这类事情而制作的。只需使用该选项在下方添加具有所需形状的节点即可behind path

\documentclass[10pt]{article}
\usepackage{amsmath}
\usepackage{tikz}
\usetikzlibrary{fit,shapes,tikzmark}

\NewDocumentCommand{\hilite}{ O{brown!60} m O{rectangle} }{%
  % See https://texample.net/tikz/examples/beamer-arrows/
  \tikzmarknode[alias=n,append after command={%
  node[behind path,fill=#1,#3,overlay,fit=(n)]{}%
  }]{n}{#2}%
}%

\begin{document}
\begin{align*}
  (\Delta s)^2 &= -(\Delta t)^2 + (\Delta x)^2 + (\Delta y)^2 + (\Delta z)^2 \\
  (\Delta s)^2 &= \hilite{-(\Delta t)^2 + (\Delta x)^2}[rounded rectangle] + (\Delta y)^2 + (\Delta z)^2 \\
  (\Delta s)^2 &= \hilite{-(\Delta t)^2 + (\Delta x)^2}[rectangle] + (\Delta y)^2 + (\Delta z)^2 \\
  (\Delta s)^2 &= \hilite{-(\Delta t)^2 + (\Delta x)^2}[ellipse] + (\Delta y)^2 + (\Delta z)^2 
\end{align*}
\begin{align*}
  \hilite[orange]{\Delta\mathbf{p}}[circle] &= \mathbf{F}_{\textnormal{net}}\,\Delta t \\
  \Delta\mathbf{p} &= \hilite[yellow!50]{\mathbf{F}_{\textnormal{net}}}[rounded rectangle]\,\Delta t \\
  \Delta\mathbf{p} &= \mathbf{F}_{\textnormal{net}}\,\hilite[olive!50]{\Delta t}[rectangle] \\
  \Delta\mathbf{p} &= \hilite[cyan!50]{\mathbf{F}_{\textnormal{net}}\,\Delta t}[ellipse] 
\end{align*}
\end{document}

在此处输入图片描述

几乎可以肯定这不是您想要的。它确实满足了要求,但由于彩色区域与方程式的早期元素重叠,它们会擦除它们。这可以通过一些atbegshi技巧来解决。但是,我想知道这是否是您真正想要的。毕竟,满足您的要求似乎意味着您要突出显示要突出显示的节点之外的内容。

另外,我还想提请大家注意\tcbhighmath注意tcolorbox

附录:这是带有发货诡计的版本。

\documentclass[10pt]{article}
\usepackage{amsmath}
\usepackage{tikz}
\usepackage{eso-pic}
\usetikzlibrary{fit,shapes,tikzmark}
\newcounter{tikzhighlightnode}
\NewDocumentCommand{\hilite}{ O{brown!60} m O{rectangle} }{%
  % See https://texample.net/tikz/examples/beamer-arrows/
  \stepcounter{tikzhighlightnode}%
  \tikzmarknode{highlighted-node-\number\value{tikzhighlightnode}}{#2}%
  \edef\temp{\noexpand\AddToShipoutPictureBG*{\noexpand\begin{tikzpicture}[overlay,remember picture]
  \noexpand\node[fill=#1,#3,fit=(highlighted-node-\number\value{tikzhighlightnode})]{};%
  \noexpand\end{tikzpicture}}}%
  \temp%
}%

\begin{document}
\begin{align*}
  (\Delta s)^2 &= -(\Delta t)^2 + (\Delta x)^2 + (\Delta y)^2 + (\Delta z)^2 \\
  (\Delta s)^2 &= \hilite{-(\Delta t)^2 + (\Delta x)^2}[rounded rectangle] + (\Delta y)^2 + (\Delta z)^2 \\
  (\Delta s)^2 &= \hilite{-(\Delta t)^2 + (\Delta x)^2}[rectangle] + (\Delta y)^2 + (\Delta z)^2 \\
  (\Delta s)^2 &= \hilite{-(\Delta t)^2 + (\Delta x)^2}[ellipse] + (\Delta y)^2 + (\Delta z)^2 
\end{align*}
\begin{align*}
  \hilite[orange]{\Delta\mathbf{p}}[circle] &= \mathbf{F}_{\textnormal{net}}\,\Delta t \\
  \Delta\mathbf{p} &= \hilite[yellow!50]{\mathbf{F}_{\textnormal{net}}}[rounded rectangle]\,\Delta t \\
  \Delta\mathbf{p} &= \mathbf{F}_{\textnormal{net}}\,\hilite[olive!50]{\Delta t}[rectangle] \\
  \Delta\mathbf{p} &= \hilite[cyan!50]{\mathbf{F}_{\textnormal{net}}\,\Delta t}[ellipse] 
\end{align*}
\end{document}

在此处输入图片描述

PS 我不喜欢使用可选参数\NewDocumentCommand,至少如果我有pgf随意使用的情况下不喜欢。您可以只使用一个参数,然后使用任意数量的键来输入该参数。

相关内容