如何在单独的框中对齐文本,以避免出现如下结果:由于部分字符延伸到基线以下而导致第二个单词向上移动?
这是我的 MWE:
\documentclass{article}
\usepackage{tikz}
\pagestyle{empty}
\usepackage{geometry}
\usepackage{xcolor}
\usetikzlibrary{positioning,calc}
\geometry{papersize={85mm, 15mm}}
\begin{document}
\newcommand\textbox[5]{
\begin{tikzpicture}[remember picture,overlay]
\filldraw [fill=black, draw=black, line width=0.3mm]
($(current page.south west)+(#1,#2)$) rectangle
($(current page.south west)+(#3,#4)$)
node[pos=0.5] {\color{white}#5};
\end{tikzpicture}}
\textbox{10.0mm}{5mm}{40.0mm}{10.0mm}{\bf{Levels}}
\textbox{45.0mm}{5mm}{75.0mm}{10.0mm}{\bf{Gauging}}
\end{document}
我知道有争论yshift
,但我不知道如何让这项工作依赖于文本的基线。也许那个论点甚至不是正确的选择。
编辑后显示:“Levels”一词的位置看起来很自然,“Gauging”应该处于同一水平,这意味着 g 可以向底部突出。
答案1
首先,大卫·卡莱尔说,你不应该\bf
在 LaTeX 中使用(另外,它不需要参数,这就是 Leslie Lamport 所说的宣言:它对当前 TeX 组中后面的内容起作用)。我font=\normalfont\bfseries
在节点选项中将其替换为。
你有不同深度的文本,但你大概希望黑色矩形具有完全相同的高度。因为你在一条评论Levels
您希望垂直放置与没有降部的 相同,我建议忽略传递给\textbox
宏的文本的深度。这可以通过 Ti钾Z 选项或使用 (La)TeX 提供的框操作命令。
钛钾Zy 方式
使用 Ti钾黑色矩形的 Z 节点
在这里,我们使用 Ti钾具有形状的 Z 节点rectangle
用于绘制每个文本以及其后面的黑色矩形(在您的解决方案中,黑色矩形是用rectangle
手术,而不是节点)。为了代码的整洁和可读性,我们定义了一个 Ti钾Z 样式my special node
包含这些特殊节点所需的所有选项。与您的问题相关的此样式中最重要的选项是:
text depth=0pt
为了在计算节点尺寸时忽略节点内容的深度;anchor=south west
通过给出节点左下角的坐标来放置节点;font=\normalfont\bfseries
选择字体;minimum width
并且minimum height
矩形的宽度和高度至少与\textbox
宏的参数所要求的一样高;inner sep=0pt
确保不会在节点内部、其内容周围自动添加更多空间(如果值较大,节点内容即使不接触其边框也可能会“推动”其边框;这在某种程度上是可取的,但如果节点的内容高于其他节点的内容,也可能很容易导致节点高度不同)。
您实际上不需要line width=0.3mm
(您可以使用0pt
),也不需要节点使用的和-0.5\pgflinewidth
金额。我包括它们的唯一原因是提供一个xshift
yshift
完全符合使用您的示例(针对line width
)和下面给出的 TeXnical 方法。使用以下代码,Ti钾根本不需要Zcalc
和库。positioning
\documentclass{article}
\usepackage[papersize={85mm, 15mm}]{geometry}
\usepackage{xcolor}
\usepackage{tikz}
\pagestyle{empty}
\tikzset{
my special node/.style n args={4}{
line width=0.3mm, draw=black, fill=black, text=white,
inner sep=0pt, text depth=0pt, anchor=south west, font=\normalfont\bfseries,
minimum width={(#3)-(#1)}, minimum height={(#4)-(#2)},
}
}
\begin{document}
\newcommand{\textbox}[5]{%
\begin{tikzpicture}[remember picture, overlay]
\node[my special node={#1}{#2}{#3}{#4}]
at ([xshift={(#1)-0.5\pgflinewidth}, yshift={(#2)-0.5\pgflinewidth}]%
current page.south west) {#5};
\end{tikzpicture}%
}
\textbox{10.0mm}{5mm}{40.0mm}{10.0mm}{Levels}
\textbox{45.0mm}{5mm}{75.0mm}{10.0mm}{Gauging}
\end{document}
裁剪截图:
证明两段文本有相同的基线:
当你的矩形是 Ti 时,有一件好事钾Z 节点是可以使用许多 Ti钾Z 工具与它们配合使用:命名节点、相对于其他节点放置节点、连接节点、放置阴影等。例如,使用上面的代码,您只需添加节点\usetikzlibrary{shadows}
选项drop shadow
即可获得:
使用rectangle
操作
@Schrödinger'scat 提出了另一个不错的 Ti钾Zy 解决方案非常接近您的代码,并且产生的输出与我上面和下面给出的两种方法完全相同。此方法使用操作rectangle
绘制黑色矩形,而不是填充包含第五个参数中的文本的矩形节点\textbox
。
\documentclass{article}
\usepackage[papersize={85mm, 15mm}]{geometry}
\usepackage{xcolor}
\usepackage{tikz}
\pagestyle{empty}
\begin{document}
\newcommand*{\textbox}[5]{%
\begin{tikzpicture}[remember picture, overlay]
\filldraw [fill=black, draw=black, line width=0.3mm]
(current page.south west)+(#1,#2) rectangle +(#3,#4)
node[pos=0.5, font=\normalfont\bfseries, text depth=0pt, text=white] {#5};
\end{tikzpicture}%
}
\textbox{10.0mm}{5mm}{40.0mm}{10.0mm}{Levels}
\textbox{45.0mm}{5mm}{75.0mm}{10.0mm}{Gauging}
\end{document}
输出与上面完全相同。
技术方法
这里,我们没有使用text depth=0pt
包含带框文本的节点,而是使用一个简短的宏,将其参数放在一个框中,将框深度设置为零并输出该框。这意味着 TeX 将在确定 Ti 的垂直范围时忽略参数的深度钾Z 节点内容。
\documentclass{article}
\usepackage[papersize={85mm, 15mm}]{geometry}
\usepackage{xcolor}
\usepackage{tikz}
\usetikzlibrary{calc}
\pagestyle{empty}
\newsavebox{\mybox}
\newcommand*{\killboxdepth}[1]{%
\sbox{\mybox}{#1}%
\dp\mybox=0pt \box\mybox
}
\begin{document}
\newcommand*{\textbox}[5]{%
\begin{tikzpicture}[remember picture, overlay]
\filldraw [fill=black, draw=black, line width=0.3mm]
($(current page.south west)+(#1,#2)$) rectangle
($(current page.south west)+(#3,#4)$)
node[pos=0.5, font=\normalfont\bfseries] {\color{white}\killboxdepth{#5}};
\end{tikzpicture}%
}
\textbox{10.0mm}{5mm}{40.0mm}{10.0mm}{Levels}
\textbox{45.0mm}{5mm}{75.0mm}{10.0mm}{Gauging}
\end{document}
输出与 Ti 完全相同钾Zy 方式。
注意:另一种定义方法\killboxdepth
如下:
\newcommand{\killboxdepth}{%
\raisebox{0pt}[\height][0pt]%
}
\dp
这比使用和命令(它们是 TeX 基元)更像 LaTeX \box
。正如 @barbarabeeton 指出的那样,另一种方法(假设amsmath
已加载)是使用\smash[b]
而不是\killboxdepth
(那么此宏就没有必要了)。肯定有多种方法可以做到这一点!