我目前正在参与一个使用 LaTeX 动态生成 PDF 文件的项目。我们正在研究一种名为“线宽”的排版属性,并研究 LaTeX 如何处理它。“线宽”如下。
假设我们在点 A 和 B 之间创建一条线。虽然这些点定义了线的起点和终点,但该线将具有一定的厚度。我们的问题是,该线的厚度是如何分布的?线的主体是在 AB 线上方、下方还是横跨 AB 线?这是我们可以控制的属性吗?
答案1
答案2
我同意Ulrike Fischer 的回答但我想补充一点,其实没有选择。它不是由标准 LaTeX 绘图引擎(如 Ti)决定的钾Z、PSTricks 或 l3draw 是线条最终停留的位置。除了像上面或下面的惯例没有多大意义(因为线条可以有角度并与曲线合并)之外,实现这种惯例几乎是不可能的,因为线条不是由 LaTeX 绘制的,而是由某个驱动程序(或“查看器”)绘制的。要了解这意味着什么,请考虑一个不平凡的例子。
\documentclass[tikz,border=3mm]{standalone}
\begin{document}
\begin{tikzpicture}[font=\sffamily,nodes={text width=3cm,align=center}]
\begin{scope}[local bounding box=A]
\draw[double distance=2em] (0,0) circle[x radius=3em,y radius=1.2em];
\draw[dashed] (0,0) circle[x radius=3em,y radius=1.2em];
\end{scope}
\path (A.south) node[below=1em]{Boundaries of a thick line.};
\begin{scope}[xshift=3.5cm,local bounding box=B]
\clip circle[x radius=3em,y radius=1.2em];
\draw[line width=2em] (0,0) circle[x radius=3em,y radius=1.2em];
\end{scope}
\path (B.south) node[below=1em]{Efforts to have line on one side of a path.};
\begin{scope}[xshift=7cm,local bounding box=C]
\clip circle[x radius=3em,y radius=1.2em] (-4.1em,-2.3em) |- (4.1em,2.3em) |-
cycle;
\draw[line width=2em] (0,0) circle[x radius=3em,y radius=1.2em];
\end{scope}
\path (C.south|-B.south) node[below=1em]{Efforts to have line on the other side of a path.};
\end{tikzpicture}
\end{document}
左侧的图例显示了一条粗线的边界(实线)和一条特定的中心(虚线)。钾Z 实际上并不“知道”外边界的坐标。虽然可以针对当前的情况(即椭圆)推导出外边界的坐标,但没有简单的表达式可以涵盖一般情况。相反,这是显卡所做的“艰苦工作”(当您在屏幕上看到这一点时)。由于我们肯定希望直线段和曲线有平滑的组合,因此唯一合理的惯例是遵循驱动程序的惯例。
另外两个图例表明了如何才能得到一条只在路径一侧绘制的线。是的,在特定情况下,你总是可以想出一些办法来实现这一点,但没有一种通用的方法可以实现所有可能的路径。
所以底线是,其实没有选择。对于这些应用程序,无论它们是否与 LaTeX 相关,我们最好与驱动程序提供的功能成为朋友。否则,几乎不可能拥有平滑的路径。因此,只要您不付出太大的努力,您就可以确信所有这些软件包都遵循惯例,即在平滑段的任何一点,线沿法线延伸相同的距离。
我尝试通过下面的动画来说明这一点。
蓝色曲线是绘制的椭圆,灰色线是我们感兴趣的粗线。在每个点都可以看到切线(橙色)和法线。这条线在两个方向上延伸相同的量。曲线的一个微妙之处在于它们可以似乎由于曲率而进一步延伸,也就是说,当我们试图测量宽度时,我们还会看到一些来自早期延伸的部分。我不确定口头描述是否最佳,但我想描述一下人们在左侧和右侧延伸处看到的东西。
PS 这是动画的代码。
\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{decorations.markings}
\begin{document}
\foreach \X in {0,0.025,...,0.975}
{\begin{tikzpicture}[font=\sffamily,nodes={text
width=3cm,align=center},>=stealth,scale=2]
\path[use as bounding box] (-4.7em,-3em) rectangle (4.7em,3em);
\draw[line width=3em,gray] (0,0) circle[x radius=3em,y radius=1.2em];
\draw[blue,postaction={decorate,decoration={markings,
mark=at position {\X} with {\draw[orange] (-1,0) -- (1,0);
\draw[red,|<->|] (0,1.5em) -- (0,-1.5em);}}}](0,0) circle[x radius=3em,y radius=1.2em];
\end{tikzpicture}}
\end{document}