在TeXbook(第 10 章,练习 10.3 之后),DEK 展示了一些不错的尺子。但我不知道他是如何做到的。我确信我可以从教科书来源中查找,但出于某种原因,我不知道可能在哪里找到它。
所以问题是:你如何排版标尺(我假设它们是某种形式的\leaders
)?
答案1
没有那么复杂\leaders
,但仍然很聪明。相关来源是
$$ \abovedisplayskip 15pt plus 4pt minus 4pt
\belowdisplayskip 15pt plus 4pt minus 4pt
\vbox{
\def\1{\vrule height 0pt depth 2pt}
\def\2{\vrule height 0pt depth 4pt}
\def\3{\vrule height 0pt depth 6pt}
\def\4{\vrule height 0pt depth 8pt}
\def\ruler#1#2#3{\leftline{$\vcenter{\hrule\hbox{\4#1}}\,\,\rm#2\,{#3}$}}
\def\\#1{\hbox to .125in{\hfil#1}}
\def\8{\\\1\\\2\\\1\\\3\\\1\\\2\\\1\\\4}
\ruler{\8\8\8\8}4{in}
\vskip 18pt
\def\\#1{\hbox to 10pt{\hfil#1}}
\def\8{\\\1\\\1\\\1\\\1\\\2\\\1\\\1\\\1\\\1\\\4}
\ruler{\8\8\8}{300}{pt}
\vskip 18pt
\def\\#1{\hbox to 10dd{\hfil#1}}
\def\8{\\\1\\\1\\\1\\\1\\\2\\\1\\\1\\\1\\\1\\\4}
\ruler{\8\8\8}{300}{dd}
\vskip 18pt
\def\\#1{\hbox to 5mm{\hfil#1}}
\def\8{\\\2\\\4}
\ruler{\8\8\8\8\8\8\8\8\8\8}{10}{cm}
\vskip 6pt}$$
因此,标尺由一系列垂直规则定义(给定名称\1
,,\2
ETC)、一条水平线和一些拉伸。
答案2
这是带有 10 个单位的更简单的标尺。代码依赖于\hbox to <dimension>
标尺的整体尺寸,并用于\hfil
均匀分布标尺刻度。\morebars
宏添加了 5 个单位,但缺少必须明确提供的第一个垂直刻度。当您想要显示单位时,事情显然变得更加复杂。(这里使用的想法也可用于通过在顶部放置附加规则来创建一系列框。)
\documentclass{minimal}
\def\bars#1{\hbox to #1{\vrule width0pt height 1mm depth 2mm%
\vrule\morebars\morebars}}
\def\morebars{\hfil\vrule\hfil\vrule\hfil\vrule\hfil\vrule\hfil\vrule}
\def\ruler#1{\vbox{\bars{#1}\hrule}}
\begin{document}
\ruler{10cm}
\ruler{5cm}
\end{document}
排版此文档会产生两条标尺,宽度分别为 5 厘米和 10 厘米,每条标尺有 10 个单位:
答案3
我没有 TeXbook,但根据 Christian Lindig 的解决方案,我将按照以下方式在 ConTeXt 中实现命令:使用 Metapost!
\definenamespace
[ruler]
[name=ruler,
setup=yes,
command=yes,
parent=ruler]
\def\useruler
{\dodoubleempty\douseruler}
\starttexdefinition douseruler [#1][#2]
\begingroup
% To keep options local
\edef\currentruler{#1}
\setupruler[#1][#2]
\useMPgraphic{ruler}
\endgroup
\stoptexdefinition
\startuseMPgraphic{ruler}
begingroup ;
newpath x_axis ;
newpath y_axis ;
newnumeric n, width, height ;
n := \rulerparameter{n} ;
width := \rulerparameter{width} ;
height := \rulerparameter{height} ;
x_axis := origin -- (n*width, 0) ;
y_axis := origin -- (0, height) ;
for i = 0 upto n:
draw y_axis shifted (i*width,0) withcolor \MPcolor{\rulerparameter{color}} ;
endfor
draw x_axis withcolor \MPcolor{\rulerparameter{color}} ;
endgroup ;
\stopuseMPgraphic
代码稍微冗长一些,以便于阅读。\definenamespace
定义两个命令,\defineruler
和\setupruler
。\defineruler[name][options]
用于定义新标尺,其中name
是标尺的名称, 和options
是键值选项。\setupruler
设置所有标尺的默认值。我选择了三个选项,n
分别为标记数量、width
标记之间的距离和height
每个标记的高度。这可以用作
\setupruler[color=blue]
\defineruler[normal][n=5,width=1cm,height=0.2cm]
\defineruler[small] [n=5,width=0.5cm,height=0.2cm]
\starttext
\useruler[normal]
\useruler[normal][color=red]
\useruler[small]
\stoptext
\useruler[name]
只绘制具有特定名称的规则。\useruler[name][options]
使用这些选项绘制标尺。结果如下。