如何制作尺子

如何制作尺子

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,,\2ETC)、一条水平线和一些拉伸。

答案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]使用这些选项绘制标尺。结果如下。

在此处输入图片描述

相关内容