我在 TikZ 节点内有一个图像。图像周围应该有一个边框,没有间隙。边框应该具有指定的线宽。
我的问题是边框似乎画在了图像下方。我用它inner sep=0
来消除图像和边框之间的间隙。效果是边框的线宽只有预期线宽的一半,如第一个示例所示:
\documentclass[tikz,margin=10pt]{standalone}
\begin{document}
% Red border to distinguish from example image, which also has a border
\begin{tikzpicture}
\node[draw=red, inner sep=0mm, line width=10mm] {\includegraphics{example-image-a}};
\end{tikzpicture}
% Shows that part of the border was hiding behind the image
\begin{tikzpicture}
\node[draw=red, inner sep=10mm, line width=10mm] {\includegraphics{example-image-a}};
\end{tikzpicture}
\end{document}
我能想到两种解决方法:
- 设置
inner sep
为边框宽度的一半。这样边框就应该具有所需的空间。 - 保留
inner sep=0
并将线宽设置为预期值的两倍。接受边框减半的事实,因此事先将其加倍。
有没有更优雅的解决方案?我们可以告诉 TikZ 在图像之后绘制节点边框吗?我可以接受边框覆盖图像的一小部分。
问题因重复而被关闭后的更新:
链接的问题有很大的重叠,对我的具体情况很有帮助。很好!但是,是否可以在节点内容上方绘制边框的问题没有得到另一个问题的回答,因此仍未解决。这个问题的答案可能会对那些出于其他原因希望最后绘制节点边框的人有用。链接的问题可能对他们没用。
答案1
左边的图像是inner sep=0.5\pgfplinewidth
,右边的图像是inner sep=0pt
。最近添加了semitransparent
一个选项,可以更好地看到,该图像被节点边框线的内半部分覆盖。
\documentclass[margin=5mm]{standalone}
\usepackage{duckuments}
\usepackage{tikz}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}
\node (n1) [draw=red, line width=10mm, semitransparent,
inner sep=0.5\pgflinewidth] % <---
{\includegraphics{example-image-duck}};
\node (n2) [draw=red, line width=10mm, semitransparent,
inner sep=0, % <---
right=of n1]
{\includegraphics{example-image-duck}};
\end{tikzpicture}
\end{document}
答案2
我会使用tcolorbox
:线条重叠的问题应该已经考虑到了。
如果图片中需要任何 TikZ 材料,那么使用 tcolorbox 也可以实现。
%\documentclass[tikz,margin=10pt]{standalone}
\documentclass[a4paper]{article}
\usepackage[showframe]{geometry}
\usepackage[most]{tcolorbox}
\begin{document}
\tcbset{sharp corners,
NoGaps/.style={boxsep=0mm, left=0pt, right=0pt, top=0pt, bottom=0pt, before skip=0pt, after skip=0pt,},
}
\begin{tcolorbox}[NoGaps,
colframe=red, boxrule=10mm,
hbox, % box as wide as the content
]
\includegraphics{example-image-a}
\end{tcolorbox}
\end{document}