我正在尝试创建一个包含以下显示计数器的新环境(至少是类似的内容):
\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 sep
为0pt
。
包装器
最后一步是定义一个设置两个节点的新宏。该宏应接受保存练习编号的参数。它所要做的就是构建一个{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
在这里很有用。