这LaTeX 覆盖生成器是一款出色的工具,可以以 LaTeX 标题方式注释图像的子图像。它自称为“Visual Overlay Generator v0.0.1”,因为它可以创建可视化叠加层:叠加在原始图像上的图表。
相同的 LaTeX 覆盖生成器是用户 f2cx 的回答致 OP我应该如何添加带注释的图像?。
然而,我正在寻找一种不同的方法来注释图像的子图像。那就是:
- 它们不必是 Tex-sense 中的“标题”:它们可以是纯文本。
- 应将“可视化叠加生成器”中的可视化叠加层添加到原始图像的右侧(参见左右为了更好地理解,下面示例图中的布局...或者它们可以是上下有时,当处理“宽”图像时)。
- 标题文字应添加在视觉覆盖层内,而不是原始图像下方。
我们以下图(包含子图)为例(不同的子图用不同的颜色表示,仅作为示例):
然后,下面就是我想要的结果(原始图像在左侧以及注释图在右侧,其中可以通过 Tex 在注释图中的每个框的中心添加标题):
虽然我个人认为它无助于提高标题图的清晰度,但以下可以作为它的一个可选变体,其中右边还以原始图像作为背景(不透明度为±20%):
我不知道在 Tex 中如何优雅地实现这一点。也许可以借助 GUI(例如矢量图像创建器,例如 GIMP、Inkscape、Adobe Illustrator 等)来实现(加快)?然后可以在这样的软件中轻松跟踪“覆盖”注释图,然后可以将该图导出为 SVG。不幸的是,我不知道如何使用 Tex 注释(写实际注释)不同的“对象”(读作:代表图中子图像的矩形),例如在每个“对象”(读作:矩形)的中心。
有什么建议(坚持使用 Tex 来实现结果,或者如果不行:避免使用它)或可行的解决方案吗?我需要这个过程来创建许多(超过 100 个)图像。
答案1
因此,从LaTeX 覆盖生成器可以按以下方式使用并进行最低限度的改变:
\node at (#4)
应替换为\node at ($ (#1)!.5!(#2) $)
,这会将标签放置在矩形的中间(而不是采用可选的第 4 个参数);为了使上一步工作,需要包括
\usetikzlibrary{calc}
以下内容\usepackage{tikz}
;{white}{white}{black}{black}
可以改为{white}{none}{none}{black}
删除带黑色边框的白色圆圈;[anchor=south west,inner sep=0] (image)
可以更改为[anchor=south west,inner sep=0,opacity=0.2] (image)
使背景图像具有 20% 的不透明度;假设您有一个使用默认“代码”生成的覆盖矩形
{A}
,则可以将其更改为{the caption you'd like to give to the sub-image}
。
假设我们要使用以下代码,通过以下方式生成LaTeX 覆盖生成器(我刚刚删除了注释行以及\caption{...}
& \label{fig:teaser}
):
\documentclass{article}
\usepackage{graphicx}
\usepackage{tikz}
\newcommand*\annotatedFigureBoxCustom[8]{\draw[#5,thick,rounded corners] (#1) rectangle (#2);\node at (#4) [fill=#6,thick,shape=circle,draw=#7,inner sep=2pt,font=\sffamily,text=#8] {\textbf{#3}};}
\newcommand*\annotatedFigureBox[4]{\annotatedFigureBoxCustom{#1}{#2}{#3}{#4}{white}{white}{black}{black}}
\newcommand*\annotatedFigureText[4]{\node[draw=none, anchor=south west, text=#2, inner sep=0, text width=#3\linewidth,font=\sffamily] at (#1){#4};}
\newenvironment {annotatedFigure}[1]{\centering\begin{tikzpicture}
\node[anchor=south west,inner sep=0] (image) at (0,0) { #1};\begin{scope}[x={(image.south east)},y={(image.north west)}]}{\end{scope}\end{tikzpicture}}
\begin{document}
\begin{figure}[h!t]
\begin{annotatedFigure}
{\includegraphics[width=1.0\linewidth]{qUq7A.jpg}}
\annotatedFigureBox{0.1113,0.5114}{0.625,0.7951}{A}{0.1113,0.5114}
\end{annotatedFigure}
\end{figure}
\end{document}
[width=1.0\linewidth]
然后,我们对其进行调整(按照上面描述的步骤),以实现(我通过更改为使图像变小[width=0.5\linewidth]
):
\documentclass{article}
\usepackage{graphicx}
\usepackage{tikz}
\usetikzlibrary{calc}
\newcommand*\annotatedFigureBoxCustom[8]{\draw[#5,thick,rounded corners] (#1) rectangle (#2);\node at ($ (#1)!.5!(#2) $)[fill=#6,thick,shape=circle,draw=#7,inner sep=2pt,font=\sffamily,text=#8] {\textbf{#3}};}
\newcommand*\annotatedFigureBox[4]{\annotatedFigureBoxCustom{#1}{#2}{#3}{#4}{white}{none}{none}{black}}
\newcommand*\annotatedFigureText[4]{\node[draw=none, anchor=south west, text=#2, inner sep=0, text width=#3\linewidth,font=\sffamily] at (#1){#4};}
\newenvironment {annotatedFigure}[1]{\centering\begin{tikzpicture}
\node[anchor=south west,inner sep=0,opacity=0.2] (image) at (0,0) { #1};\begin{scope}[x={(image.south east)},y={(image.north west)}]}{\end{scope}\end{tikzpicture}}
\begin{document}
\begin{figure}[h!t]
\begin{annotatedFigure}
{\includegraphics[width=1.0\linewidth]{qUq7A.jpg}}
\annotatedFigureBox{0.1113,0.5114}{0.625,0.7951}{the caption you'd like to give to the sub-image}{0.1113,0.5114}
\end{annotatedFigure}
\end{figure}
\end{document}
这样会产生类似的东西(如果不想要背景图像,可以更改opacity=0.2
为opacity=0
,并且根据下面的发现,您可能需要将圆角矩形的颜色从 更改{white}
为 例如{red}
):
完成后,可以将所有内容放在一个小页面中,以便有 2 个并排的图形,使用(取自用户 Matthew Leingang 的回答在 OP 中两个并排的身影):
\begin{figure}
\begin{minipage}{0.5\textwidth}
% here should come all the code for the original image (left side)
\end{minipage}
\begin{minipage}{0.5\textwidth}
% here should come all the code for the "overlay-image" (right side)
\end{minipage}
\end{figure}
[width=0.5\linewidth]
按照上面的工作流程这样做,可以得到(我从这里回到了[width=1\linewidth]
):
\documentclass{article}
\usepackage{graphicx}
\usepackage{tikz}
\usetikzlibrary{calc}
\newcommand*\annotatedFigureBoxCustom[8]{\draw[#5,thick,rounded corners] (#1) rectangle (#2);\node at ($ (#1)!.5!(#2) $)[fill=#6,thick,shape=circle,draw=#7,inner sep=2pt,font=\sffamily,text=#8] {\textbf{#3}};}
\newcommand*\annotatedFigureBox[4]{\annotatedFigureBoxCustom{#1}{#2}{#3}{#4}{white}{none}{none}{black}}
\newcommand*\annotatedFigureText[4]{\node[draw=none, anchor=south west, text=#2, inner sep=0, text width=#3\linewidth,font=\sffamily] at (#1){#4};}
\newenvironment {annotatedFigure}[1]{\centering\begin{tikzpicture}
\node[anchor=south west,inner sep=0,opacity=0.2] (image) at (0,0) { #1};\begin{scope}[x={(image.south east)},y={(image.north west)}]}{\end{scope}\end{tikzpicture}}
\begin{document}
\begin{figure}[h!t]
\begin{minipage}{0.5\textwidth}
\includegraphics[width=1\linewidth]{qUq7A.jpg}
\end{minipage}
\begin{minipage}{0.5\textwidth}
\begin{annotatedFigure}
{\includegraphics[width=1\linewidth]{qUq7A.jpg}}
\annotatedFigureBox{0.1113,0.5114}{0.625,0.7951}{the caption you'd like to give to the sub-image}{0.1113,0.5114}
\end{annotatedFigure}
\end{minipage}
\end{figure}
\end{document}
不幸的是,(由于长度{the caption you'd like to give to the sub-image}
不适合右侧图像)右侧图像被推了一些;正如在输出中看到的那样:
也许可以通过限制的宽度来解决这个问题{the caption you'd like to give to the sub-image}
,这样它就会自动换行(和/或减小其字体大小,例如当在某个较大的字体大小的矩形内不再可能换行时)?
限制字幕最大宽度的一种方法是, text width=30mm
在 eg 之后引入 eg text=#8
,但这会限制所有字幕的宽度。要限制每个字幕的宽度,例如可以将某个字幕放在\begin{minipage}{0.75\textwidth}
...内\end{minipage}
。
如果您想对矩形进行旋转,则需要同时移动文本和矩形。这可以使用xshift
和来完成yshift
。可以调整从 生成的代码LaTeX 覆盖生成器因此,为了满足您的需求:
\newcommand*\annotatedFigureBox[6]{\draw[orange,thick,rounded corners,rotate=#4, xshift=(#5), yshift=(#6)] (#1) rectangle (#2);\node at ($ (#1)!.5!(#2) $)[text=white] {\small{#3}};}
\newenvironment{annotatedFigure}[1]{\centering\begin{tikzpicture}
\node[anchor=south west,opacity=0.3] (image) at (0,0) { #1};\begin{scope}[x={(image.south east)},y={(image.north west)}]}{\end{scope}\end{tikzpicture}}
然后,可以将矩形的坐标作为任何标题框(\annotatedFigureBox
)的前 2 个参数复制到以下前 2 个参数中:
\annotatedFigureBox{x1-copy-from-generator,y1-copy-from-generator}{x2-copy-from-generator,y2-copy-from-generator}{the caption you'd like to give to the sub-image}{0}{0}{0}%bl
最后两个参数分别是xshift
和yshift
,之前的一个参数(第 4 个参数)是矩形的旋转。
xshift
然而,手动使用和的需要yshift
并不那么优雅,而且很难猜测矩形的大小和位置LaTeX 覆盖生成器,如果您之后需要旋转它。因此,最好使用另一个生成器,您可以从中检索点的坐标,以绘制矩形或多边形(连接点)。