[plain tex] comment produire une règle graduée?

Dans le TeXbook, à l’exercice 10.4, on cherche à produire une règle graduée.

La solution proposée est la suivante.

:scissors:--------------------------------------------
\def\tick#1{\vrule height 0pt depth#1pt}
\def\{\hbox to 1cm{\hfil\tick4\hfil\tick8}}
\vbox{\hrule\hbox{\tick8\\\\\\\\\\}}
:scissors:--------------------------------------------

Cette solution fonctionne contrairement à la mienne (voir ci-dessous).
En effet, on peut constater que la règle est partiellement produite.

:scissors:--------------------------------------------
\def\tick#1{\vrule height 0pt depth#1pt}
\setbox1=\hbox to 1cm{\tick8\hfil\tick4\hfil}
\vbox{\hrule\hbox to 10cm{\leaders\copy1\hfil\tick8}}
:scissors:--------------------------------------------

Pourquoi n’obtient-on pas le bon résultat ?

Cordialement,
Kevin Vigouroux

Bonjour,

:scissors:--------------------------------------------
\def\tick#1{\vrule height 0pt depth#1pt}
\setbox1=\hbox to 1cm{\tick8\hfil\tick4\hfil}
\vbox{\hrule\hbox to 10cm{\leaders\copy1\hfil\tick8}}
:scissors:--------------------------------------------

Pourquoi n’obtient-on pas le bon résultat ?

Parce que la \hbox de 10cm ne peut pas contenir 10 fois la \hbox de 1cm
plus le dernier \tick8, qui a une largeur non nulle. Donc la \hbox de
1cm n’est incluse que 9 fois.

Une solution est de “partager” le grand trait entre le début et la fin
de la \hbox de 1cm :
:scissors:--------------------------------------------
\def\tick#1{\vrule height 0pt depth#1pt width 0.2pt}
\setbox1=\hbox to 1cm{\tick8\hfil\tick4\tick4\hfil\tick8}
\vbox{\hrule\hbox to 10cm{\leaders\copy1\hfil}}
:scissors:--------------------------------------------

Mais dans ce cas, bien sûr, le premier et le dernier traits sont moins
larges que les autres.


Nico

Nicolas Markey xyz@xyz.tld writes:

Bonjour,

:scissors:--------------------------------------------
\def\tick#1{\vrule height 0pt depth#1pt}
\setbox1=\hbox to 1cm{\tick8\hfil\tick4\hfil}
\vbox{\hrule\hbox to 10cm{\leaders\copy1\hfil\tick8}}
:scissors:--------------------------------------------

Pourquoi n’obtient-on pas le bon résultat ?

Parce que la \hbox de 10cm ne peut pas contenir 10 fois la \hbox de 1cm
plus le dernier \tick8, qui a une largeur non nulle. Donc la \hbox de
1cm n’est incluse que 9 fois.

Oui, effectivement.

Une solution est de “partager” le grand trait entre le début et la fin
de la \hbox de 1cm :
:scissors:--------------------------------------------
\def\tick#1{\vrule height 0pt depth#1pt width 0.2pt}
\setbox1=\hbox to 1cm{\tick8\hfil\tick4\tick4\hfil\tick8}
\vbox{\hrule\hbox to 10cm{\leaders\copy1\hfil}}
:scissors:--------------------------------------------

Mais dans ce cas, bien sûr, le premier et le dernier traits sont moins
larges que les autres.

Une solution plus naturelle serait de faire un retour-arrière.
:scissors:--------------------------------------------
\def\tick#1{\vrule height 0pt depth#1pt}
\setbox1=\hbox to 1cm{\tick8\hfil\tick4\hfil}
\vbox{\hrule\hbox to 10cm{\leaders\copy1\hfil\hskip-0.4pt\tick8}}
:scissors:--------------------------------------------

Cordialement,
Kevin Vigouroux