钛钾Zy 方式

钛钾Zy 方式

如何在单独的框中对齐文本,以避免出现如下结果:由于部分字符延伸到基线以下而导致第二个单词向上移动?

在此处输入图片描述

这是我的 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宏的文本的深度。这可以通过 TiZ 选项或使用 (La)TeX 提供的框操作命令。

Zy 方式

使用 Ti黑色矩形的 Z 节点

在这里,我们使用 Ti具有形状的 Z 节点rectangle用于绘制每个文本以及其后面的黑色矩形(在您的解决方案中,黑色矩形是用rectangle 手术,而不是节点)。为了代码的整洁和可读性,我们定义了一个 TiZ 样式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金额。我包括它们的唯一原因是提供一个xshiftyshift完全符合使用您的示例(针对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 节点是可以使用许多 TiZ 工具与它们配合使用:命名节点、相对于其他节点放置节点、连接节点、放置阴影等。例如,使用上面的代码,您只需添加节点\usetikzlibrary{shadows}选项drop shadow即可获得:

带有“阴影”的示例

使用rectangle操作

@Schrödinger'scat 提出了另一个不错的 TiZy 解决方案非常接近您的代码,并且产生的输出与我上面和下面给出的两种方法完全相同。此方法使用操作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(那么此宏就没有必要了)。肯定有多种方法可以做到这一点!

相关内容