我可以用来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
随意使用的情况下不喜欢。您可以只使用一个参数,然后使用任意数量的键来输入该参数。