答案1
当 PGF(TikZ 是其前端)构建图片时,它会跟踪该图片边界框。TeX 随后会使用此值来确定图形的大小。通常,PGF 只是跟踪所使用的坐标并调整边界框以包含它们。有时,这并不完全正确(贝塞尔曲线往往会得到过大的边界框),但总的来说,这是正确的,而且更准确需要付出更多的努力。然而,所做的一项调整是取行宽考虑到这一点,因为尽管坐标可能是路径的终点,但实际路径会在某些方向上略微超出该坐标。同样,PGF 采用了简单的方法,只需添加当前线宽的一半即可确保边界框足够大。
因此,如果您绘制一条线宽1cm
为(0,0)
到 的路径(5,0)
,则实际边界框的左下角将为(-.5,-.5)
,右上角将为(5.5, .5)
。
现在,即使线条实际上不需要,水平和垂直方向上也会添加额外的半线宽。这就是我所说的 PGF 采用简单方法的意思。
在您的代码中,您的线条是宽度的,.2cm
因此.1cm
在明显的边界框的所有方向上都添加了一个额外内容,包括左侧和右侧。因此您的图形实际上是\textwidth + .2cm
宽度的,因此溢出。
幸运的是,每当 PGF 采取简单选项时,它通常都会提供纠正方法。在这种情况下,您可以向 tikzpicture 发出键trim left
和。它们将 x 坐标作为参数(或点,TikZ 只读取该点的 x 坐标),因此或(括号是因为坐标中的逗号)表示“修剪边界框的左侧,使其左侧边缘具有 x 坐标。”(请注意,“修剪”可以trim right
trim left=0
trim left={(0,0)}
0
添加如果给定的坐标位于实际图片的左侧,则空格)。
因此,就您而言,您需要添加trim left=0, trim right=\textwidth
。
这里有一些代码来说明这一点。我在每张图片的末尾添加了一个矩形,以显示当前有效的边界框,该边界框显示了红线以外的多余区域。在第二个图中,我使用键trim
来调整边界框。请注意,这只会影响传递给 TeX 的边界框 - tikzpicture 本身认为边界框没有变化(如果您想从 TikZ 的角度更改它,请use as bounding box
在手册中查找键)。
\documentclass{article}
%\url{https://tex.stackexchange.com/q/654551/86}
\usepackage[T1]{fontenc}
\usepackage{tikz}
\usepackage{lipsum}
\begin{document}
\lipsum[2]
\noindent
\begin{tikzpicture}
\draw[red, line width=.2cm] (0,0)--(\textwidth, 0) ;
\draw[overlay] (current bounding box.south east) rectangle (current bounding box.north west);
\end{tikzpicture}
\noindent
\begin{tikzpicture}[trim left=0,trim right=\textwidth]
\draw[red, line width=.2cm] (0,0)--(\textwidth, 0) ;
\draw[overlay] (current bounding box.south east) rectangle (current bounding box.north west);
\end{tikzpicture}
\end{document}
感谢 Qrrbrbirlbel 在评论中指出可以在修剪键的参数中仅使用 x 坐标。
答案2
对于段落后的简单行,我宁愿使用\rule
如下颜色:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{xcolor}
%--------------- show page layout. don't use in a real document!
\usepackage{showframe}
\renewcommand\ShowFrameLinethickness{0.15pt}
\renewcommand*\ShowFrameColor{\color{red}}
%
\usepackage{lipsum} % for dummy text
%---------------------------------------------------------------%
\begin{document}
\lipsum[66]
\textcolor{red}{\rule{\textwidth}{2mm}}
\end{document}
(红线表示文本区域边框)