矩形节点上的文本

矩形节点上的文本

我正在尝试创建一个包含以下显示计数器的新环境(至少是类似的内容):

\documentclass[letterpaper]{article}
\usepackage{amsmath,amssymb}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\node[draw, rounded corners=1pt,fill,text=white] at (0,0) {\large 9} node at +(0,0.35) {\footnotesize\sc practice};
\end{tikzpicture}
\end{document}

在此处输入图片描述

我的问题是如何将单词放在PRACTICE带框节点的正上方(在合理的高度),以便该节点与单词的宽度相同PRACTICE。节点最终将是一个方框。当然,数字 9 将是一个计数器,其大小将根据显示器的美观度来确定,我将在稍后对其进行设置。我正在寻找一种简单的方法来做到这一点。我现在正在考虑在 for 中定义一个长度\settolength{PRACTICE}

答案1

这样吧。我在代码中添加了一些解释。如果某行不清楚,你可以询问详细信息 :-)

数字框

代码

\documentclass{article}

% load TikZ and the required library package
\usepackage{tikz}
\usetikzlibrary{positioning}
% load lmodern to get free scalable fonts
\usepackage{lmodern}

% define the label, it's font and mesure it's length
\newcommand{\practicename}{practice}
\newcommand{\practicelabelfont}{\footnotesize\scshape}
\newlength{\practicelabellength}
\settowidth{\practicelabellength}{\practicelabelfont\practicename}

% define the number font size according to the label
\newlength{\practicenumsize}
\setlength{\practicenumsize}{\practicelabellength}
\addtolength{\practicenumsize}{-10pt}
\newcommand{\practicenumfont}{%
    \fontsize{\practicenumsize}{\practicenumsize}\selectfont
    \sffamily\bfseries
}

% define TikZ styles for the number and the label
\tikzset{
    practice num/.style={
        name=PRACTICE NUM NODE,
        minimum size=\practicelabellength,
        font=\practicenumfont,
        fill=black,
        text=white,
        outer sep=0pt,
        inner sep=0pt,
        rounded corners=2pt,
    },
    practice label/.style={
        font=\practicelabelfont,
        inner sep=0pt,
        outer sep=0pt,
        above=2pt of PRACTICE NUM NODE,% change the distance between
                                       % the box and the lable here
    },
}

% define a command that prints one argument in the box
\newcommand{\practice}[1]{
    \begin{tikzpicture}
        \node [practice num] {#1};
        \node [practice label] {\practicename};
    \end{tikzpicture}
}

\begin{document}
    \noindent
    It'll only work with numbers from 0 to 99:\\[\baselineskip]
    \practice{9}\quad\practice{99}\quad\practice{999}
\end{document}

要将可能的范围增加到 999,您可以增加标签字体大小或减小数字字体大小。

一些解释

标签、字体和加长

我们要做的第一件事是设置一些 TeX 宏,这样更改起来就容易多了。当然,我们可以在 TikZ 图片中包含所有细小部分,但我更喜欢将内容分成更小的部分,并批准更多行代码。因此,将标签定义为名为 的宏\practicename

\newcommand{\practicename}{practice}

为其设置字体\practicelabelfont

\newcommand{\practicelabelfont}{\footnotesize\scshape}

并测量它的宽度\practicelablewidth

\newlength{\practicelabellength}
\settowidth{\practicelabellength}{\practicelabelfont\practicename}

下一步是设置数字字体\practicenumfont。为了使字体大小取决于标签宽度,我们将新长度设置\practicenumsize为标签宽度并将其减少 10 pt:

\newlength{\practicenumsize}
\setlength{\practicenumsize}{\practicelabellength}
\addtolength{\practicenumsize}{-10pt}

有了这个长度,我们可以使用 来设置字体大小\fontsize{<size>}{<baselineskip>}。由于这是一个基本的字体命令,因此有必要启用它与\selectfont

\newcommand{\practicenumfont}{%
    \fontsize{\practicenumsize}{\practicenumsize}\selectfont
    \sffamily\bfseries
}

样式

现在我们定义两个 TikZ 样式。一个用于标签,另一个用于数字。我们使用\tikzset,它可以完成 TikZ 的所有设置。要创建新样式,必须使用语法<name>/.style={<options>}。我们定义样式来设置字体和节点大小/形状/填充。此外,我们为数字节点定义一个名称

name=PRACTICE NUM NODE,

这基本上相当于我们说

\node (PRACTICE NUM NODE) [<options>] {<num>};

稍后在代码中。但我们可以确保这个名称是唯一的,并且始终引用正确的节点,即最后指定的节点。我们知道数字节点将始终具有名称,PRACTICE NUM NODE因此我们可以将标签的位置设置为其样式的一部分

above=2pt of PRACTICE NUM NODE,

现在标签将精确地居中在数字节点上方 2 pt 处。我们并未将所有outer和设置inner sep0pt

包装器

最后一步是定义一个设置两个节点的新宏。该宏应接受保存练习编号的参数。它所要做的就是构建一个{tikzpicture}具有两个正确样式和正确内容的节点,即#1数字节点和\practicename标签节点的预定义节点。

\newcommand{\practice}[1]{
    \begin{tikzpicture}
        \node [practice num] {#1};
        \node [practice label] {\practicename};
    \end{tikzpicture}
}

用法

准备好后,我们可以使用 \practice{} 打印练习号码。假设我们设置了一个计数器,practice保存正确的号码,我们将调用

\practice{\thepractice}

答案2

您可以使用 TikZ 的calc库来用“练习”来测量节点,并根据数字调整第二个节点的大小。

\documentclass{article}

\usepackage[T1]{fontenc}
\usepackage{lmodern}

\usepackage{tikz}
\usetikzlibrary{calc}

\newcounter{practice}

% define a command that prints one argument in the box
\newcommand{\practice}{%
    \refstepcounter{practice}%
    \begin{tikzpicture}
        \node [inner sep=0pt,outer sep=0pt] (practice) {\footnotesize\textsc{practice}};
        \path let \p1 = (practice.north west), \p2 = (practice.north east) in
            node [minimum size=\x2-\x1,fill=black,text=white,rounded corners,anchor=north]
                at ([yshift=-2pt]practice.south) {\bfseries\sffamily\Huge\thepractice};
    \end{tikzpicture}%
}

\begin{document}

\practice

\clearpage

\practice

\clearpage

\practice

\clearpage
\setcounter{practice}{8}

\practice

\clearpage

\practice

\clearpage
\setcounter{practice}{98}

\practice

\clearpage

\practice

\end{document}

结果

此处选择的数字大小适用于最大 99 的数字。如果您需要更多,请将其缩小到 100 仍可容纳,或者添加一些代码来调整更大数字的大小。包\maxsizebox中的宏adjustbox在这里很有用。

相关内容